與HttpSession有關的四個監聽器之間的區別
與HttpSession有關的四個監聽器之間的區別
簡介:HttpSession常用的四個監聽器HttpSessionBindingListener,HttpSessoinActivationListener,HttpSessionListener和HttpSessionAttributeListener的區別
一、HttpSessionListener和HttpSessionAttributeListener的區別
1.HttpSessionListener: HttpSessionListener是對Session的一個監聽,主要監聽關於Session的兩個事件,即初始化和銷燬。針對所有的
VoidsessionCreated(HttpSessionEvent se):當session建立時會收到通知。
VoidsessionDestroyed(HttpSessionEvent se):當session銷燬時也會收到通知。
2.HttpSessionAttributeListener
HttpSessionAttributeListener是SessionAttribute的監聽,當在會話物件中加入屬性、移除屬性或替換屬性時,就會呼叫HttpSessionAttributeListener監聽器。可以和
介面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 +"退出。"); } } |