感知Session綁定事件的監聽器html
保存在Session域中的對象能夠有多種狀態:綁定(session.setAttribute("bean",Object)到Session中;從Session域中解除(session.removerAttribute("bean")綁定;隨Session對象持久化到一個存儲設備中;隨Session對象從一個存儲設備中恢復。java
Servlet規範中定義了兩個特殊的監聽器接口HttpSessionBindingListener和HttpSessionActivationListener來幫助JavaBean對象瞭解本身在Session域中的這些狀態,實現這兩個接口的類不須要在web.xml文件中進行註冊。web
HttpSessionBindingListener接口apache
實現了HttpSessionBindingListener接口的JavaBean對象能夠感知本身被綁定到Session中和Session中刪除的事件。tomcat
當對象被綁定到HttpSession對象中時,web服務器調用該對象的valueBound(HttpSession Event event)方法。服務器
當對象從HttpSession對象中解除綁定時,web服務器調用該對象的valueUnbound (HttpSessionBindingEvent event)方法。session
HttpSessionBindingListener監聽器範例:jsp
● 編寫監聽器監聽Session域中對象的狀態,代碼以下:ide
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對象的鈍化和活化過程,具體作法以下:
在WebContent\META-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服務器的work\Catalina\localhost\ XDL\xdl文件夾下找到序列化到本地存儲的session,如圖18所示。
圖18
當再次訪問這個JSP頁面時,服務器又會自動將已經鈍化(序列化)到硬盤上HttpSession對象從新活化(反序列化)回到內存中。運行結果如圖19所示。
圖19 鈍化的Session被從新激活