•
监听器:专门用于对其他对象身上发生
的事件或状态改变
进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。
•
Servlet
监听器:
Servlet
规范中定义的一种特殊类,它用于监听
web
应用程序中的
ServletContext
,
HttpSession
和
ServletRequest
等域对象的创建与销毁事件,以及监听这些域对象中的属性发生修改的事件。
•Servlet 监听器的分类
•
按监听的事件类型
Servlet
监听器可分为如下三种类型:
–
监听域对象自身的创建和销毁的事件监听器
–
监听域对象中的属性的增加和删除的事件监听器
–
监听绑定到
HttpSession
域中的某个对象的状态的事件监听器
•编写Servlet监听器
•
Servlet
规范为每种事件监听器都定义了相应的接口,开发人员编写的事件监听器程序只需实现这些接口
,
web
服务器根据用户编写的事件监听器所实现的接口把它注册到相应的被监听对象上
•
一些
Servlet
事件监听器需要在
web
应用程序的
web.xml
文件中进行注册,
一个
web.xml
文件中可以注册多个
Servlet
事件监听器,
web
服务器按照它们在
web.xml
文件中的注册顺序来加载和注册这些
Serlvet
事件监听器
。
•
Serlvet
事件监听器的注册和调用过程都是由
web
容器自动完成的,当发生被监听的对象被创建,修改或销毁事件时,
web
容器将调用与之相关的
Servlet
事件监听器对象的相关方法,开发人员在在这些方法中编写的事件处理代码即被执行
•
由于
一个
web
应用程序只会为每个事件监听器创建一个对象
,有可能出现多个线程同时调用同一个事件监听器对象的情况,所以,在编写事件监听器类时,应考虑多线程安全的问题
1、监听域对象的创建和销毁
•
域
对象创建和销毁的事件监听器就是用来监听
ServletContext
,
HttpSession
,
HttpServletRequest
这三个对象的创建和销毁事件的监听器。
•
域对象的创建和销毁时机
1).request: 是一个请求, 当一个响应返回时, 即被销毁. 当发送一个请求时被创建.
注意, 请求转发的过程是一个 request 对象.重定向是两个请求
2).session: 当第一次访问 WEB 应用的一个 JSP 或 Servlet 时, 且该 JSP 或 Servlet 中还需要创建 session 对象. 此时服务器会创建一个 session 对象.
session 销毁: 1.session 过期, 2.直接调用 session 的 invalidate 方法, 3.当前 web 应用被卸载(session 可以被持久化).
* 关闭浏览器, 并不意味着 session 被销毁, 会把seesion存在到文件.ser里,我们还可以通过 sessionid 找到服务器中的 session 对象.
JSESSIONID=F4119DE0FC93ED38E8EC83B24CFA3B81
http://localhost:8989/listener/session.jsp;jsessionid=F4119DE0FC93ED38E8EC83B24CFA3B81
3).application: 贯穿于当前的 WEB 应用的生命周期. 当前 WEB 应用被加载时创建 application 对象, 当前 WEB 应用被卸载时销毁 application 对象.
2.域对象中属性的变更的事件监听器
•
域
对象中属性的变更的事件监听器就是用来监听
ServletContext
,
HttpSession
,
HttpServletRequest
这三个对象中的属性变更信息事件的监听器。
•
这三个监听器接口分别是
ServletContextAttributeListener,HttpSessionAttributeListener和ServletRequestAttributeListener
,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换的事件,同一个事件在这三个接口中对应的方法名称完全相同,只是接受的参数类型不同
1).attributeRemoved方法
•
当
删除被监听对象中的一个属性时,
web
容器调用事件监听器的这个方法进行相应
•
各个域属性监听器中的完整语法定义为:
2).attributeAdded方法
•
当
向被监听器对象中增加一个属性时,
web
容器就调用事件监听器的
attributeAdded
方法进行相应,这个方法接受一个事件类型的参数,监听器可以通过这个参数来获得正在 增加属性的域对象和被保存到域中的属性对象
3).attributeReplaced方法
•
当
监听器的域对象中的某个属性被替换时,
web
容器调用事件监听器的这个方法进行相应
另外还有两个getName()和getValue()方法。这三个监听器使用较少。
3.感知 Session绑定的事件监听器
•
保存在
Session
域中的对象可以有多种状态:绑定到
Session
中;从
Session
域中解除绑定;随
Session
对象
持久化
到一个存储设备中;随
Session
对象从一个存储设备中
恢复
•
Servlet
规范中定义了两个特殊的监听器接口来
帮助
JavaBean
对象
了解自己在
Session
域中的这些状态
:
HttpSessionBindingListener接口和HttpSessionActivationListener
接口,实现这两个接口的类
不需要
web.xml
文件中进行注册
1.HttpSessionBindingListener接口
•
实现
了
HttpSessionBindingListener
接口的
JavaBean
对象可以感知自己被绑定到
Session
中和从
Session
中删除的事件
•
当对象被绑定到
HttpSession
对象中时,
web
服务器调用该对象的
void
valueBound
(
HttpSessionBindingEvent
event)
方法
•
当对象从
HttpSession
对象中解除绑定时,
web
服务器调用该对象的
void
valueUnbound
(
HttpSessionBindingEvent
event)
方法
•
典型
应用:统计
当前在线人数列表
2.HttpSessionActivationListener接口
•
实现
了
HttpSessionBindingListener
接口的
JavaBean
对象可以感知自己被活化和钝化的事件
•
当绑定到
HttpSession
对象中的对象将要随
HttpSession
对象被钝化之前,
web
服务器调用该对象的
void
sessionWillPassivate
(
HttpSessionBindingEvent
event)
方法
•
当绑定到
HttpSession
对象中的对象将要随
HttpSession
对象被活化之后,
web
服务器调用该对象的
void
sessionDidActive
(
HttpSessionBindingEvent
event
)
方法
活化: 从磁盘中读取 session 对象
钝化: 向磁盘中写入 session 对象
session 对象存储在tomcat 服务器的 work\Catalina\localhost\contextPath 目录下. SESSION.SER