與HttpSession有關的四個監聽器之間的區別

HttpSession有關的四個監聽器之間的區別

簡介:HttpSession常用的四個監聽器HttpSessionBindingListenerHttpSessoinActivationListenerHttpSessionListenerHttpSessionAttributeListener的區別

 

一、HttpSessionListener和HttpSessionAttributeListener的區別

1.HttpSessionListener:
        HttpSessionListener是對Session的一個監聽,主要監聽關於Session的兩個事件,即初始化和銷燬。針對所有的Sessoin
接口HttpSessionListener有兩個方法,分別爲:

      VoidsessionCreated(HttpSessionEvent se):當session創建時會收到通知。

      VoidsessionDestroyed(HttpSessionEvent se):當session銷燬時也會收到通知。

2.HttpSessionAttributeListener
       HttpSessionAttributeListenerSessionAttribute的監聽,當在會話對象中加入屬性、移除屬性或替換屬性時,就會調用HttpSessionAttributeListener監聽器。可以和HttpSessionBindingEvent合作着使用。也是針對所有的Sessoin


接口HttpSessionAttributeListener3個方法:

    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的屬性的添加、修改和刪除。

二、HttpSessionListenerHttpSessionBindingListener的區別

1.配置

HttpSessionListener需要在web.xml中配置才能使用

HttpSessionBindingListener不需要配置。

 

2. 使用方式和監聽範圍

HttpSessionListener需要實例化後設置到web.xml中就可以使用,監聽整個應用中的所有session

HttpSessionBindingListener必須實例化後放入某一個session中,纔可以進行監聽。通常都是一對一的監聽


總結:如果一個對象想要在自身被綁定到session或者從session中解綁的時候得到通知,則該對象需要實現HttpSessionBindingListener監聽器。該監聽器的實現類不需要再部署描述文件中配置。

可以用來自作用戶列表:

我們可以讓每個listener對應一個username,這樣就不需要每次再去session中讀取username,進一步可以將所有操作在線列表的代碼都移入listener,更容易維護。

 

三、HttpSessionBindingListenerHttpSessionActivationListener的區別。

 

(實現這兩個接口的類不需要 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 +"退出。");

 

    }

 

}

 

 

 

發佈了36 篇原創文章 · 獲贊 149 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章