1. 监听器
- 23.12.17 23:41开始
- 23.12.18 0:50更新
- 23.12.18 21:25更新
1.1. 什么是监听器
- 监听器是Servlet规范中的一员,就像Filter一样,Filter是Servlet规范中的一员。
- 在Servlet中,所有的监听器都是“Listener”结尾。
1.2. 监听器作用
- 监听器实际上是Servlet规范留给我们javaweb程序员的特殊时机。
- 特殊的时刻如果想执行这段代码,你需要想到使用对应的监听器。
1.3. 有哪些监听器
- jakarta.servlet包下:- ServletContextListener
- ServletContextAttributeListener
- ServletRequestListener
- ServletRequestAttributeListener
 
- jakarta.servlet.http包下:- HttpSessionListener
- HttpSessionAttributeListener
- HttpSessionBindingListener
- HttpSessionIdListener:session的ID发生改变。
- HttpSessionActivationListener
 
1.4. 配置ContextListener
第一步:编写一个类,实现ServeltContextListener接口,并且实现里面的方法
public class MyServletContextListener implements ServeltContextListener {
    @Override
    public void contextInitialed(ServeltContextEvent sce) {// 服务器启动时间点
        // 这个方法是在ServletContext对象被创建的时候调用
        System.out.println("ervletContext对象被创建了");
    }
    @Override
    public void contextDestroyed(ServeltContextEvent sce) {// 服务器关闭时间点
        // 这个方法是在ServletContext对象被销毁的时候调用
        System.out.println("ervletContext对象被销毁了");
    }
}
第二步:在web.xml文件中对ServeltContextListener进行配置,如下:
<listener>
    <listener-class>com.xxx.javaweb.lister.MyServletContextListener</listener-class>
</listener>
或者使用注解:@WebListener
1.5. 配置HttpSessionAttributeListener
@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
    // 向session域当中存储数据的时候,以下方法被WEB容器调用
    @Override
    public void attributeAdded(HttpSessionBindingEvent se) {
        System.out.println("session data add");
    }
    // 将session域当中存储的数据删除的时候,以下方法被WEB容器调用。
    @Override
    public void attributeRemoved(HttpSessionBindingEvent se) {
        System.out.println("session data remove");
    }
    // session域当中的某个数据被替换的时候,以下方法被WEB容器调用。
    @Override
    public void attributeReplaced(HttpSessionBindingEvent se) {
        System.out.println("session data replace");
    }
}
1.6. 配置HttpSessionBindingListener
public class User implements HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("绑定数据");
    }
    @Override
    public void valueUnBound(HttpSessionBindingEvent event) {
        System.out.println("解绑数据");
    }
}
// 将user存储到session域
session.setAttribute("user", user);
User实现了HttpSessionBindingListener,会触发监听方法。
1.7. 统计在线用户个数
- 不考虑登录:可以使用HttpSessionAttributeListener实现。
- 考虑登录:需要使用HttpSessionBindingListener。
public class User implements HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        // 获取ServletContext对象
        ServletContext application = event.getSession().getServletContext();
        // 获取在线人数
        Object onlinecount = application.getAttribute("onlinecount");
        if (onlinecount == null) {
            application.setAttribute("onlinecount", 1);
        } else {
            int count = (Integer)onlinecount;
            count++;
            application.setAttribute("onlinecount", count);
        }
    }
    @Override
    public void valueUnBound(HttpSessionBindingEvent event) {
        // 获取ServletContext对象
        ServletContext application = event.getSession().getServletContext();
        Integer onlinecount = (Integer)application.getAttribute("onlinecount");
        onlinecount--;
        application.setAttribute("onlinecount", count);
    }
}
1.8. HttpSessionActivationListener
- 监听session对象的钝化和活化的。
- 钝化:session对象从内存存储到硬盘文件。
- 活化:从硬盘文件把session恢复到内存中。