與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 +"退出。");
}
} |