感知Session绑定的事件监听器

也称为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;

扫描二维码关注公众号,回复: 9617932 查看本文章

钝化和活化在计算机文件上的显示效果就是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对象重新写入内存中,这个是活化的过程。

发布了99 篇原创文章 · 获赞 3 · 访问量 1239

猜你喜欢

转载自blog.csdn.net/qq_44971038/article/details/103766260