Servlet监听器(Listener)
Servlet监听器(Listener)
Servlet监听器(Listener)是Java Servlet规范中定义的一种特殊类,它可以监听Web应用程序中的特定事件,并在这些事件发生时执行相应的处理。通过监听器,开发者可以在无需修改已有代码的情况下,对Servlet容器的生命周期事件、Http会话的创建和销毁、Http session属性的增加和删除、Http请求的初始化和结束等进行监控和操作。
Servlet监听器主要包括以下几种:
-
ServletContextListener:用于监听ServletContext的创建和销毁事件。当Web应用启动或停止时,Servlet容器会自动调用该监听器的
contextInitialized()和contextDestroyed()方法。 -
HttpSessionListener:用于监听HttpSession的创建和销毁事件。当一个HttpSession被创建或销毁时,Servlet容器会调用该监听器的
sessionCreated(HttpSessionEvent se)和sessionDestroyed(HttpSessionEvent se)方法。 -
HttpSessionAttributeListener:用于监听HttpSession中属性的增加、删除和替换事件。
-
ServletRequestListener:用于监听ServletRequest的初始化和结束事件。
-
ServletRequestAttributeListener:用于监听ServletRequest中属性的添加、删除和替换事件。
使用Servlet监听器可以实现如统计在线人数、用户登录登出通知、系统初始化与关闭清理资源等功能,在实际开发中具有重要作用。
| Listener接口 | Event类(事件类型) | 场景 |
|---|---|---|
| ServletContextListener | ServletContextEvent | 场景: |
| ServletContextAttributeListener | ServletContextAttributeEvent | 你想知道一个web应用上下文中是否增加、删除或替换了一个属性 |
| HttpSessionListener | HttpSessionEvent | 场景: |
| HttpSessionActivationListener | HttpSessionEvent | (活化或者钝化,写到javabean)你有一个属性类,而且希望这个类型的对象在其绑定的会话迁移到另一个JVM时得到通知 |
| HttpSessionAttributeListener | HttpSessionBindingEvent | 场景: |
| HttpSessionBindingListener | HttpSessionBindingEvent | 场景:(实体类) |
| ServletRequestListener | ServletRequestEvent | 场景: |
| ServletRequestAttributeListener | ServletRequestAttributeEvent | 增加、删除或替换一个请求属性时你希望能够知道 |
实战应用场景:
-
统计在线人数:
- 实现一个
HttpSessionListener,每当一个新的HttpSession被创建时(即用户访问网站并建立新的会话时),sessionCreated()方法会被调用,可以在此处记录用户的登录状态。当会话过期或被显式注销时,sessionDestroyed()方法会被调用,这时可以减去一个在线用户数。
public class OnlineUserCounter implements HttpSessionListener { // 维护一个全局计数器或集合存储在线用户信息 public void sessionCreated(HttpSessionEvent event) { // 增加在线人数 } public void sessionDestroyed(HttpSessionEvent event) { // 减少在线人数 } } - 实现一个
-
系统初始化与资源加载:
- 使用
ServletContextListener可以在Web应用启动和关闭时执行初始化和清理任务。例如,在contextInitialized()方法中可以读取配置文件、初始化数据库连接池或其他单例服务,在contextDestroyed()方法中释放资源,确保没有内存泄漏等问题。
public class StartupShutdownListener implements ServletContextListener { public void contextInitialized(ServletContextEvent sce) { // 初始化应用上下文相关的资源 } public void contextDestroyed(ServletContextEvent sce) { // 关闭应用时释放资源 } } - 使用
-
会话属性变更通知:
- 若需要对HttpSession中的属性变化进行响应,可以实现
HttpSessionAttributeListener,这样当某个属性添加、移除或替换时,对应的方法将会被触发。
public class SessionAttributeListenerImpl implements HttpSessionAttributeListener { public void attributeAdded(HttpSessionBindingEvent event) { // 当新属性添加到会话时执行操作 } public void attributeRemoved(HttpSessionBindingEvent event) { // 当会话属性被移除时执行操作 } public void attributeReplaced(HttpSessionBindingEvent event) { // 当会话属性被替换时执行操作 } } - 若需要对HttpSession中的属性变化进行响应,可以实现
-
请求级别事件处理:
ServletRequestListener可用于跟踪所有请求的开始和结束时间,用于性能监控或者日志记录。
public class RequestLoggingListener implements ServletRequestListener { public void requestInitialized(ServletRequestEvent sre) { // 请求开始时记录时间或日志 } public void requestDestroyed(ServletRequestEvent sre) { // 请求结束时记录时间或日志 } } -
请求属性变更监听:
- 类似地,
ServletRequestAttributeListener可以监听请求属性的变动,这对于跨请求处理器间的数据传递或跟踪非常有用。
- 类似地,

浙公网安备 33010602011771号