也称为HttpSession域内对象监听器,是监听绑定到HttpSession域中的某个对象的事件监听器;
保存在session域中的对象可以有多种状态:绑定到Session中;从Session域中解除绑定;随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复;
Servlet规范中定义了两个特殊的监听器接口来帮助JavaBean对象了解自己在Session域中的这些状态:HttpSessionBindingListener 接口和 HttpSessionActivationListener 接口,实现这两个接口的类不需要在web.xml文件中进行注册,即不需要配置web.xml文件;
HttpSessionBindingListener 接口
实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和从Session中删除的事件。
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent;
public class UserInfo implements HttpSessionBindingListener {
private String id;
public UserInfo(String id) {
this.id=id;
}
//session属性绑定UserInfo对象时执行
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println("valueBound");
}
//session属性解绑UserInfo对象时执行
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println("valueUnbound");
}
}
定义一个类UserInfo实现HttpSessionBindingListener接口,并设置一个私有属性id及相应的构造方法;
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="online.yangxinbiao.UserInfo" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%session.setAttribute("name",new UserInfo("Tom")); %>
</body>
</html>
然后创建set.jsp(用之前的set.jsp稍作修改即可,即上述代码);再创建remove.jsp(可直接使用之前的remove.jsp)和index.jsp(同理可直接使用);当我们点击set链接时,UserInfo类中valueBound方法就会执行,因为此时,通过该类创建的对象呗绑定在session中了;再点击remove则会执行valueUnbound方法,此时,删除session的name属性,对象解绑,执行方法。
HttpSessionActivationListener 接口
该接口用于监听实现该接口和Serializable 接口的Java类的对象随session钝化和活化的事件,若不实现该接口,则只能写到磁盘上,但不能读取出来;
实现HttpSessionActivationListener 接口的JavaBean对象可以感知自己被活化(从硬盘中读取session对象)和钝化(从内存中写到硬盘上)的事件;
当绑定到HttpSession对象中的对象将要随HttpSession对象被钝化(向硬盘中写入session对象)之前,web服务器调用该对象的void sessionWillPassivate(HttpSessionBindingEvent event)方法。javaBean要进行序列化。
当绑定到HttpSession对象中的对象将要随HttpSession对象被活化(从硬盘中读出来)之后,web服务器调用该对象的void sessionDidActive(HttpSessionBindingEvent event)方法。
session对象存储在tomcat服务器的work\Catalina\localhost\项目名下,文件名为SESSION.ser;
钝化和活化在计算机文件上的显示效果就是SESSION.ser文件的出现和消失;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
public class UserInfo implements Serializable,HttpSessionActivationListener {
private static final long serialVersionUID = 6565441155719184003L;
private String id;
public UserInfo(String id) {
this.id=id;
}
//项目发布时执行
public void sessionDidActivate(HttpSessionEvent arg0) {
System.out.println("sessionDidActivate");
}
//项目正常终止(邮件点击stop)时执行
public void sessionWillPassivate(HttpSessionEvent arg0) {
System.out.println("sessionWillPassivate");
}
}
index.jsp、set.jsp直接使用HttpSessionBindingListener 接口中的代码即可,当项目发布之后我们再人工正常终止时,会发现在tomcat服务器的work\Catalina\localhost\项目名下,文件名为SESSION.ser的文件生成,这个是钝化过程;当我们再次发布项目时,SESSION.ser文件消失,session对象重新写入内存中,这个是活化的过程。