<listener> <description>MyRequestAndSessionAttributeListener监听器</description> <listener-class>me.gacl.web.listener.MyRequestAndSessionAttributeListener</listener-class> </listener>
编写RequestAndSessionAttributeListenerTest.jsp测试页面
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> <html> <head> <title>RequestAndSessionAttributeListener监听器测试</title> </head> <body> <% //往session域对象中添加属性 session.setAttribute("aa", "bb"); //替换session域对象中aa属性的值 session.setAttribute("aa", "xx"); //移除session域对象中aa属性 session.removeAttribute("aa"); //往request域对象中添加属性 request.setAttribute("aa", "bb"); //替换request域对象中aa属性的值 request.setAttribute("aa", "xx"); //移除request域对象中aa属性 request.removeAttribute("aa"); %> </body> </html>
运行结果如下:
从运行结果中可以看到,HttpSessionAttributeListener监听器和ServletRequestAttributeListener成功监听到了HttpSession域对象和HttpServletRequest域对象的属性值变化情况。
二、感知Session绑定的事件监听器
保存在Session域中的对象可以有多种状态:绑定(session.setAttribute(“bean”,Object))到Session中;从 Session域中解除(session.removeAttribute(“bean”))绑定;随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复
Servlet 规范中定义了两个特殊的监听器接口“HttpSessionBindingListener和HttpSessionActivationListener”来帮助JavaBean 对象了解自己在Session域中的这些状态: ,实现这两个接口的类不需要 web.xml 文件中进行注册。
2.1、HttpSessionBindingListener接口
实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和 Session中删除的事件
当对象被绑定到HttpSession对象中时,web服务器调用该对象的void valueBound(HttpSessionBindingEvent event)方法
当对象从HttpSession对象中解除绑定时,web服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法
范例:
package me.gacl.domain; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener; /** * @ClassName: JavaBeanDemo1 * @Description: * 实现了HttpSessionBindingListener接口的 JavaBean对象可以感知自己被绑定到 Session中和从Session中删除的事件 当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event) 方法 当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的 void valueUnbound(HttpSessionBindingEvent event)方法 * @author: 孤傲苍狼 * @date: 2014-9-11 下午11:14:54 * */ public class JavaBeanDemo1 implements HttpSessionBindingListener { private String name; @Override public void valueBound(HttpSessionBindingEvent event) { System.out.println(name+"被加到session中了"); } @Override public void valueUnbound(HttpSessionBindingEvent event) { System.out.println(name+"被session踢出来了"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public JavaBeanDemo1(String name) { this.name = name; } }
上述的JavaBeanDemo1这个javabean实现了HttpSessionBindingListener接口,那么这个JavaBean对象可以感知自己被绑定到Session中和从Session中删除的这两个操作,测试代码如下:
<%@ page language="java" pageEncoding="UTF-8"%> <%@page import=" me.gacl.domain.JavaBeanDemo1"%> <!DOCTYPE HTML> <html> <head> <title></title> </head> <body> <% //将javabean对象绑定到Session中 session.setAttribute("bean",new JavaBeanDemo1("孤傲苍狼")); //从Session中删除javabean对象 session.removeAttribute("bean"); %> </body> </html>
运行结果如下:
2.2、HttpSessionActivationListener接口