1. 程式人生 > >與HttpSession有關的四個監聽器之間的區別

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

    }

}