Listener

Listener

监听器使用的感受类似于JS中的事件,被观察的对象发生某些情况时,自动触发代码的执行

监听器监听的对象只有三大域对象,不监听web项目的其他组件


监听器的分类

web中定义八个监听器接口作为监听器的规范

  • Application域

    • ServletContextListener:监听Application域的创建和销毁
    • ServletContextAttributeListener:监听Application域中数据变化
  • session域

    • HttpSessionListener:监听Session域的创建和销毁
    • HttpSessionAttributeListener:监听Session域中数据变化
    • HttpSessionBindingListener:绑定行为的监听器接口
    • HttpSessionActivationListener:钝化和活化监听器接口
  • request域

    • ServletRequestListener:监听Request域的创建和销毁
    • ServletRequestAttributeListener::监听Request域中数据变化

Application域的监听器

ServletContextListener

监听ServletContext对象的创建与销毁

方法名说明
contextInitialized(ServletContextEvent sce)ServletContext创建时调用
contextDestroyed(ServletContextEvent sce)ServletContext销毁时调用

ServletContextEvent对象代表从ServletContext对象身上捕获到的事件,通过这个事件对象我们可以获取到ServletContext对象


ServletContextAttributeListener

监听ServletContext中属性的添加、移除和修改

方法名说明
attributeAdded(ServletContextAttributeEvent scab)向ServletContext中添加属性时调用
attributeRemoved(ServletContextAttributeEvent scab)从ServletContext中移除属性时调用
attributeReplaced(ServletContextAttributeEvent scab)当ServletContext中的属性被修改时调用

注:当调用attributeReplaced方法时,使用scae对象获取的值时被修改前的值

public void attributeReplaced(ServletContextAttributeEvent scae) {
    ServletContext application = scae.getServletContext(); 
    System.out.println(scae.getName() + scae.getValue() + "的值被修改为" + application.getAttribute(scae.getName()));
}

ServletContextAttributeEvent对象

代表属性变化事件

方法名说明
getName()获取修改或添加的属性名
getValue()获取被修改或添加的属性值
getServletContext()获取ServletContext对象

注解启动监听器

在监听器类上添加注解WebListener即可

@WebListener
public class MyApplicationListener implements ServletContextListener {
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("contextInitialized");
    }
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("contextDestroyed");
    }
}

同一个监听器可实现多个接口,实现监听多个功能

@WebListener
public class MyApplicationListener implements ServletContextListener, ServletContextAttributeListener {
}

HttpSessionActivationListener

session对象在服务端是以对象的形式存储于内存的,session过多,服务器内存也不够

为了分摊内存压力并且为了保证session重启不丢失,我们可以设置将session进行钝化处理

钝化(序列化):内存 -> 硬盘

活化(反序列化):硬盘 ->内存

我们要监听某个session的钝化和活化,就将其属性作为参数存入session对象中

session.setAttribute("activationListener",new ActivationListener()); //添加钝化活化监听器