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

相关文章
相关标签/搜索