Listener

前言

1、Listener

  • Listener 的作用是用于监听 Web 应用的创建和销毁,以及在其上 attribute 发生的变化。

  • 除了对 Web 应用的监听外,还能监听 SessionRequest 的生命周期,以及他们的 attribute 发生的变化。

2、监听 Context

  • 对 Context 的监听分两种

    • 生命周期的监听
    • Attribute 变化的监听
  • 编写 ContextListener.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
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.ServletContextAttributeEvent;
    import javax.servlet.ServletContextAttributeListener;

    public class ContextListener implements ServletContextListener, ServletContextAttributeListener {

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
    System.out.println("web 应用初始化");
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    System.out.println("web 应用销毁");
    }

    @Override
    public void attributeAdded(ServletContextAttributeEvent e) {
    System.out.println("增加属性 ");
    System.out.println("属性是" + e.getName());
    System.out.println("值是" + e.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent e) {
    System.out.println("移除属性 ");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent e) {
    System.out.println("替换属性");
    }
    }
  • 配置 web.xml

    1
    2
    3
    <listener>
    <listener-class>listener.ContextListener</listener-class>
    </listener>

3、监听 Session

  • 对 Session 的监听分两种

    • 生命周期的监听
    • Attribute 变化的监听
  • 编写 SessionListener.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
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;

    public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {

    @Override
    public void sessionCreated(HttpSessionEvent e) {
    System.out.println("监听到 session 创建, sessionid 是: " + e.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent e) {
    System.out.println("监听到 session 销毁, sessionid 是: " + e.getSession().getId());
    }

    @Override
    public void attributeAdded(HttpSessionBindingEvent e) {
    System.out.println("session 增加属性 ");
    System.out.println("属性是" + e.getName());
    System.out.println("值是" + e.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent e) {
    System.out.println("session 移除属性 ");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent e) {
    System.out.println("session 替换属性 ");
    }
    }
  • 配置 web.xml

    1
    2
    3
    <listener>
    <listener-class>listener.SessionListener</listener-class>
    </listener>

3.1 统计在线人数

  • HTTP 协议是短链接的,所以无法在服务端根据建立了多少连接来统计当前有多少人在线。不过可以通过统计 session 有多少来估计在线人数

  • 一旦一个用户访问服务器,就会创建一个 session。如果该用户持续访问,那么该 session 会持续有效。

  • 如果经历了 30 分钟,该用户也没有做任何操作,就表示该用户 “下线” 了,其对应的 session 也会被销毁。

  • 所以可以通过统计有多少 session 被保留来估计当前在线人数。

  • 编写 OnlineNumberListener.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
    import javax.servlet.ServletContext;

    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;

    public class OnlineNumberListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent e) {

    ServletContext application = e.getSession().getServletContext();

    Integer online_number = (Integer) application.getAttribute("online_number");

    if (null == online_number)
    online_number = 0;
    online_number++;
    application.setAttribute("online_number", online_number);

    System.out.println("新增一位在线用户");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent e) {

    ServletContext application = e.getSession().getServletContext();

    Integer online_number = (Integer) application.getAttribute("online_number");

    if(null==online_number){
    online_number = 0;
    }
    else
    online_number--;
    application.setAttribute("online_number", online_number);
    System.out.println("一位用户离线");
    }
    }
  • 配置 web.xml

    1
    2
    3
    <listener>
    <listener-class>listener.OnlineNumberListener</listener-class>
    </listener>
  • 编写 checkOnlineNumber.jsp

    1
    2
    3
    4
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>

    当前 在线人数:${online_number}

4、监听 Request

  • 对 Request 的监听分两部分

    • 生命周期的监听
    • Attribute 变化的监听
  • 编写 RequestListener.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
    import javax.servlet.ServletRequestEvent;
    import javax.servlet.ServletRequestListener;
    import javax.servlet.ServletRequestAttributeEvent;
    import javax.servlet.ServletRequestAttributeListener;

    public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
    System.out.println("创建了一个 Request ");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
    System.out.println("销毁了一个 Request ");
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent e) {
    System.out.println("request 增加属性 ");
    System.out.println("属性是" + e.getName());
    System.out.println("值是" + e.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
    System.out.println("request 移除属性 ");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
    System.out.println("request 替换属性 ");
    }
    }
  • 配置 web.xml

    1
    2
    3
    <listener>
    <listener-class>listener.RequestListener</listener-class>
    </listener>
文章目录
  1. 1. 前言
  2. 2. 1、Listener
  3. 3. 2、监听 Context
  4. 4. 3、监听 Session
    1. 4.1. 3.1 统计在线人数
  5. 5. 4、监听 Request
隐藏目录