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被重新激活