Listener用于监控Session内的对象,分别是HttpSessionBindingListener与HttpSessionActivationListener。它们的触发时机分别为:

  • HttpSessionBindingListener:当对象被放到Session里时执行valueBound(HttpSessionBindingEvent event)方法。当对象被从Session里移除时执行valueUnbound(HttpSessionBingdingEvent event)方法。对象必须实现该Listener接口。
  • HttpSessionActivationListener:服务器关闭时,会将Session里的内容保存到硬盘上,这个过程叫做钝化。服务器重新启动时,会将Session内容从硬盘上重新加载。当Session里的对象被钝化时会执行sessionWillPassivate(HttpSessionEvent event)方法。当对象被重新加载时执行sessionDidActivate(HttpSessionEvent event)。对象必须实现该Listener接口。

事例如下:

package linstener;

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Date;
import java.util.Locale; import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
import javax.servlet.http.HttpSessionEvent; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; public class PersonInfo implements HttpSessionActivationListener,HttpSessionBindingListener,Serializable { /**
*
*/
private static final long serialVersionUID = 1L;
private Log log=LogFactory.getLog(this.getClass());
private String name;
private Date dateCreated; @Override
public void sessionDidActivate(HttpSessionEvent arg0) {
//从硬盘恢复后被调用
HttpSession session =arg0.getSession();
log.info(this+"已经成功硬盘中加载。sessionid:" +session.getId());
} @Override
public void sessionWillPassivate(HttpSessionEvent arg0) {
//即将被钝化到硬盘时调用
HttpSession session=arg0.getSession();
log.info(this+"即将保存到硬盘。sessionid:"+session.getId());
} @Override
public void valueBound(HttpSessionBindingEvent arg0) {
//被放入session前调用
HttpSession session=arg0.getSession();
String name=arg0.getName();
log.info(this+"被绑定到session\""+session.getId()+"\"的"+name+"属性上。");
this.setDateCreated(new Date());
} @Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
//从session 中移除后调用
HttpSession session=arg0.getSession();
String name=arg0.getName();
log.info(this+"被从session\""+session.getId()+"\"的"+name+"属性上移除。");
} public Date getDateCreated() {
return dateCreated;
} public void setDateCreated(Date dateCreated) {
this.dateCreated = dateCreated;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "PersonInfo("+name+")";
} }

这两个Listener监听的是Session中的对象而非Session等,因此不需要在web.xml中声明。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<jsp:directive.page import="linstener.PersonInfo" />
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
PersonInfo personInfo =(PersonInfo)session.getAttribute("personInfo");
if(personInfo==null){
personInfo=new PersonInfo();
personInfo.setName("Alex Geng");
session.setAttribute("personInfo", personInfo);
out.println("PersonInfo 对象不存在。已经成功新信件。sessionId:"+session.getId());
}
else{
out.println("PersonInfo对象存在。无需新建。sessionId:"+session.getId());
}
%>
</body>
</html>

Listener 监听Session内的对象的更多相关文章

  1. Listener 监听对象的属性变化

    Listener用于监听Session.context.Request的属性变化,接口名称格式为xxxAttributeListener,包括HttpSessionAttributeListener. ...

  2. Listener 监听对象的创建和销毁

    HttpSessionListener.ServletContextListener.ServletRequestListener分别用于控制Session.context.request的创建和销毁 ...

  3. java多个listener监听

    java 多个listener 监听方法 在class 名称上一行添加@Listeners 括号中用逗号隔开 @Listeners({com.example.MyListener.class,com. ...

  4. SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期

    SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期 一.拦截器配置 <mvc:interceptors> <mvc:interceptor> < ...

  5. 【Java EE 学习 21 上】【其它类型的监听器】【使用HttpSessionActivationListener监听session的活化和钝化】

    一.ServletContextListener  Method Summary  void contextDestroyed(ServletContextEvent sce)           R ...

  6. HttpSessionListener和HttpSessionBindingListener监听session的销毁

    1. 使用HttpSessionListener public class OnlineUserListener implements HttpSessionListener { public voi ...

  7. javaWeb学习之Listener监听

    ] 一.监听器Listener javaEE包括13门规范 在课程中主要学习 servlet技术 和 jsp技术 其中 servlet规范包括三个技术点:servlet  listener  filt ...

  8. Android Listener 监听的几种写法

    Android中,View的Listener方法,在是否使用匿名类匿名对象时,有各种不同的写法. OnClickListener和其他Listener方法一样,都是View类的接口,重载实现后就能使用 ...

  9. 怎样绕过oracle listener 监听的password设置

     怎样绕过oracle 监听的password设置: 1.找到监听进程pid ,并将它kill 掉 ps -ef|grep tns [oracle@lixora admin]$ ps -ef|gr ...

随机推荐

  1. 跨系统-跨数据库访问表或创建映射视图-PB访问数据库的特殊处理

    一. 在项目中可能会遇到在一个项目中会出现多个数据库的操作. 二. 也可能会多个系统多个数据库之间进行交互操作显示. 三. 经常需要两个数据库关联查询或需要翻译显示内容时会很麻烦. 四. 今天就有个简 ...

  2. ext: gridpanel中的点击事件的参数是什么意思?

    listeners: {      // 当用户单击列表项时激发该函数      itemclick: function(view, record, item, index, evt)  //①    ...

  3. django shortcuts 详解

    django中为了方便web的开发.定义了许多有用的shortcut .由于shortcut带来的方便用文字描述是有点苍白的.所以在这里打算用一些例子来说明 一.一个hello world 的例子: ...

  4. WCF 有零个操作;协定必须至少有一个操作

    转自 http://www.cnblogs.com/bdqlaccp/archive/2011/12/31/2308905.html 建立WCF服务后, 服务类中写上了相应的操作,并且方法上加上了[O ...

  5. ios处理键盘

    #pragma mark - Keyboard - (void)addKeyboardNoti { [[NSNotificationCenter defaultCenter] addObserver: ...

  6. [svc][dhcp]关于无线ap自动发现选项dhcp option43配置

    有人问到option43的问题,查了点资料.总结了下win和linux的option43的配置: windows2003 http://www.h3c.com.cn/Service/Channel_S ...

  7. Android4.42-Settings源代码分析之蓝牙模块Bluetooth总体实现(总)

    本文为博主原创,转载请注明出处:http://blog.csdn.net/zrf1335348191/article/details/50995466 蓝牙相关代码已在另两篇文章中介绍,有须要的能够查 ...

  8. 使用 RestTemplate 调用 restful 服务

    什么是RestTemplate? RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效 ...

  9. angular控制器的执行顺序和服务的注入情况

    这篇文章到底要讲什么呢? 这必须要从栗子开始讲起... 看下面这两段代码: demo1: http://jsfiddle.net/ujzmvp3j/1/ demo2: http://jsfiddle. ...

  10. [AWS vs Azure] 云计算里AWS和Azure的探究(3)

    云计算里AWS和Azure的探究(3) ——Amazon EC2 和 Windows Azure Virtual Machine 今天我来比较一下AWS EC2和Azure VM的具体流程上的异同.以 ...