与HttpSession有关的四个监听器之间的区别
与HttpSession有关的四个监听器之间的区别
简介:HttpSession常用的四个监听器HttpSessionBindingListener,HttpSessoinActivationListener,HttpSessionListener和HttpSessionAttributeListener的区别
一、HttpSessionListener和HttpSessionAttributeListener的区别
1.HttpSessionListener:
HttpSessionListener是对Session的一个监听,主要监听关于Session的两个事件,即初始化和销毁。针对所有的Sessoin
接口HttpSessionListener有两个方法,分别为:
VoidsessionCreated(HttpSessionEvent se):当session创建时会收到通知。
VoidsessionDestroyed(HttpSessionEvent se):当session销毁时也会收到通知。
2.HttpSessionAttributeListener
HttpSessionAttributeListener是SessionAttribute的监听,当在会话对象中加入属性、移除属性或替换属性时,就会调用HttpSessionAttributeListener监听器。可以和HttpSessionBindingEvent合作着使用。也是针对所有的Sessoin
接口HttpSessionAttributeListener有3个方法:
public voidattributeAdded(HttpSessionBindingEvent se):在session中添加对象时触发此操作
public voidattributeRemoved(HttpSessionBindingEvent se):修改、删除session中添加对象时触发此操作
public voidattributeReplaced(HttpSessionBindingEvent se):在Session属性被重新设置时
注意:使用这两个监听器接口需要配置web.xml文件
<listener>
<listener-class>监听器的全类名</listener-class>
</listener>
总结:
相同点:只需要设置到web.xml中就可以监听整个应用中的所有session。
不同点:HttpSessionListener只是监听session的创建和销毁,而
HttpSessionAttributeListener是监听Session的属性的添加、修改和删除。
二、HttpSessionListener与HttpSessionBindingListener的区别
1.配置
HttpSessionListener需要在web.xml中配置才能使用
HttpSessionBindingListener不需要配置。
2. 使用方式和监听范围
HttpSessionListener需要实例化后设置到web.xml中就可以使用,监听整个应用中的所有session
HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。通常都是一对一的监听。
总结:如果一个对象想要在自身被绑定到session或者从session中解绑的时候得到通知,则该对象需要实现HttpSessionBindingListener监听器。该监听器的实现类不需要再部署描述文件中配置。
可以用来自作用户列表:
我们可以让每个listener对应一个username,这样就不需要每次再去session中读取username,进一步可以将所有操作在线列表的代码都移入listener,更容易维护。
三、HttpSessionBindingListener与HttpSessionActivationListener的区别。
(实现这两个接口的类不需要 web.xml文件中进行注册)
1.实现HttpSessionBindingListener接口
实现了HttpSessionBindingListener接口的JavaBean 对象可以感知自己被绑定到Session 中和从Session 中删除的事件:
绑定对象:
当对象被绑定到 HttpSession 对象中时,web 服务器调用该对象的 void valueBound(HttpSessionBindingEvent event)方法
当对象从 HttpSession 对象中解除绑定时,web 服务器调用该对象的void valueUnbound(HttpSessionBindingEvent event)方法
2.实现httpSessionActivationListenter接口:
实现了HttpSessionActivationListener接口的JavaBean 对象可以感知自己被活化和钝化的事件
当绑定到HttpSessoion 对象中的对象将要随HttpSession对象被钝化之前,web服务器调用如下方法,
sessionWillPassivate(HttpSessionBindingEvent event)方法;
当绑定到 HttpSession 对象中的对象将要随 HttpSession 对象被活化之后,web服务器调用该对象的
void sessionDidActive(HttpSessionBindingEvent event)方法
活化和钝化:
1. (钝化) Session对象持久化到一个存储设备中
2. (活化) Session对象从一个存储设备中恢复
(注意:实现HttpSessionActivationListener接口还必须实现Serializable序列化接口。)
总结:
使用的情景不同:
HttpSessionBindingListener是在绑定到Session中,从 Session域中解除绑定时使用。(在内存中)
HttpSessionActivationListener是在对象活化和钝化时时候用(磁盘和内存)。
实例利用HttpSessionBindingListener制作在线列表
Jsp代码
1 2 3 4 5 6 7 8 9 10 11 12 |
<%@page import="com.test.OnlineUserBindingListener"%> <%@ page contentType="text/html;charset=utf-8"%> <%@ page import="java.util.*"%> <% request.setCharacterEncoding("UTF-8"); // 取得登录的用户名 String username = request.getParameter("username"); // 把用户名放入在线列表 session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username)); // 成功 response.sendRedirect("result.jsp"); %> |
|
Java代码 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.test;
import java.util.ArrayList; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionBindingEvent; import javax.servlet.http.HttpSessionBindingListener;
public class OnlineUserBindingListenerimplements HttpSessionBindingListener { String username;
public OnlineUserBindingListener(String username){ this.username=username; } public void valueBound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext(); // 把用户名放入在线列表 List onlineUserList = (List) application.getAttribute("onlineUserList"); // 第一次使用前,需要初始化 if (onlineUserList == null) { onlineUserList = new ArrayList(); application.setAttribute("onlineUserList", onlineUserList); } onlineUserList.add(this.username); }
public void valueUnbound(HttpSessionBindingEvent event) { HttpSession session = event.getSession(); ServletContext application = session.getServletContext();
// 从在线列表中删除用户名 List onlineUserList = (List) application.getAttribute("onlineUserList"); onlineUserList.remove(this.username); System.out.println(this.username +"退出。");
}
} |
下一篇: web.xml配置文件元素详解