简介

JavaWeb中的监听器是Servlet规范中定义的一种特殊类,它用于监听web应用程序中的ServletContext、HttpSession和 ServletRequest这三大域对象的创建、销毁事件以及监听这些域对象中的属性发生修改的事件。

监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。

相关概念

  事件源:即谁产生的事件
  事件对象:即产生了什么事件
  监听器:监听事件源的动作

监听对象

在Servlet规范中定义了多种类型的监听器(一共8个监听器),它们用于监听的事件源分别为ServletContext,HttpSession和ServletRequest这三个域对象。Servlet规范针对这三个对象上的操作,又把多种类型的监听器划分为三种类型:

1.域对象的生命周期监听:监听域对象自身的创建和销毁。这个监听器需要实现相应的监听器接口:ServletContextListener、HttpSessionListener、ServletRequestListener。

2.域对象的属性监听:监听域对象中属性的增加和删除。这个监听器需要实现的监听器接口为:ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener。

3.感知监听(都与HttpSession域对象有关):

  绑定和解绑:监听绑定到HttpSession域中的某个JavaBean对象的状态的监听器以及解绑。这个监听器需要实现的监听器接口:HttpSessionBindingListener。

  钝化和活化:监听JaveBean对象随HttpSession序列化到硬盘上(正常关闭服务器,session会钝化到硬盘上)以及从硬盘反序列化到内存中。这个监听器需要实现的监听器接口:HttpSessionActiveationListener、Serializable。

示例:

域对象的生命周期监听

监听request的创建和销毁:

public class MyRequestListener implements ServletRequestListener {

    //创建
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("监听新的request对象被创建了...");
}
//销毁
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("监听request对象被销毁了...");
} }

监听session的创建和销毁:

public class MySessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent se)  {
// Event 事件: 通过事件对象可以获取被监听对象的引用
HttpSession session = se.getSession();
System.out.println(session.getId() + "对应的session被创建了**** **** ");
} public void sessionDestroyed(HttpSessionEvent se) {
HttpSession session = se.getSession();
System.out.println(session.getId() + "对应的session被销毁了**** **** ");
} }

监听context的创建和销毁:

public class MyServletContextListner implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce)  {
System.out.println("--------------------------- 监听到项目被创建了....");
} public void contextDestroyed(ServletContextEvent sce) {
System.out.println("*********************** 监听到项目被销毁了....");
} }

域对象属性变化监听

以request为例:

public class MyRequestAttrChangeListener implements ServletRequestAttributeListener {

    public void attributeAdded(ServletRequestAttributeEvent srae) {
// 属性 = 属性名 + 属性值
// 1 获取属性名
String name = srae.getName();
// 2 获取属性值:
// 2.1 获取事件源对象, 指request对象
ServletRequest request = srae.getServletRequest();
Object value = request.getAttribute(name); System.out.println("*****request 增加属性: " + name + " = " + value);
} public void attributeReplaced(ServletRequestAttributeEvent srae) {
// 1 获取属性名
String name = srae.getName();
// 2 获取属性值:
// 2.1 获取事件源对象, 指request对象
ServletRequest request = srae.getServletRequest();
Object newValue = request.getAttribute(name);
// 2.2 获取原来的值
Object oldValue = srae.getValue(); System.out.println("***** ***** *****request 修改属性 属性名: " + name);
System.out.println("***** ***** *****request 修改属性 新的属性值: " + newValue);
System.out.println("***** ***** *****request 修改属性 旧的属性值: " + oldValue);
} public void attributeRemoved(ServletRequestAttributeEvent srae) {
// 1 获取属性名
String name = srae.getName(); System.out.println("***** ***** *****request 删除属性 : " + name);
} }

感知监听

绑定和解绑:

public class User1 implements HttpSessionBindingListener {
private int id;
private String name;
private int age; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User1 [id=" + id + ", name=" + name + ", age=" + age + "]";
} @Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println(this + "感知自己被放到 session中------------------绑定");
} @Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println(this + "感知自己从 session中移除 -----------------解绑");
} }

钝化和活化:

public class User2 implements HttpSessionActivationListener, Serializable {
private String nickname;
private String city; public String getNickname() {
return nickname;
} public void setNickname(String nickname) {
this.nickname = nickname;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Override
public String toString() {
return "User2 [nickname=" + nickname + ", city=" + city + "]";
} @Override
public void sessionDidActivate(HttpSessionEvent se) {
System.out.println(this + "随session活化到内存中 .........");
} @Override
public void sessionWillPassivate(HttpSessionEvent se) {
System.out.println(this + "随session钝化到硬盘上..........");
} }

由于idea的运行机制问题(重启tomcat的话,会删除tomcat文件夹内的work文件夹再重新创建(同时也就删除了文件夹内的序列化到硬盘上的SESSIONS.SAR文件)),上面这个示例不能被活化到内存中。

java Web 监听器Listener详解的更多相关文章

  1. java web.xml配置详解(转)

    源出处:java web.xml配置详解 1.常规配置:每一个站的WEB-INF下都有一个web.xml的设定文件,它提供了我们站台的配置设定. web.xml定义: .站台的名称和说明 .针对环境参 ...

  2. 《Tomcat与Java Web开发技术详解》思维导图

    越想构建上层建筑,就越觉得底层基础很重要.补课系列. 书是良心书,就是太基础了,正适合补课. [纯文字版] Tomcat与Java Web开发技术详解 Servlet Servlet的生命周期 初始化 ...

  3. java web之Filter详解

    java web之Filter详解 2012-10-20 0 个评论 作者:chenshufei2 收藏 我要投稿 .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,W ...

  4. Java web.xml 配置详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  5. java web.xml配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  6. Java Web(一) Servlet详解!!

    这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本个人觉得很棒的书,<Java Web 整合开发王者归来>,现在写的这一系列基 ...

  7. (转)Java Web(一) Servlet详解!!

    https://www.cnblogs.com/whgk/p/6399262.html 这篇文章到上一篇,距离的有点遥远呀,隔了大概有两个月把,中间在家过了个年,哈哈~ 现在重新开始拾起,最近在看一本 ...

  8. Servlet 监听器Listener详解

    转自:http://blog.csdn.net/u012228718/article/details/41730799 一.简介 (一)概述 1.Listener 用于监听 Javaweb程序中的事件 ...

  9. Java Web开发之详解JSP

    JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面.Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用, ...

随机推荐

  1. selenium webdriver入门

    写在前面:最近在研究UI自动化测试的过程中,发现公司里通常用的是AutomanX框架,而这个框架实际上是基于selenium webdriver框架的,所以在编写测试用例时,很多语法都是直接使用sel ...

  2. Head First HTML与CSS 学习笔记

    1.使用<a>元素创建一个超文本链接,链接到另一个Web页面.<a>元素的内容会成为Web页面中可单击的文本.href属性告诉浏览器链接的目标文件. 2.块元素特立独行,内联元 ...

  3. Java 实现--时间片轮转 RR 进程调度算法

    时间片轮转(Round-Robin)调度算法是操作系统一种比较公平的进程调度的方式,这种方式使得就绪队列上的所有进程在每次轮转时都可以运行相同的一个时间片. 基本原理 算法实现原理是,按进程到达顺序( ...

  4. bzoj 4472 salesman

    Written with StackEdit. Description 某售货员小\(T\) 要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. ...

  5. 调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type

    调试SPRING MVC(或者整合SSH)的时候遇到了org/objectweb/asm/Type 解决方法1: 原因是Spring中的cglib-nodep-2.x.x.jar与Hibernate中 ...

  6. 洛谷P1119 灾后重建

    传送门 题目大意:点被破坏,t[i]为第i个点修好的时间,且t[1]<t[2]<t[3].. 若干询问,按时间排序,询问第t时刻,u,v的最短路径长度. 题解:floyed 根据时间加入点 ...

  7. WPF 自定义DateControl DateTime控件(转)

    自定义日期控件,月份选择.如下是日期的一些效果图. 具体的样式.颜色可以根据下面的代码,自己调节即可    1.日期控件的界面 <UserControl x:Class="WpfApp ...

  8. Android Studio 打包及引用 AAR(可能是史上最详细的 )

    https://www.jianshu.com/p/1777a634db5e Android Library(AAR) 的好处 Android 库在结构上与 Android 应用模块相同.它可以提供构 ...

  9. unidac使用演示

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  10. 织梦 dede 笔记

    将项目转移到另一服务器 方法: https://www.genban.org/news/dedecms-13096.html 在实际中,我走的是第二种方法 方法一: 1  后台>系统>备份 ...