什么是监听器?
-
一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行
-
由于Servlet技术存在三个数据域范围:ServletContext 、HttpSession、ServletRequest,所以Servlet监听器主要监听上面三个域对象的创建和销毁、属性变更以及状态变化
-
Servlet监听器分类:
-
三个域范围对象创建和销毁监听器
ServletContextListener
HttpSessionListener
ServletRequestListener
-
三个域范围对象属性变更监听器
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
-
HttpSession范围中对象的自我状态感知监听器
HttpSessionBindingListener
HttpSessionActivationListener
-
javaweb监听器创建步骤
- 创建一个类,实现指定的监听器接口
- 重写接口中的方法.
- 在web.xml文件中配置监听
域对象创建和销毁监听器
ServletContextListener
-
可以使用注解,可以在web.xml中配置
-
监听 ServletContext 对象的创建和销毁
-
ServletContext对象生命周期
-
服务器启动时创建,服务器正常关闭时销毁
-
-
ServletContextListener 企业应用
-
保存全局唯一数据对象,获得ServletContext
-
加载框架配置文件 spring
-
启动定时器(固定时间需要自动运行程序)
-
HttpSessionListener
-
可以使用注解,可以在web.xml中配置
-
监听session对象创建和销毁
-
Session的生命周期
-
Session的创建 :request.getSession();
-
Session的销毁 :服务器非正常关闭、session超时(配置web.xml setMaxInactiveInterval)、session.invalidate
-
-
tomcat对session保存数据,默认是在正常关闭服务器时,将session中数据序列化硬盘上
ServletRequestListener
-
可以使用注解,可以在web.xml中配置
-
监听request对象创建销毁
-
request的生命周期
-
request创建 :客户端提交请求时
-
request销毁 ;响应结束时
-
域对象属性变更监听器
-
可以使用注解,可以在web.xml中配置
-
Servlet规范定义了监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器
-
ServletContextAttributeListener
-
HttpSessionAttributeListener
-
ServletRequestAttributeListener
-
-
这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同
-
attributeAdded() : 某个属性被添加时,web容器调用事件监听器的这个方法进行相应
-
attributeRemoved() : 某个属性被移除时,web容器调用事件监听器的这个方法进行相应
-
attributeReplaced() : 某个属性被替换时,web容器调用事件监听器的这个方法进行相应
-
HttpSession中对象状态感知监听器
-
无需配置注解,或在web.xml中配置
-
HttpSession中对象的状态
-
将对象保存在Session中
-
将对象从session中移除
-
当一个对象长时间存在Session中,而Session没有使用,将Session对象数据序列化硬盘(钝化)
-
当使用一个已经钝化对象,需要从硬盘上将对象加载到内存(活化)
-
HttpSessionBindingListener
-
负责绑定和解除绑定的监听
-
如果一个对象已经在session存在中,再次存入时,会触发一次绑定和一次解除绑定
HttpSessionActivationListener
-
负责钝化和活化的监听
示例代码
-
在当前工程 WebRoot/META-INF/context.xml文件中配置以下内容
实现对应的JavaBean.需要特别注意对应的JavaBean需要实现Serializable接口,否则是无法序列化到本地的.
public class User implements HttpSessionActivationListener, Serializable { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } // 如果该类没有实现Serializable接口,将无法序列化到本地硬盘 // 当活化时,也无法读取到对应的数据 public void sessionDidActivate(HttpSessionEvent se) { System.out.println("对象被活化了"); } public void sessionWillPassivate(HttpSessionEvent se) { System.out.println("对象被钝化了"); }}