IT兄弟連 JavaWeb教程 監聽器4

感知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所示。

6bbc6d8ee6174146ba170b2b7f2b9820.png

圖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所示。

b7b1f48d42464a8c8369ba3d8426ed15.png

圖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對象鈍化(序列化)到硬盤上。

d1d2cd8b7f254036812e44775163440b.png

圖16  建立了一個Session

 

9407e4f7d91a40758d9a9750b50f61f3.png

圖17  Session被鈍化到了磁盤上

 

咱們能夠在tomcat服務器的work\Catalina\localhost\ XDL\xdl文件夾下找到序列化到本地存儲的session,如圖18所示。

55b532b11f724b08accb2be4b9635968.png

圖18 

 

當再次訪問這個JSP頁面時,服務器又會自動將已經鈍化(序列化)到硬盤上HttpSession對象從新活化(反序列化)回到內存中。運行結果如圖19所示。

fbd8d064db7241df950553d6bca8dc59.png

圖19  鈍化的Session被從新激活

相關文章
相關標籤/搜索