IT兄弟连 JavaWeb教程 监听器4

  • 2019 年 10 月 5 日
  • 筆記

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ITXDL123/article/details/90746092

感知Session绑定事件的监听器

保存在Session域中的对象可以有多种状态:绑定(session.setAttribute("bean",Object)到Session中;从Session域中解除(session.removerAttribute("bean")绑定;随Session对象持久化到一个存储设备中;随Session对象从一个存储设备中恢复。

Servlet规范中定义了两个特殊的监听器接口HttpSessionBindingListener和HttpSessionActivationListener来帮助JavaBean对象了解自己在Session域中的这些状态,实现这两个接口的类不需要在web.xml文件中进行注册。

HttpSessionBindingListener接口

实现了HttpSessionBindingListener接口的JavaBean对象可以感知自己被绑定到Session中和Session中删除的事件。

当对象被绑定到HttpSession对象中时,web服务器调用该对象的valueBound(HttpSession Event event)方法。

当对象从HttpSession对象中解除绑定时,web服务器调用该对象的valueUnbound (HttpSessionBindingEvent event)方法。

HttpSessionBindingListener监听器范例:

● 编写监听器监听Session域中对象的状态,代码如下:

package com.xdl.listener;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionBindingListener;

/**

* MySessionBindingListener类实现了HttpSessionBindingListener接口

*/

public class MySessionBindingListener implements HttpSessionBindingListener{

private String name;

public MySessionBindingListener(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public void valueBound(HttpSessionBindingEvent event) {

System.out.println(name + "被加入session中了");

}

@Override

public void valueUnbound(HttpSessionBindingEvent event) {

System.out.println(name + "被session退出了");

}

}

● 编写SessionBindingListenerTest.jsp测试页面。

<%@page import="com.xdl.listener.MySessionBindingListener"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>兄弟连IT教育</title>

</head>

<body>

<%

//将MySessionBindingListener对象绑定到Session中

session.setAttribute("bean",new MySessionBindingListener("三十画生"));

//从Session中删除MySessionBindingListener对象

session.removeAttribute("bean");

%>

</body>

</html>

打开Tomcat服务器,运行结果如图14所示。

图14 MySessionBindingListener在控制台中输出的信息

● HttpSessionActivationListener接口

实现了HttpSessionActivationListener接口的JavaBean对象可以感知自己被活化(反序列化)和钝化(序列化)的事件。

当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被钝化(序列化)之前,web服务器调用该javabean对象的void sessionWillPassivate(HttpSessionEvent event) 方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被序列化(钝化)到硬盘中。

当绑定到HttpSession对象中的javabean对象将要随HttpSession对象被活化(反序列化)之后,web服务器调用该javabean对象的void sessionDidActive(HttpSessionEvent event)方法。这样javabean对象就可以知道自己将要和HttpSession对象一起被反序列化(活化)回到内存中。

HttpSessionActivationListener监听器范例:

● 编写监听器监听session中对象的活化和钝化事件,代码如下:

package com.xdl.listener;

import java.io.Serializable;

import javax.servlet.http.HttpSessionActivationListener;

import javax.servlet.http.HttpSessionEvent;

/**

* MySessionActivationListener 类实现了

* HttpSessionActivationListener 和 Serializable 接口

*/

public class MySessionActivationListener

implements HttpSessionActivationListener,Serializable {

private static final long serialVersionUID = 1L;

private String name;

public MySessionActivationListener(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public void sessionDidActivate(HttpSessionEvent se) {

System.out.println(name

+ "和session一起被序列化到硬盘了,session的id是:"

+ se.getSession().getId());

}

@Override

public void sessionWillPassivate(HttpSessionEvent se) {

System.out.println(name

+ "和session一起从硬盘反序列化回到内存了,session 的id是:"

+ se.getSession().getId());

}

}

● 了观察绑定到HttpSession对象中的MySessionActivationListener对象随HttpSession对象一起被钝化到硬盘上和从硬盘上重新活化回到内存中的的过程,我们需要借助tomcat服务器帮助我们完成HttpSession对象的钝化和活化过程,具体做法如下:

在WebContentMETA-INF文件夹下创建一个context.xml文件,如图15所示。

图15 创建context.xml文件

context.xml文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context>

<Manager className="org.apache.catalina.session.PersistentManager"

maxIdleSwap="1">

<Store className="org.apache.catalina.session.FileStore"

directory= "xdl"/>

</Manager>

</Context>

在context.xml文件文件中配置了1分钟之后就将HttpSession对象钝化到本地硬盘的一个xdl文件夹中。

● 编写SessionActivationListenerTest.jsp测试页面

<%@page import="com.xdl.listener.MySessionActivationListener"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>兄弟连IT教育</title>

</head>

<body>

一访问JSP页面,HttpSession就创建了,创建好的Session的Id是:${pageContext. session.id}

<hr>

<%

session.setAttribute("bean", new MySessionActivationListener("三十画生"));

%>

</body>

</html>

访问这个JSP页面,服务器就会马上创建一个HttpSession对象,然后将实现了HttpSessionActivationListener接口的JavaBean对象绑定到session对象中,这个jsp页面在等待1分钟之后没有人再次访问,那么服务器就会自动将这个HttpSession对象钝化(序列化)到硬盘上。

图16 创建了一个Session

图17 Session被钝化到了磁盘上

我们可以在tomcat服务器的workCatalinalocalhost XDLxdl文件夹下找到序列化到本地存储的session,如图18所示。

图18

当再次访问这个JSP页面时,服务器又会自动将已经钝化(序列化)到硬盘上HttpSession对象重新活化(反序列化)回到内存中。运行结果如图19所示。

图19 钝化的Session被重新激活