简介
- 监听器:专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时立即采取相应的行动。
- Servlet 监听器: Servlet 规范中定义的一种特殊类,它用于监听 web 应用程序中的 ServletContext, HttpSession 和 ServletRequest 等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
Servlet 监听器的分类
按监听的事件类型Servlet监听器可分为如下三种类型:
- 监听域对象自身的创建和销毁的事件监听器
- 监听域对象中的属性的增加和删除的事件监听器
- 监听绑定到HttpSession域中的某个对象的状态的事件监听器
监听域对象的创建和销毁
域对象创建和销毀的事件监听器就是用来监听ServletContext, HttpSession, HttpServletRequest 这三个对象的创建和销毁事件的监听器。
监听域对象自身的创建和销毁的事件监听器
- ServletContextListener
- ServletRequestListener‘
- HttpSessionListener
public class HelloServletContextListener implements ServletContextListener, ServletRequestListener,HttpSessionListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContextListener 被创建");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContextListener 被销毁");
}
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("ServletRequestEvent 被销毁");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("ServletRequestEvent 被创建" );
}
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("HttpSessionEvent 被创建 " );
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("HttpSessionEvent 被销毁" );
}
}
web.xml 文件中的配置
<listener>
<listener-class>com.athome.listener.HelloServletContextListener</listener-class>
</listener>
监听域对象中的属性的增加和删除的事件监听器
域对象中属性的变更的事件监听器就是用来监听ServletContext, HttpSession, HttpServletRequest这三个对象中的属性变更信息事件的监听器。
ServletRequestAtributeListener ,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同
- ServletRequestAttributeListener
- HttpSessionAttributeListener
- ServletContextAttributeListener
public class AttributeListener implements ServletRequestAttributeListener,
HttpSessionAttributeListener,ServletContextAttributeListener{
@Override
public void attributeAdded(ServletContextAttributeEvent scae) {
System.out.println("Context 属性被添加: " + scae.getName() + "-->" + scae.getValue());
@Override
public void attributeRemoved(ServletContextAttributeEvent scae) {
System.out.println("Context 属性被替换: " + scae.getName() + "-->" + scae.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent scae) {
System.out.println("Context 属性被移除: " + scae.getName() + "-->" + scae.getValue());
}
@Override
public void attributeAdded(HttpSessionBindingEvent se) {
System.out.println("session 属性被添加: " + se.getName() + "-->" + se.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent se) {
System.out.println("session 属性被移除: " + se.getName() + "-->" + se.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent se) {
System.out.println("session 属性被修改: " + se.getName() + "-->" + se.getValue());
}
@Override
public void attributeAdded(ServletRequestAttributeEvent srae) {
System.out.println("request 属性被添加: " + srae.getName() + "-->" + srae.getValue());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent srae) {
System.out.println("request 属性被移除: " + srae.getName() + "-->" + srae.getValue());
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent srae) {
System.out.println("request 属性被替换: " + srae.getName() + "-->" + srae.getValue());
}
}
web.xml文件中的配置
<listener>
<listener-class>com.athome.listener.AttributeListener</listener-class>
</listener>
监听绑定到HttpSession域中的某个对象的状态的事件监听器(不需要在 web.xml 中进行配置)
- HttpSessionBindingListener
实现 接口的 javaBean 类在session 操作改类时 调用对应的方法
public class Customer implements HttpSessionBindingListener{
@Override
public void valueBound(HttpSessionBindingEvent event) {
System.out.println("绑定到 session 属性");
Object value = event.getValue();
System.out.println(value == this);
System.out.println(event.getName());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("从session 中接触绑定");
}
}
- HttpSessionActivationListener
实现该接口 和 Serializable 接口的类,在进行相关操作时会被访问
public class HttpsessionTest implements HttpSessionActivationListener,Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
//钝化
System.out.println("向磁盘中写入 session 对象");
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
//活化
System.out.println("从磁盘中读取 session 对象");
}
}