會話的持久化:html
本篇解決一個問題,就是當正在瀏覽頁面的時候服務器忽然關閉,瀏覽器不關閉,當再次開啓服務器時還可以恢復關閉時的頁面java
HttpSessionActivationListener
實現此接口的JavaBean,能夠感知本身被活化(從硬盤到內存)和鈍化(從內存到硬盤)的過程。
若是須要同時保存Session中的JavaBean則JavaBean也要實現Serializable序列化接口。
實現此接口的JavaBean與HttpSessionBindingListener同樣,沒必要配置到web.xml中。
要實現此功能,必需要先配置如下信息:web
第一步:書寫一個JavaBean,並實現HttpSessionActivationListener接口以下:apache
第二步:JSP頁面,判斷是否存在Person,若是沒有將Person放到Session中:瀏覽器
第三步:配置Tomcat的Server.xml文件或是將配置好的xml發佈文件放到CATALIINA_HOME\conf\Catalina\localhost目錄下:tomcat
配置文件以下:
directory=「d:/a」是指Session文件保存的目錄。服務器
第四步:測試session
1:屢次開啓新的瀏覽器窗口,並記錄SESSIONID。
2:使用shutdown.bat關閉tomcat應用。
3:觀察指定的目錄下是否存在*.session文件。
4:再次從新啓動tomcat,並使用http://localhost:8080/project;jsessionid=xxxxx指定sessionid的方式訪問服務器(若是瀏覽器沒關閉的話就不用帶上jsessionid)。
5:觀察是否爲關閉tomcat以前的同一個Session。
6:通常狀況下,PersistentManager持久化Session與Cookie共同使用。
7:HttpSessionActivationListener只作爲監聽類,監聽本身是否鈍化或是活化。dom
示例代碼以下:jsp
Person.java
-
-
-
import java.io.Serializable;
-
-
import javax.servlet.http.HttpSessionActivationListener;
-
import javax.servlet.http.HttpSessionEvent;
-
-
public class Person implements Serializable, HttpSessionActivationListener {
-
-
-
public Person(String name) {
-
-
-
-
-
public void sessionDidActivate(HttpSessionEvent arg0) {
-
System.out.println(
this+"從硬盤讀取並活化了");
-
-
-
-
public void sessionWillPassivate(HttpSessionEvent arg0) {
-
System.out.println(
this+"保存到硬盤");
-
-
-
-
public String toString() {
-
return "Person [name=" + name + "]---"+super.toString();
-
-
index.jsp
-
<%
@page import="java.text.SimpleDateFormat"%>
-
<%@ page language=
"java" import="java.util.*,cn.hncu.domain.Person" pageEncoding="UTF-8"%>
-
-
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN">
-
-
-
-
-
-
<h2>演示session鈍化與活化技術</h2>
-
-
if (session.getAttribute("p")==null){
-
Person p=
new Person(""+new Random().nextInt(100));
-
session.setAttribute(
"p", p);
-
-
System.out.println(session.getId()+
"---"+session.getAttribute("p"));
-
SimpleDateFormat sdf=
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
-
Date d=
new Date(session.getCreationTime());
-
System.out.println(sdf.format(d));
-
-
-
配置xml文件:aa.xml
-
<Context path=
"/sessionActivationWeb" docBase="D:/Workspaces/MyEclipseBlue2014/sessionActivationWeb/WebRoot">
-
<Manager className=
"org.apache.catalina.session.PersistentManager"
-
-
<Store className=
"org.apache.catalina.session.FileStore"
-
directory=
"d:/a"> </Store>
-
-
而後關於瀏覽器訪問,這裏要說一下;就是在瀏覽器上的http://localhost:8080/的後面要加上的不是項目名,而是上面配置的xml文件的名字,我這裏這個文件名是叫aa.xml,所以在訪問的時候我輸的是http://localhost:8080/aa,所以你能夠將這個xml文件的文件名改成你的項目名。
第一次啓動時輸出信息以下:
此時關閉服務器:
d盤a目錄下生成以下文件:
此時在其啓動服務器,而後刷新瀏覽器(若瀏覽器已經關閉,訪問時請帶上上次訪問的jsessionid):
輸出信息以下:
對比一下第一次訪問時的信息,發現徹底同樣的