Listener监听器

129 阅读4分钟

什么是 Listener?

  • Listener ,监听器,是 Servlet 规范中一种组件,用于监听Web应用程序中的事件,以便在事件发生时采取一些自定义的动作。
  • Listener 使用了观察者模式,也叫发布订阅模式

Listener 的类型

JavaWeb中,不同的事件对应不同的 Listener 接口。总共有 8 个 Listener 接口,按Listener监听的事件域,可以分为 4 类:应用域Listener、会话域Listener、请求域Listener、异步Listener。

  • 应用域Listener: 监听应用域事件
  • 会话域Listener: 监听会话域事件
  • 请求域Listener: 监听请求域事件
  • 异步 Listener: 监听异步操作事件

image.png

  • 请求域:表示在处理一个用户请求期间存活的数据,请求域中的数据在该请求期间可以使用。这些数据在用户提交请求时创建,在该请求被响应之前一直存在。用 HttpServletRequest 实现请求域。
  • 会话域:表示在一个用户会话期间存活的数据,同一个会话内的不同请求可以共享会话域数据。这些数据从会话开始时开始创建,在该会话结束前一直存在。用 HttpSession 来实现会话域。
  • 应用域:表示应用程序中所有用户共享的数据,这些数据在应用程序的启动时创建,在应用程序关闭前一直存在。用 ServletContext 来实现应用域。

关于 ServletContext

  • ServletContext 是 JavaWeb中的一个接口,提供了一系列方法用来共享数据。
  • ServletContext 对象由 Web 容器负责创建,每个 Web 应用程序只会有一个 ServletContext 对象实例,并在整个应用程序的生命周期中有效。它可以被所有在这个Web应用程序中运行的servlet共享,可以用来传递数据,存储全局变量和监听Web应用程序的生命周期事件。
  • 可以通过getServletContext() 方法获得 ServletContext 对象。

应用域:

  • ServletContextListener:用于监听 ServletContext 对象的创建和销毁事件,可以在 ServletContext 对象初始化时执行一些初始化代码,也可以在 ServletContext 对象销毁时执行一些清理代码。
  • ServletContextAttributeListener:用于监听 ServletContext 对象中属性的添加、删除和替换事件,可以在属性添加时执行一些逻辑处理,比如更新配置信息等;在属性删除时执行一些清理操作,比如释放资源等。

会话域:

  • HttpSessionListener:用于监听 HttpSession 对象的创建和销毁事件,可以在 HttpSession 对象初始化时执行一些初始化代码,也可以在 HttpSession 对象销毁时执行一些清理代码。
  • HttpSessionAttributeListener:用于监听 HttpSession 对象中属性的添加、删除和替换事件,可以在属性添加时执行一些逻辑处理,比如更新用户信息等,在属性删除时执行一些清理操作,比如清空数据等。
  • HttpSessionActivationListener:用于监听 HttpSession 对象的钝化和活化事件,可以在 HttpSession 对象钝化时执行一些清理操作,比如将 Session 中的数据写入硬盘等,在 HttpSession 对象活化时执行一些初始化代码,比如重新读取数据等。

请求域:

  • ServletRequestListener:用于监听 HttpServletRequest 对象的创建和销毁事件,可以在 HttpServletRequest 对象初始化时执行一些初始化代码,也可以在 HttpServletRequest 对象销毁时执行一些清理代码。
  • ServletRequestAttributeListener:用于监听 HttpServletRequest 对象中属性的添加、删除和替换事件,可以在属性添加时执行一些逻辑处理,比如更新请求参数等,在属性删除时执行一些清理操作,比如释放资源等。

其他:

  • AsyncListener:用于监听异步操作的事件,可以在异步操作完成时执行回调函数,比如通知用户异步任务已完成等。

使用 Listener

  • 创建 Listener 类
  • 根据感兴趣的事件,选择对应的 Listener 接口去实现
  • 在 web.xml 中配置 Listener

image.png

image.png

实战:基于 Listener 实现在线人数统计

实现思路:

  • 服务启动时在 ServletContext 创建变量 onlineCount = 0,记录在线人数
  • 用存活的 Session 个数来表示在线人数
  • 实现 HttpSessionListener 接口
    • 当有 Session 创建时,在线人数加1
    • 当有 Session 销毁时,在线人数减1