一、概述
监听器:专门用于对域对象对象身上发生的事件或状态改变进行监听和相应处理的对象
监听器是GOF设计模式中,观察者模式的典型案例
观察者模式: 当被观察的对象发生某些改变时, 观察者自动采取对应的行动的一种设计模式
监听器并不监听web项目中的所有组件,仅仅是对三大域对象做相关的事件监听
二、监听器的分类
+ web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类
+ 按监听的对象划分
+ application域监听器 ServletContextListener ServletContextAttributeListener
+ session域监听器 HttpSessionListener HttpSessionAttributeListener HttpSessionBindingListener HttpSessionActivationListener
+ request域监听器 ServletRequestListener ServletRequestAttributeListener
三、三种对象域的监听器
(1)应用域
@WebListener
public class myApplicationListener implements ServletContextListener, ServletContextAttributeListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext application = sce.getServletContext();
System.out.println(application.hashCode()+"应用域初始化了");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
ServletContext application = sce.getServletContext();
System.out.println(application.hashCode()+"应用域销毁了");
}
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
ServletContext servletContext = scae.getServletContext();
String name = scae.getName();
Object value = scae.getValue();
System.out.println(servletContext.hashCode()+"应用域增加了"+name+":"+value);
}
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
ServletContext servletContext = scae.getServletContext();
String name = scae.getName();
Object value = scae.getValue();
System.out.println(servletContext.hashCode()+"应用域销毁了"+name+":"+value);
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
ServletContext servletContext = scae.getServletContext();
String name = scae.getName();
Object value = scae.getValue();
Object newAttribute = servletContext.getAttribute(name);
System.out.println(servletContext.hashCode()+"应用域改变了"+name+":"+value);
}
}
(2)会话域
session绑定监听器
> HttpSessionBindingListener 监听当前监听器对象在Session域中的增加与移除
| 方法名 | 作用 |
| ------------------------------------------- | --------------------------------- |
| valueBound(HttpSessionBindingEvent event) | 该类的实例被放到Session域中时调用 |
| valueUnbound(HttpSessionBindingEvent event) | 该类的实例从Session中移除时调用 |
+ HttpSessionBindingEvent对象代表属性变化事件,它包含的方法如下:
| 方法名 | 作用 |
| ------------ | ----------------------------- |
| getName() | 获取当前事件涉及的属性名 |
| getValue() | 获取当前事件涉及的属性值 |
| getSession() | 获取触发事件的HttpSession对象 |
钝化活化监听器
> HttpSessionActivationListener 监听某个对象在Session中的序列化与反序列化。
| 方法名 | 作用 |
| ----------------------------------------- | ------------------------------------- |
| sessionWillPassivate(HttpSessionEvent se) | 该类实例和Session一起钝化到硬盘时调用 |
| sessionDidActivate(HttpSessionEvent se) | 该类实例和Session一起活化到内存时调用 |
+ HttpSessionEvent对象代表事件对象,通过getSession()方法获取事件涉及的HttpSession对象。
什么是钝化活化
+ 在关闭服务器前或者到达了设定时间时,对session进行序列化到磁盘,这种情况叫做session的钝化
+ 在服务器启动后或者再次获取某个session时,将磁盘上的session进行反序列化到内存,这种情况叫做session的活化
(3)请求域
> ServletRequestListener 监听ServletRequest对象的创建与销毁
| 方法名 | 作用 |
| ------------------------------------------- | ---------------------------- |
| requestInitialized(ServletRequestEvent sre) | ServletRequest对象创建时调用 |
| requestDestroyed(ServletRequestEvent sre) | ServletRequest对象销毁时调用 |
+ ServletRequestEvent对象代表从HttpServletRequest对象身上捕获到的事件,通过这个事件对象我们可以获取到触发事件的HttpServletRequest对象。另外还有一个方法可以获取到当前Web应用的ServletContext对象。
> ServletRequestAttributeListener 监听ServletRequest中属性的添加、移除和修改
| 方法名 | 作用 |
| ---------------------------------------------------- | ------------------------------------ |
| attributeAdded(ServletRequestAttributeEvent srae) | 向ServletRequest中添加属性时调用 |
| attributeRemoved(ServletRequestAttributeEvent srae) | 从ServletRequest中移除属性时调用 |
| attributeReplaced(ServletRequestAttributeEvent srae) | 当ServletRequest中的属性被修改时调用 |
+ ServletRequestAttributeEvent对象代表属性变化事件,它包含的方法如下:
| 方法名 | 作用 |
| -------------------- | -------------------------------- |
| getName() | 获取修改或添加的属性名 |
| getValue() | 获取被修改或添加的属性值 |
| getServletRequest () | 获取触发事件的ServletRequest对象 |