Java Listener

前言

  • web 应用:即 ServletContext 对象(jsp 的隐式对象 application)。

1、Listener

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

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

2、监听 Context

  • 对 Context 的监听分 生命周期的监听,和 Context 上 Attribute 变化的监听 两种。

  • 生命周期的监听

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ContextListener implements ServletContextListener {

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

    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
    System.out.println("web 应用销毁");
    }
    }
    1
    2
    3
    <listener>
    <listener-class>listener.ContextListener</listener-class>
    </listener>
  • Attribute 变化的监听

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    public class ContextAttributeListener implements ServletContextAttributeListener {

    @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("替换属性");
    }
    }

3、监听 Session

  • 对 Session 的监听分 生命周期的监听,和 Session 上 Attribute 变化的监听 两种。

  • 生命周期的监听

    1
    2
    sessionCreated()            // session 创建的时候执行
    sessionDestroyed() // session 销毁的时候执行
  • Attribute 变化的监听

    1
    2
    3
    attributeAdded()            // 当在 session 中增加属性时触发
    attributeRemoved() // 当在 session 中移除属性时触发
    attributeReplaced() // 当替换 session 中的属性时触发

3.1 统计在线人数

  • 统计在线人数

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

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

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

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

    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
    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("一位用户离线");
    }
    }

4、监听 Request

  • 对 Request 的监听分 生命周期的监听,和 Request 上 Attribute 变化的监听 两部分。

  • 生命周期的监听

    1
    2
    requestInitialized()        // 当新创建了一个 Request 的时候触发,只要访问了服务端的资源,就会创建一个 Request,无论是 jsp, servlet 还是 html
    requestDestroyed() // 当本次请求结束的时候触发
  • Attribute 变化的监听

    1
    2
    3
    attributeAdded              // 当有新增属性时触发
    attributeReplaced // 当有替换属性时触发
    attributeRemoved // 当有移除属性时触发
文章目录
  1. 1. 前言
  2. 2. 1、Listener
  3. 3. 2、监听 Context
  4. 4. 3、监听 Session
    1. 4.1. 3.1 统计在线人数
  5. 5. 4、监听 Request
隐藏目录