随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介:

当JavaBean类实现HttpSessionActivationListener 和 Serializable 接口后,就会自动感知是否随session一起被钝化或活化。

创建一个User类:

package demoJavaBean;

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

public class User implements HttpSessionActivationListener {
    @Override
    public void sessionDidActivate(HttpSessionEvent se) { // 活化
        System.out.println("!!! 我活化了!!");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {    // 钝化
        System.out.println("----- 我钝化了 ------");
    }
}

a.jsp:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>title</title>
</head>
<body>
<h1>session添加了一个数据!!</h1>
<%
    session.setAttribute("user", new demoJavaBean.User());
%>
</body>
</html>

b.jsp:

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>title</title>
</head>
<body>
<h1>获取到了session的信息!!!</h1>
<%
    out.print(session.getAttribute("user"));
%>
</body>
</html>

先访问a.jsp -- 等待一分钟后访问b.jsp:

查看控制台输出:

User类确实被钝化了;

但是活化获取的信息却是空,这是为什么?

首先钝化即是序列化,JavaBean类是不具备自动序列化的能力的,User类并没有实现Serializable序列化接口,

文章:https://www.cnblogs.com/0099-ymsml/p/16151297.html 和 https://www.cnblogs.com/0099-ymsml/p/16152690.html

中jsp文件内容可以被序列化是因为他是一个字符串对象,而String对象:

public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence

是实现了Serializable序列化接口的。

所以,User类的实现接口还应该加上Serializable接口:

package demoJavaBean;
import java.io.Serializable;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

public class User implements HttpSessionActivationListener,Serializable {
    @Override
    public void sessionDidActivate(HttpSessionEvent se) { // 活化
        System.out.println("!!! 我活化了!!");
    }

    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {    // 钝化
        System.out.println("----- 我钝化了 ------");
    }
}

此时再重复上面的步骤:

可以发现已经保存被序列化保存到硬盘之中了;

那么再进行活化查看信息:

成功访问到了活化后的信息,并且控制台也成功输出:

功能虽然用处不大,但是该有的特性还是必须要了解。

 

posted on 2022-04-16 14:38  时间完全不够用啊  阅读(87)  评论(0编辑  收藏  举报