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 监听器的使用
-
创建一个类并实现上述接口,并重写方法;
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初始化"); } }
-
在 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>
参考文章
-
java3y - GitHub
可关注大佬微信公众号:java3y