监听器Listener

Servlet 监听器时 Servlet 规范中定义的一种特殊类,用于监听 ServletContex、HttpSession 和 ServletRequest 等域对象的创建和销毁事件,以及监听这些域对象中属性修改的事件。

1 作用域监听器

Servlet 中定义了以下监听作用域对象的监听器接口:

监听器接口 描述
HttpSessionListener 用于监听session的创建和销毁
ServletContextListener 用于监听ServletContext的创建和销毁
ServletRequestListener 用于监听Request的创建和销毁

实现上述接口需要重写两个方法:

  • xxxDestroyed(xxxEvent):对象销毁时被调用
  • xxxInitialized(xxxEvent):对象创建时被调用

2 属性监听器

Servlet 还定义了各作用域对象中属性的监听器,用于监听属性的修改。

监听器接口 描述
HttpSessionAttributeListener 用于监听session中属性变化
ServletContextAttributeListener 用于监听ServletContext中属性变化
ServletRequestAttributeListener 用于监听request中属性变化

实现上述接口需要重写以下三个方法:

  • attributeAdded(xxxEvent):属性添加时被调用
  • attributeRemoved(xxxEvent):属性删除时被调用
  • attributeReplaced(xxxEvent):属性值修改时被调用

3 监听器的使用

  1. 创建一个类并实现上述接口,并重写方法;

    package servlet;
    
    import javax.servlet.*;
    
    public class Listener implements ServletRequestListener{
        @Override
        public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
            System.out.println("Request被销毁");
        }
    
        @Override
        public void requestInitialized(ServletRequestEvent servletRequestEvent) {
            System.out.println("Request初始化");
        }
    }
    
  2. 在 web.xml 文件中配置 Listener 信息;或者在创建类时使用注解;

    <listener>
     <listener-class>servlet.Listener</listener-class>
    </listener>
    
    import javax.servlet.*;
    
    @WebListener()
    public class Listener implements ServletRequestListener{
     @override
     public void requestDestroyed(servletRequestEvent servletRequestEvent){
     
     }
    }
    

4 监听Session内的对象

Servelt 中还存在两个监听器,用于监听 Session 中对象。

监听器接口 描述
HttpSessionBindingListener 用于监听JavaBean对象是否绑定或删除
HttpSessionActivationListener 用于监听JavaBean对象钝化或活化

钝化:当服务器关闭时,将Session的内容保存在硬盘上;

活化:当服务器开启时,会将Session的内容从硬盘中重新加载;

要测试 Session 的钝化和活化,需要修改 Tomcat 的配置:在 META-INF 下的 context.xml 文件中添加以下代码

<Context>
    <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
        <Store className="org.apache.catalina.session.FileStore" directory="Chan"/>
    </Manager>
</Context>

参考文章

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容