listener:监听器之HttpSessionBindingListener

User.java

package com.tinstu;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class User implements HttpSessionActivationListener , java.io.Serializable{

	//活化
	@Override
	public void sessionDidActivate(HttpSessionEvent arg0) {
		System.out.println("a 我 and session 活化");
		
	}
   //钝化
	@Override
	public void sessionWillPassivate(HttpSessionEvent arg0) {
		System.out.println("a i and session 钝化");		
	}
	

}

a.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<h1>向session中保存数据</h1>
<body>
<%
session.setAttribute("xxx",new com.tinstu.User());
%>
</body>
</html>

b.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>获取session中的数据</h1>
<%
out.print(session.getAttribute("xxx"));
%>

</body>
</html>

访问a.jsp后在访问b.jsp,一分钟过后输出:

 


打开网页输入 a.jsp 保存数据再输入 b.jsp 只能看见一个 usual 类的 toString 方法。

之后我们就会发现小 user 并没有陪 session 一起钝化硬盘上,因为小user已经死了。因为他已经添加到了 session 里面,而过了一分钟会显示“a i and session 钝化”说明小 user已 经死了并不在硬盘上。就好比:session 和小 usual 一起上了去往火星的车而在临上车前,小user却因为没有票而被赶下来了。而地球毁灭的时候,小 user 因为没有上车而毁灭了。

而之后我们如果做一个访问的过程。Session 中的小 user 并不会再出现。

而所谓的火星就是该文件家mysession。只有在此实现了序列化的接口,对象就无法到此。任何能被序列化的接口都必须满足一个前提就是实现序列化接口,而user 并没有满足序列化接口,所以才“死掉了”。

我们可以根据以下操作来查看我刚刚的字符串类是否实现序列化接口,我们可以看出 string 类型是有的。而 user并不可以。

为了保证这一问题我们在第6行加上 java.io.Serializable。这回 user 就可以跟着session 一起钝化到硬盘之上。

在网站上输入 a.jsp 保存数据,b.jsp 输出。这时就会显示出,表示此事 usual 有了序列化借口。而此时接口的作用就是来监听我们的 user是否跟随 session 钝化和活化,并没有实际意义,只不过拿来理解而已。

阅读剩余
THE END