监听器:专门用于对其对象身上发生的事件或状态改变进行监听和处理的对象,当被监听的对象发生状况时,立即采取响应的行动。
Servlet监听器:Servlet规范中定义的一种特殊类,用于监听web应用程序中的ServletContext,HttpSession和ServletRequest等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
按监听的事件类型Servlet监听器可分三种:
- 监听域对象自身的创建和销毁的事件监听器
- 监听域对象中的属性的增加和删除的事件监听器
- 监听绑定到域中的某个对象的状态的事件监听器
某些Servlet事件监听需要在web.xml文件中进行注册,一个web.xml文件中可以注册多个Servlet事件监听器,web服务器按照它们在web.xml文件中注册的顺序来加载和注册这些Servlet事件监听器。
<!-- 配置Listener -->
<listener>
<listenerclass>com.zzz.listener.MyServletContextListener</listener-class>
</listener>
<listener>
<listener-class>com.zzz.listener.MyHttpSessionListener</listener-class>
</listener>
<listener>
<listener-class>com.zzz.listener.MyServletRequestListener</listener-class>
</listener>
Servlet事件监听器的注册和调用过程都是由web容器自动完成。
一个web应用程序只会为每个事件监听器创建一个对象,有可能出现多个线程同时调用同一个监听器对象,所以在编写监听器类时,应考虑多线程安全的问题。
监听域对象的创建和销毁
域对象创建和销毁的事件监听器就是用来监听ServletContext、HttpSession、ServletRequest三个对象的创建和销毁事件的监听器。
销毁和创建的时机
ServletRequestListener接口
ServletRequestListener接口监听ServletRequest对象的创建和销毁
public class MyServletRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("请求被销毁");
}
@Overri de
public void requestInitialized(ServletRequestEvent arg0) {
System.out.println("请求被创建");
}
}
HttpSessionListener接口
HttpSessionListener接口用于监听HttpSession对象的创建和销毁。
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent arg0) {
System.out.println("Session创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent arg0) {
System.out.println("Session销毁");
}
}
ServletContextListener接口
ServletContextListener接口用于监听ServletContext对象的创建和销毁
public class MyServletContextListener implements ServletContextListener {
//ServletContext对象被创建
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("ServletConttext销毁。。。");
}
//ServletContext对象被销毁
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("ServletConttext创建。。。");
}
}
域对象中属性的变更的事件监听器
域对象属性变更的事件监听器就是用来监听Servlet Context、HttpSession、ServletRequest这三个对象中的属性变更信息事件的监听器。
三个监听器的接口:
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener
三个接口中都定义了三个方法来处理被监听对象中的属性的增加、删除和替换事件,同一个事件在这三个接口对应的方法名称完全相同,只是接收的参数类型不同。
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
// 添加
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("添加属性"+event.getName()+"---"+event.getValue());
}
// 移除
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("移除属性"+event.getName()+"---"+event.getValue());
}
// 替换 session.setAttribute("user","zhangsan");
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("替换属性"+event.getName()+"---"+event.getValue());
}
}