原理:存在事件源(Source)和监听器(Listener),并为事件源注册监听器,操作事件源,产生事件对象(Event),将事件对象传递给监听器并执行监听器相应的监听方法。
在 Servlet 中,监听器用于监听 Servlet 三个数据域对象的创建、销毁和内部数据状态的改变。
Servlet 三个数据域对象: ServletContext、HttpSession、ServletRequest
三类 Servlet 监听器:
- 数据域对象 创建和销毁监听器 ;
- 数据域对象 属性变更监听器 ;
- Session中数据对象本身状态监听器。
1、创建和销毁 监听器
创建和销毁监听器对应三个数据域则应有三个监听器(接口):ServletContextListener、HttpSessionListener、ServletRequestListener;每个接口中分别定义了两个方法分别对数据域对象创建(Created)和销毁(Destroyed)进行监听。
监听器实现步骤:
1. 编写类实现监听器接口,重写接口中方法,实现监听功能;
2. 在web.xml 中注册监听器:
<!--对ServletContextListener监听器进行注册实例-->
<!--因为监听器执行不由用户访问,因此不用配置url路径-->
<listener>
<!--listener-class中路径为:包路径.类名-->
<listener-class>servlet.listener.MyServletContextListener</listener-class>
</listener>
三种创建和销毁 监听器的应用
ServletContextListener:
方法:contextInitialized(ServletContextEvent sce) 监听创建;contextDestroyed(ServletContextEvent sce) 监听销毁
1、在服务器启动时,对一些对象进行初始化,并将对象保存到ServletContext数据范围中; — 全局数据
2、对框架进行初始化 ,如Spring框架;
3、实现任务调度(通过定时器 Timer、TimerTask 实现)
HttpSessionListener
对HttpSession 数据对象创建和销毁的监听;
方法:sessionCreated(HttpSessionEvent se) 监听Session对象创建;
sessionDestroyed(HttpSessionEvent se) 监听Session对象销毁.
Session 何时创建 : request.getSession()
Session 何时销毁(三种方式) : 关闭服务器、Session过期(默认30分钟,可通过web.xml配置)、session.invalidate
ServletRequestListener
监听 HttpServletRequest 对象的创建和销毁
方法:requestInitialized(ServletRequestEvent sre) 监听request对象创建;
requestDestroyed(ServletRequestEvent sre) 监听request对象销毁。
2、属性变更 监听器
对三种数据域中的属性的创建\修改\移除,同样对应于三个监听器接口:
ServletContextAttributeListener 监听ServletContext中属性变化;
HttpSessionAttributeListener 监听HttpSession中属性变化;
ServletRequestAttributeListener 监听ServletRequest中属性变化;
每个接口都有三个方法:
attributeAdded 监听属性添加 ---- 当数据范围对象没有该属性,第一次添加时调用执行 setAttribute(name,value);
attributeRemoved 监听属性移除 ---- 从一个数据范围对象删除一个已经存在属性时执行 removeAttribute(name);
attributeReplaced 监听属性替换 ----- 当一个数据范围已经存在一个属性,向数据范围添加相同名称的属性时,触发替换方法 — setAttribute(name,value);
3、Session中数据对象本身状态监听器
本部分监听器不需要在 web.xml 中进行配置,因为状态监听器是由保存到session数据域中的对象本身去实现的;即由保存到session数据域中的对象的java类去实现监听器接口。
对象的四种状态:绑定/解除绑定; 钝化/活化
监听器接口:
1\HttpSessionBindingListener
valueBound(HttpSessionBindingEvent event) 绑定对象方法
valueUnbound(HttpSessionBindingEvent event) 解除绑定方法
2\HttpSessionActivationListener
sessionDidActivate(HttpSessionEvent se) 感知对象被活化
sessionWillPassivate(HttpSessionEvent se) 感知对象被钝化
注:对象的钝化和活化应该由tomcat服务器配置后自动进行 配置方法如下:
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="it315"/>
</Manager>
</Context>
配置context位置:
1、tomcat/conf/context.xml: 对所有虚拟主机 所有web工程生效
2、tomcat/conf/Catalina/localhost/context.xml :对当前虚拟主机所有web工程生效
3、当前工程/META-INF/context.xml :对当前工程有效