与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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章