Servlet事件监听器
Servlet事件监听器是实现一个或多个Servlet事件监听器接口的类,支持在ServletContext、HttpSession和ServletRequest状态改变时进行事件通知。
在JavaWeb中,若要对ServletContext、HttpSession和ServletRequest这三大域对象的创建
、销毁
及属性发生修改
的事件
进行监听,实现相应的监听器接口即可。
Servlet事件监听器的分类
下面对常用的8个监听器进行分类。
先补充3个名词概念:
1. 事件源
:事件是由谁产生的。
2. 事件对象
:产生的事件
3. 监听器
: 监听事件源产生的事件
对监听的事件源分别为ServletContext、HttpSession和ServletRequest三个域对象的操作,可以把监听器划分为三种类型:
- 域对象的生命周期监听:监听域对象的创建和销毁。
- 域对象的属性监听:监听域对象属性的增加、替换和删除。
- 感知监听(只与HttpSession域对象有关):监听绑定到HttpSession域中的某个对象的状态。
第一类:域对象的生命周期监听
- 事件源:三大域
- 事件对象:创建和销毁
- 监听器:实现了ServletContextListener、HttpSessionListener、ServletRequestListener任一接口的类。
1. ServletContext的生命周期监听
(1) 编码
public class MyServletContextListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent arg0) {
//项目启动调用
System.out.println("ServletContext对象创建了。。。");
//参数ServletContextEvent对象可以获取ServletContext对象
//ServletContext servletContext = arg0.getServletContext();
}
public void contextDestroyed(ServletContextEvent arg0) {
//项目关闭或服务器关闭时调用
System.out.println("ServletContext对象销毁了。。。");
}
}
(2)在web.xml文件中注册监听器
Web服务器会根据web.xml文件配置的监听器,把监听器注册到相应的对象上(这里的对象是ServletContext)。
配置如下:
<listener>
<listener-class>com.mbc.listener.MyServletContextListener</listener-class>
</listener>
2. HttpSession的生命周期监听
(1)编码
public class MyHttpSessionListener implements HttpSessionListener {
public void sessionCreated(HttpSessionEvent arg0) {
//Session产生时调用
//产生:通过getSession()
System.out.println("Session对象创建了。。。");
//参数HttpSessionEvent对象可以获取Session对象
//HttpSession session = arg0.getSession();
}
public void sessionDestroyed(HttpSessionEvent arg0) {
//Session销毁时调用
//销毁:1.到达Session的存活时间 2.非正常关闭服务器
System.out.println("Session对象创建了。。。");
}
}
(2)在web.xml文件中注册监听器
<listener>
<listener-class>com.mbc.listener.MyHttpSessionListener</listener-class>
</listener>
<!-- 配置HttpSession对象的销毁时机 -->
<session-config>
<!-- 配置HttpSession对象在1分钟后销毁 -->
<session-timeout>1</session-timeout>
</session-config>
3. ServletContext的生命周期监听
(1)编码
public class MyServletRequestListener implements ServletRequestListener {
public void requestInitialized(ServletRequestEvent arg0) {
//请求产生时调用
System.out.println("ServletRequest对象创建了");
//参数ServletRequestEvent对象可以获取ServletContext对象和ServletRequest对象
//ServletContext servletContext = arg0.getServletContext();
//ServletRequest servletRequest = arg0.getServletRequest();
}
public void requestDestroyed(ServletRequestEvent arg0) {
//服务器完成对请求的响应时调用
System.out.println("ServletRequest对象销毁了了");
}
}
(2)在web.xml文件中注册监听器
<listener>
<listener-class>com.mbc.listener.MyServletRequestListener</listener-class>
</listener>
第二类:域对象的属性监听
- 事件源:三大域
- 事件对象:属性的增加、替换和删除
- 监听器:实现了ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener任一接口的类。
1. ServletContext的属性监听
(1)编码
public class MyServletContextAttributeListener implements ServletContextAttributeListener {
public void attributeAdded(ServletContextAttributeEvent arg0) {
//给ServletContext对象添加属性时调用
System.out.println("添加了属性");
}
public void attributeRemoved(ServletContextAttributeEvent arg0) {
//给ServletContext对象移除属性时调用
System.out.println("移除了属性");
}
public void attributeReplaced(ServletContextAttributeEvent arg0) {
//给ServletContext对象替换属性时调用
System.out.println("替换了属性");
}
}
(2)在web.xml文件中注册监听器
<listener>
<listener-class>com.mbc.listener.MyServletContextAttributeListener</listener-class>
</listener>
2.HttpSession的属性监听
(1)编码
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent arg0) {
//给HttpSession对象添加属性时调用
System.out.println("添加了属性");
}
public void attributeRemoved(HttpSessionBindingEvent arg0) {
//给HttpSession对象移除属性时调用
System.out.println("移除了属性");
}
public void attributeReplaced(HttpSessionBindingEvent arg0) {
//给HttpSession对象替换属性时调用
System.out.println("替换了属性");
}
}
(2)在web.xml文件中注册监听器
<listener>
<listener-class>com.mbc.listener.MyHttpSessionAttributeListener</listener-class>
</listener>
3. ServletRequest的属性监听
(1)编码
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
//给ServletRequest对象添加属性时调用
System.out.println("添加了属性");
}
public void attributeAdded(ServletRequestAttributeEvent arg0) {
//给ServletRequest对象移除属性时调用
System.out.println("移除了属性");
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
//给ServletRequest对象替换属性时调用
System.out.println("替换了属性");
}
}
(2)在web.xml文件中注册监听器
<listener>
<listener-class>com.mbc.listener.MyServletRequestAttributeListener</listener-class>
</listener>
感知监听
- 事件源:HttpSession
- 事件对象:
- 对象绑定到Session域中(session.setAttribute(“bean”, JavaBean))。
- 对象从Session域中解除绑定(session.removeAttribute(“bean”))
- 对象随Session对象钝化到存储设备中
- 对象随Session对象从存储设备中活化
- 监听器:实现了HttpSessionBindingListener、HttpSessionActivationListener任一接口的JavaBean对象。即对象监听自己在Session域中的状态。
1. HttpSessionBindingListener接口
实现了HttpSessionBindingListener接口的JavaBean对象可以监听自己被绑定到Session中或从Session中解绑的事件,不需要在web.xml中注册。
public class JavaBeanDemo1 implements HttpSessionBindingListener {
private String name;
public JavaBeanDemo1(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void valueBound(HttpSessionBindingEvent arg0) {
//当前对象被绑定到Session时调用
String name = arg0.getName();
System.out.println(name + "对象被绑定到Session中了");
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
//当前对象从Session中解绑时调用
String name = arg0.getName();
System.out.println(name + "对象从Session中解绑了");
}
}
2. HttpSessionActivationListener接口
实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己随HttpSession活化和钝化的事件,不需要在web.xml中注册。
另外JavaBean对象能随HttpSession活化和钝化的前提是需实现Serializable接口。
public class JavaBeanDemo2 implements HttpSessionActivationListener, Serializable {
private static final long serialVersionUID = 315490107646009757L;
private String name;
public JavaBeanDemo2(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sessionWillPassivate(HttpSessionEvent arg0) {
//当绑定到HttpSession对象中的JavaBean对象将要随HttpSession对象被钝化之前调用
System.out.println(name+"要随HttpSession对象钝化到硬盘了,session的id为:"+ arg0.getSession().getId());
}
public void sessionDidActivate(HttpSessionEvent arg0) {
//当绑定到HttpSession对象中的JavaBean对象将要随HttpSession对象被活化之前调用
System.out.println(name+"要随HttpSession对象活化到内存了,session的id为:"+ arg0.getSession().getId());
}
}
通过Tomcat设置钝化,在当前Web项目下的WebContent/META-INF下新建context.xml文件,填入如下内容:
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="test"/>
</Manager>
</Context>
maxIdleSwap="1"
:表示当用户超过1分钟不访问当前项目的话,绑定到HttpSession对象中的JavaBean对象会随HttpSession对象钝化到硬盘上
directory="test"
:表示钝化的文件会保存在test目录下,完整的目录为“Tomcat安装下的\work\Catalina\localhost\web项目名\test”。