1、什么是监听器
监听器(listener)是基于servlet容器的普通java程序,专用于监听另外一个java对象的方法调用或属性变更,被监听对象发生了相应事件后,监听器的某个方法就会立即执行。
监听器的相关概念:
-
事件:某个对象的方法被调用、属性改变、状态改变等。
-
事件源:被监听(观察)的对象( 例如:request、session、servletContext)。
-
监听器:用于监听(观察)事件源对象 ,事件源对象状态的变化都会触发监听器对象中某些方法的立即执行。
-
注册监听器:将监听器与事件源进行绑定。
警察监视一个嫌疑人以求人赃俱获的场景下,嫌疑人就是事件源,警察就是监听器,嫌疑人与赃物同时出现就是一个事件,一旦发生该事件,警察就立即收网。警长安排英雄警察监视嫌疑人就是完成监听器的注册。
2、监听器的分类
Servlet-api中定义了 8 个监听器接口,用于监听 ServletContext、HttpSession 和 ServletRequest 对象的生命周期和属性变化事件,正好是Servlet中的三大作用域。
监听器按监听事件划分,可以分为3类:
- 监听对象创建和销毁的监听器
- 监听对象中属性变更的监听器
- 监听 HttpSession 中的对象状态改变的监听器
2.1 监听对象的创建与销毁的监听器
事件源 | 监听器 | 监听器描述 | 创建和销毁方法 | 调用时机 |
---|---|---|---|---|
ServletContext | ServletContextListener | 用于监听 ServletContext 对象的创建与销毁过程 | void contextInitialized (ServletContextEvent sce) | 服务器启动时,为每一个项目创建一个上下文,创建上下文之前,触发事件 |
void contextDestroyed (ServletContextEvent sce) | 项目被移除或者服务器关闭时将会销毁上下文之后,触发事件 | |||
HttpSession | HttpSessionListener | 用于监听 HttpSession 对象的创建和销毁过程 | void sessionCreated (HttpSessionEvent se) | 项目中第一次场景session时即request.getSession()之前 |
void sessionDestroyed (HttpSessionEvent se) | 服务器非正常关闭、session超时、手动销毁之后触发事件 | |||
ServletRequest | ServletRequestListener | 用于监听 ServletRequest 对象的创建和销毁过程 | void requestInitialized (ServletRequestEvent sre) | 请求进入之前触发 |
void requestDestroyed (ServletRequestEvent sre) | 请求生成相应之后触发 |
2.2 监听属性变化的监听器
事件源 | 监听器 | 监听器描述 | 方法 | 调用时机 |
---|---|---|---|---|
ServletContext | ServletContextAttributeListener | 用于监听 ServletContext 对象的属性新增、移除和替换 | public void attributeAdded (ServletContextAttributeEvent scae) | 当 ServletContext 对象中新增一个属性时 |
public void attributeRemoved (ServletContextAttributeEvent scae) | 当删除 ServletContext 对象中的一个属性时 | |||
public void attributeReplaced (ServletContextAttributeEvent scae) | 当 ServletContext 对象中的某个属性被替换时 | |||
HttpSession | HttpSessionAttributeListener | 用于监听 HttpSession 对象的属性新增、移除和替换 | public void attributeAdded (HttpSessionBindingEvent hsbe) | 当 HttpSession 对象中新增一个属性时 |
public void attributeRemoved (HttpSessionBindingEvent hsbe) | 当删除 HttpSession 对象中的一个属性时 | |||
public void attributeReplaced (HttpSessionBindingEvent hsbe) | 当 HttpSession 对象中的某个属性被替换时 | |||
HttpServletRequest | ServletRequestAttributeListener | 用于监听 HttpServletRequest 对象的属性新增、移除和替换 | public void attributeAdded (ServletRequestAttributeEvent srae) | 当 HttpServletRequest 对象中新增一个属性时 |
public void attributeRemoved (ServletRequestAttributeEvent srae) | 当删除 HttpServletRequest 对象中的一个属性时 | |||
public void attributeReplaced (ServletRequestAttributeEvent srae) | 当 HttpServletRequest 对象中的某个属性被替换时 |
2.3 监听Session中对象属性状态变化的监听器
事件源 | 监听器 | 监听器描述 | 方法 | 调用时机 |
---|---|---|---|---|
HttpSession | HttpSessionBindingListener | 用于监听 JavaBean 对象绑定到 HttpSession 对象和从 HttpSession 对象解绑的事件 | void valueBound (HttpSessionBindingEvent event) | 当对象被绑定(添加)到 HttpSession 对象中时 |
void valueUnbound (HttpSessionBindingEvent event) | 当对象从 HttpSession 对象中解除绑定(移除)时 | |||
HttpSessionActivationListener | 用于监听 HttpSession 中对象活化和钝化的过程 | void sessionWillPassivate (HttpSessionBindingEvent event) | 当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被钝化之前 | |
void sessionDidActive (HttpSessionBindingEvent event) | 当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后 |
3、自定义监听器示例,通过继承ServletRequestListener接口实现Request请求域的监听:
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
System.out.println("request 级作用域监听事件销毁:"+ httpServletRequest.getRequestURL());
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
ServletRequest servletRequest = servletRequestEvent.getServletRequest();
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
System.out.println("request 级作用域监听事件初始化:"+httpServletRequest.getRequestURI());
}
}