Java的Servlet的监听器Listener 笔记250417

分类1:
一、生命周期监听器
监听容器(如 Tomcat)中应用、会话或请求的创建与销毁。
| 监听器接口 | 触发事件 | 典型用途 | 
|---|---|---|
| ServletContextListener | 应用启动 ( contextInitialized)、关闭 (contextDestroyed) | 全局资源管理(如数据库连接池) | 
| HttpSessionListener | 会话创建 ( sessionCreated)、销毁 (sessionDestroyed) | 统计在线用户数 | 
| ServletRequestListener | 请求开始 ( requestInitialized)、结束 (requestDestroyed) | 记录请求耗时或日志 | 
二、属性监听器
监听特定作用域(应用、会话、请求)中的属性增删改操作。
| 监听器接口 | 触发事件 | 典型用途 | 
|---|---|---|
| ServletContextAttributeListener | 应用作用域属性添加、替换、移除 | 全局配置变更日志或刷新缓存 | 
| HttpSessionAttributeListener | 会话作用域属性添加、替换、移除 | 跟踪用户登录状态或购物车变更 | 
| ServletRequestAttributeListener | 请求作用域属性添加、替换、移除 | 调试请求属性或数据校验 | 
三、会话绑定监听器
监听对象自身在会话中的绑定与解绑事件。
| 监听器接口 | 触发事件 | 典型用途 | 
|---|---|---|
| HttpSessionBindingListener | 对象被存入会话 ( valueBound)、移除 (valueUnbound) | 自动管理资源(如连接释放) | 
| HttpSessionActivationListener | 会话钝化 ( sessionWillPassivate)、活化 (sessionDidActivate) | 分布式会话中对象序列化支持 | 
四、其他监听器
其他与会话或异步请求相关的监听器。
| 监听器接口 | 触发事件 | 典型用途 | 
|---|---|---|
| HttpSessionIdListener | 会话 ID 变更 ( sessionIdChanged) | 跟踪会话 ID 变化(需容器支持) | 
| AsyncListener | 异步请求开始、完成、超时或错误 | 监控异步请求生命周期 | 
分类2:
1. ServletContext 相关监听器
- ServletContextListener:监听- ServletContext的创建和销毁事件。- contextInitialized(ServletContextEvent sce):在- ServletContext初始化时调用。
- contextDestroyed(ServletContextEvent sce):在- ServletContext销毁时调用。
 
- ServletContextAttributeListener:监听- ServletContext属性的添加、删除和替换事件。- attributeAdded(ServletContextAttributeEvent event):属性被添加时调用。
- attributeRemoved(ServletContextAttributeEvent event):属性被删除时调用。
- attributeReplaced(ServletContextAttributeEvent event):属性被替换时调用。
 
2. HttpSession 相关监听器
- HttpSessionListener:监听- HttpSession的创建和销毁事件。- sessionCreated(HttpSessionEvent se):会话创建时调用。
- sessionDestroyed(HttpSessionEvent se):会话销毁时调用。
 
- HttpSessionAttributeListener:监听- HttpSession属性的添加、删除和替换事件。- attributeAdded(HttpSessionBindingEvent event):属性被添加时调用。
- attributeRemoved(HttpSessionBindingEvent event):属性被删除时调用。
- attributeReplaced(HttpSessionBindingEvent event):属性被替换时调用。
 
- HttpSessionBindingListener:监听绑定到- HttpSession的对象的状态变化。- valueBound(HttpSessionBindingEvent event):对象被绑定到会话时调用。
- valueUnbound(HttpSessionBindingEvent event):对象从会话中移除时调用。
 
- HttpSessionActivationListener:监听- HttpSession的钝化和活化事件。- sessionWillPassivate(HttpSessionEvent se):会话钝化前调用。
- sessionDidActivate(HttpSessionEvent se):会话活化后调用。
 
3. ServletRequest 相关监听器
- ServletRequestListener:监听- ServletRequest的创建和销毁事件。- requestInitialized(ServletRequestEvent sre):请求初始化时调用。
- requestDestroyed(ServletRequestEvent sre):请求销毁时调用。
 
- ServletRequestAttributeListener:监听- ServletRequest属性的添加、删除和替换事件。- attributeAdded(ServletRequestAttributeEvent event):属性被添加时调用。
- attributeRemoved(ServletRequestAttributeEvent event):属性被删除时调用。
- attributeReplaced(ServletRequestAttributeEvent event):属性被替换时调用。
 
4. 其他监听器
- AsyncListener:监听异步操作的完成、超时或失败事件。
这些监听器可以通过实现相应的接口来创建,并通过在 web.xml 文件中配置或使用 @WebListener 注解来注册。
ServletContextListener 的用法笔记250417
ServletRequestListener 的用法笔记250417
HttpSessionListener 的用法笔记250417
ServletContextAttributeListener 的用法笔记250417
ServletRequestAttributeListener 的用法笔记250417
HttpSessionAttributeListener 的用法笔记250417
HttpSessionBindingListener 的用法笔记250417
HttpSessionActivationListener 的用法笔记250417
@WebServlet @WebFilter @WebListener 的用法 笔记250418
1️⃣ 参考 1
Servlet 规范中定义了多种监听器(Listener),用于监听 Web 应用中的不同事件(如应用启动、会话创建、属性变化等)。以下是所有 Servlet 监听器的分类及详细说明:
一、按作用域分类的监听器
1. 应用级别(ServletContext)
| 监听器接口 | 说明 | 
|---|---|
| ServletContextListener | 监听 Servlet 上下文(应用)的创建和销毁。 (应用启动时初始化资源,关闭时释放资源) | 
| ServletContextAttributeListener | 监听 ServletContext 中属性的增删改。 (如动态配置更新、全局状态监控) | 
2. 会话级别(HttpSession)
| 监听器接口 | 说明 | 
|---|---|
| HttpSessionListener | 监听 会话(Session)的创建和销毁。 (统计在线用户数、会话超时处理) | 
| HttpSessionAttributeListener | 监听 HttpSession 中属性的增删改。 (如用户登录状态跟踪、购物车更新) | 
| HttpSessionBindingListener | 对象自身实现,监听被绑定到会话或从会话移除的事件。 (资源自动管理,如临时文件清理) | 
| HttpSessionActivationListener | 监听会话的 序列化(钝化)和反序列化(激活) 事件。 (分布式集群环境下的资源管理) | 
3. 请求级别(ServletRequest)
| 监听器接口 | 说明 | 
|---|---|
| ServletRequestListener | 监听 请求的初始化和销毁。 (记录请求耗时、请求级资源初始化) | 
| ServletRequestAttributeListener | 监听 ServletRequest 中属性的增删改。 (请求流程跟踪、动态参数校验) | 
二、各监听器核心方法及典型场景
1. ServletContextListener
 
public interface ServletContextListener {void contextInitialized(ServletContextEvent sce); // 应用启动时调用void contextDestroyed(ServletContextEvent sce);   // 应用关闭时调用
}
- 典型场景: - 初始化数据库连接池、读取全局配置文件。
- 注册后台服务(如定时任务、消息队列消费者)。
 
2. ServletContextAttributeListener
 
public interface ServletContextAttributeListener {void attributeAdded(ServletContextAttributeEvent event);   // 属性新增void attributeRemoved(ServletContextAttributeEvent event); // 属性移除void attributeReplaced(ServletContextAttributeEvent event); // 属性替换
}
- 典型场景: - 动态更新全局配置(如切换维护模式)。
- 审计全局属性变更日志。
 
3. HttpSessionListener
 
public interface HttpSessionListener {void sessionCreated(HttpSessionEvent se);   // 会话创建时调用void sessionDestroyed(HttpSessionEvent se); // 会话销毁时调用
}
- 典型场景: - 统计在线用户数。
- 会话超时自动清理资源(如临时文件)。
 
4. HttpSessionAttributeListener
 
public interface HttpSessionAttributeListener {void attributeAdded(HttpSessionBindingEvent event);   // 属性新增void attributeRemoved(HttpSessionBindingEvent event); // 属性移除void attributeReplaced(HttpSessionBindingEvent event); // 属性替换
}
- 典型场景: - 用户登录/登出状态跟踪。
- 实时同步购物车数据到数据库。
 
5. HttpSessionBindingListener
 
public interface HttpSessionBindingListener {void valueBound(HttpSessionBindingEvent event);   // 对象被绑定到会话时调用void valueUnbound(HttpSessionBindingEvent event); // 对象从会话移除时调用
}
- 典型场景: - 对象自动管理资源(绑定创建资源,解绑释放资源)。
- 会话绑定的对象状态同步(如在线用户列表)。
 
6. HttpSessionActivationListener
 
public interface HttpSessionActivationListener {void sessionWillPassivate(HttpSessionEvent se); // 会话钝化(序列化)前调用void sessionDidActivate(HttpSessionEvent se);   // 会话激活(反序列化)后调用
}
- 典型场景: - 分布式环境中会话数据恢复(如重新初始化网络连接)。
- 钝化前释放非序列化资源(如文件句柄)。
 
7. ServletRequestListener
 
public interface ServletRequestListener {void requestInitialized(ServletRequestEvent sre); // 请求开始时调用void requestDestroyed(ServletRequestEvent sre);   // 请求结束时调用
}
- 典型场景: - 记录请求处理时间。
- 请求级资源管理(如线程局部变量初始化)。
 
8. ServletRequestAttributeListener
 
public interface ServletRequestAttributeListener {void attributeAdded(ServletRequestAttributeEvent event);   // 属性新增void attributeRemoved(ServletRequestAttributeEvent event); // 属性移除void attributeReplaced(ServletRequestAttributeEvent event); // 属性替换
}
- 典型场景: - 跟踪请求处理流程(如记录中间状态)。
- 动态校验请求属性合法性。
 
三、配置方式
1. XML 配置(web.xml)
 
<web-app><!-- 应用级别监听器 --><listener><listener-class>com.example.MyContextListener</listener-class></listener><!-- 会话级别监听器 --><listener><listener-class>com.example.MySessionListener</listener-class></listener>
</web-app>
2. 注解配置(Servlet 3.0+)
@WebListener
public class MyRequestListener implements ServletRequestListener {// 实现方法
}
四、监听器对比总结
| 分类 | 监听器 | 核心事件 | 典型用途 | 
|---|---|---|---|
| 应用级别 | ServletContextListener | 应用启动/关闭 | 全局资源管理(如连接池) | 
| ServletContextAttributeListener | 全局属性增删改 | 配置热更新、审计日志 | |
| 会话级别 | HttpSessionListener | 会话创建/销毁 | 在线用户统计、会话资源管理 | 
| HttpSessionAttributeListener | 会话属性增删改 | 用户状态跟踪、数据同步 | |
| HttpSessionBindingListener | 对象绑定/解绑 | 资源自动管理 | |
| HttpSessionActivationListener | 会话钝化/激活 | 分布式会话资源恢复 | |
| 请求级别 | ServletRequestListener | 请求开始/结束 | 性能监控、请求级资源管理 | 
| ServletRequestAttributeListener | 请求属性增删改 | 流程跟踪、动态校验 | 
五、注意事项
-  线程安全: - ServletContext和- HttpSession中的共享资源需确保线程安全(如使用- AtomicInteger或同步锁)。
- ServletRequest是线程局部的,无需额外同步。
 
-  性能影响: - 避免在监听器中执行耗时操作(如复杂计算、同步 I/O)。
- 高频事件(如请求属性变更)需优化监听逻辑。
 
-  递归调用: - 在监听器中修改同一作用域的属性可能导致循环触发事件。
 
-  分布式环境: - 会话监听器需处理序列化问题(如实现 Serializable)。
- 使用 HttpSessionActivationListener管理钝化/激活逻辑。
 
- 会话监听器需处理序列化问题(如实现 
在 Java Servlet 规范中,Servlet 监听器(Listener)用于监听 Web 应用中的不同事件(如应用启动、会话创建、属性变更等)。以下是所有 Servlet 监听器的分类、接口及核心用途:
一、Servlet 监听器分类
1. 应用级别(ServletContext 相关)
| 监听器接口 | 触发事件 | 核心用途 | 
|---|---|---|
| ServletContextListener | 应用初始化/销毁( contextInitialized/contextDestroyed) | 全局资源管理(如连接池、配置文件加载) | 
| ServletContextAttributeListener | 全局属性增删改( attributeAdded/Removed/Replaced) | 动态配置更新、全局状态监控(如维护模式切换) | 
2. 会话级别(HttpSession 相关)
| 监听器接口 | 触发事件 | 核心用途 | 
|---|---|---|
| HttpSessionListener | 会话创建/销毁( sessionCreated/sessionDestroyed) | 在线用户统计、会话资源初始化/清理 | 
| HttpSessionAttributeListener | 会话属性增删改( attributeAdded/Removed/Replaced) | 用户登录状态跟踪、购物车数据同步 | 
| HttpSessionBindingListener | 对象绑定/解绑到会话( valueBound/valueUnbound) | 资源自动管理(如临时文件创建/删除) | 
| HttpSessionActivationListener | 会话钝化/激活( sessionWillPassivate/sessionDidActivate) | 分布式环境下会话数据持久化与恢复(如集群环境) | 
| HttpSessionIdListener(Servlet 3.1+) | 会话 ID 变更( sessionIdChanged) | 跟踪会话 ID 变化(如安全审计) | 
3. 请求级别(ServletRequest 相关)
| 监听器接口 | 触发事件 | 核心用途 | 
|---|---|---|
| ServletRequestListener | 请求开始/结束( requestInitialized/requestDestroyed) | 请求耗时统计、请求级资源初始化(如线程局部变量) | 
| ServletRequestAttributeListener | 请求属性增删改( attributeAdded/Removed/Replaced) | 请求流程跟踪、动态参数校验 | 
二、监听器对比与典型场景
1. 应用级别监听器
-  ServletContextListener
 示例:应用启动时初始化数据库连接池,关闭时释放资源。@WebListener public class AppInitListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 初始化连接池DataSource pool = createConnectionPool();sce.getServletContext().setAttribute("dbPool", pool);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 关闭连接池DataSource pool = (DataSource) sce.getServletContext().getAttribute("dbPool");if (pool != null) pool.close();} }
-  ServletContextAttributeListener
 示例:监听全局配置参数变更,触发服务热更新。public void attributeReplaced(ServletContextAttributeEvent event) {if ("apiKey".equals(event.getName())) {reloadExternalService(); // 重新加载外部服务配置} }
2. 会话级别监听器
-  HttpSessionListener
 示例:统计在线用户数。public void sessionCreated(HttpSessionEvent se) {AtomicInteger userCount = (AtomicInteger) se.getSession().getServletContext().getAttribute("userCount");userCount.incrementAndGet(); }
-  HttpSessionBindingListener
 示例:用户登录对象绑定会话时自动记录日志。public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用户绑定到会话: " + this.username);}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("用户从会话解绑: " + this.username);} }
3. 请求级别监听器
- ServletRequestListener
 示例:记录请求处理时间。- public void requestInitialized(ServletRequestEvent sre) {sre.getServletRequest().setAttribute("startTime", System.currentTimeMillis()); }public void requestDestroyed(ServletRequestEvent sre) {long startTime = (long) sre.getServletRequest().getAttribute("startTime");System.out.println("请求耗时: " + (System.currentTimeMillis() - startTime) + "ms"); }
三、配置方式
1. XML 配置(web.xml)
 
<web-app><!-- 应用监听器 --><listener><listener-class>com.example.AppInitListener</listener-class></listener><!-- 会话监听器 --><listener><listener-class>com.example.SessionTracker</listener-class></listener>
</web-app>
2. 注解配置(Servlet 3.0+)
@WebListener
public class MyListener implements ServletContextListener {// 实现方法
}
四、注意事项
-  线程安全 - ServletContext和- HttpSession中的共享资源需线程安全(如用- AtomicInteger)。
- ServletRequest是线程局部的,无需同步。
 
-  性能优化 - 避免在监听器中执行耗时操作(如复杂计算或 I/O)。
- 高频事件(如请求属性变更)需轻量级处理。
 
-  递归陷阱 - 在监听器中修改同一作用域的属性可能导致循环触发事件。
 
-  分布式环境 - 会话监听器需处理序列化(如实现 Serializable)。
- 使用 HttpSessionActivationListener管理钝化/激活逻辑。
 
- 会话监听器需处理序列化(如实现 
五、总结
Servlet 监听器是管理 Web 应用生命周期的核心工具,通过以下方式提升应用的可维护性:
- 应用级别:全局资源初始化、配置热更新。
- 会话级别:用户状态跟踪、分布式会话管理。
- 请求级别:性能监控、动态校验。
合理选择监听器,结合 XML 或注解配置,可以实现对 Web 应用全生命周期的精细化控制。
2️⃣ 参考 2
Java Servlet API 提供了 8 种监听器(Listener),用于监听 Web 应用生命周期中的关键事件。以下是每种监听器的用途和典型场景:
1. 应用级监听器
(1) ServletContextListener
 
- 作用:监听 ServletContext(Web 应用上下文)的初始化和销毁。
- 方法:contextInitialized(ServletContextEvent sce) // 应用启动时触发 contextDestroyed(ServletContextEvent sce) // 应用关闭时触发(如服务器停止)
- 场景: - 加载数据库驱动或初始化连接池
- 读取配置文件
- 执行应用启动时的初始化任务
- 关闭时释放全局资源
 
(2) ServletContextAttributeListener
 
- 作用:监听 ServletContext属性(应用作用域属性)的增删改。
- 方法:attributeAdded(ServletContextAttributeEvent event) attributeRemoved(ServletContextAttributeEvent event) attributeReplaced(ServletContextAttributeEvent event)
- 场景: - 跟踪应用级配置参数的变更
- 记录全局属性的修改日志
 
2. 会话级监听器
(3) HttpSessionListener
 
- 作用:监听 HttpSession(用户会话)的创建和销毁。
- 方法:sessionCreated(HttpSessionEvent se) // 用户首次访问时触发 sessionDestroyed(HttpSessionEvent se) // 会话超时或手动销毁时触发
- 场景: - 统计在线用户数
- 记录会话生命周期
- 清理会话相关的临时数据
 
(4) HttpSessionAttributeListener
 
- 作用:监听 HttpSession属性(会话作用域属性)的增删改。
- 方法:attributeAdded(HttpSessionBindingEvent event) attributeRemoved(HttpSessionBindingEvent event) attributeReplaced(HttpSessionBindingEvent event)
- 场景: - 监控用户会话中的关键数据变更
- 实现会话属性的审计功能
 
(5) HttpSessionBindingListener
 
- 作用:监听对象与 HttpSession的绑定和解除绑定(需对象自身实现该接口)。
- 方法:valueBound(HttpSessionBindingEvent event) // 对象被添加到会话时触发 valueUnbound(HttpSessionBindingEvent event) // 对象被移除或会话销毁时触发
- 场景: - 对象级资源管理(如数据库连接、文件句柄)
- 实现会话绑定的自定义逻辑(如缓存初始化)
 
3. 请求级监听器
(6) ServletRequestListener
 
- 作用:监听 ServletRequest(HTTP 请求)的初始化和销毁。
- 方法:requestInitialized(ServletRequestEvent sre) // 请求到达时触发 requestDestroyed(ServletRequestEvent sre) // 请求处理完成时触发
- 场景: - 记录请求开始和结束时间
- 跟踪请求处理性能
 
(7) ServletRequestAttributeListener
 
- 作用:监听 ServletRequest属性(请求作用域属性)的增删改。
- 方法:attributeAdded(ServletRequestAttributeEvent event) attributeRemoved(ServletRequestAttributeEvent event) attributeReplaced(ServletRequestAttributeEvent event)
- 场景: - 调试请求处理流程中的属性变化
- 实现请求属性的审计功能
 
4. 其他监听器
(8) HttpSessionActivationListener(需与钝化/活化机制配合使用)
 
- 作用:监听会话的钝化(序列化到磁盘)和活化(反序列化回内存)。
- 方法:sessionWillPassivate(HttpSessionEvent se) // 会话钝化前触发 sessionDidActivate(HttpSessionEvent se) // 会话活化后触发
- 场景: - 管理会话中需要序列化的对象状态
- 优化分布式会话的性能
 
配置方式(以 Servlet 3.0+ 为例)
- 注解配置:@WebListener public class MyListener implements ServletContextListener {// 实现方法 }
- web.xml 配置:<listener><listener-class>com.example.MyListener</listener-class> </listener>
注意事项
- 执行顺序:监听器的执行顺序由容器决定,避免依赖特定顺序。
- 性能影响:避免在监听器中执行耗时操作,以免阻塞事件处理线程。
- 线程安全:监听器方法可能由多线程并发调用,需保证线程安全。
这些监听器构成了 Servlet 事件驱动模型的核心,灵活利用它们可以实现应用状态监控、资源管理和审计等功能。
3️⃣ 参考 3
以下是 Java Servlet 中所有监听器(Listener)的分类及其用途的详细说明:
一、按监听对象分类
Servlet 监听器主要针对以下三个域对象的生命周期和属性变化进行监听:
- ServletContext(应用域)
- HttpSession(会话域)
- ServletRequest(请求域)
二、监听器类型及接口
1. 监听域对象的创建和销毁
| 域对象 | 监听器接口 | 事件触发时机 | 接口方法 | 
|---|---|---|---|
| ServletContext | ServletContextListener | Web应用启动/关闭时 | contextInitialized()contextDestroyed() | 
| HttpSession | HttpSessionListener | 会话创建/销毁时 | sessionCreated()sessionDestroyed() | 
| ServletRequest | ServletRequestListener | 请求创建/销毁时 | requestInitialized()requestDestroyed() | 
2. 监听域对象属性的增删改
| 域对象 | 监听器接口 | 事件触发时机 | 接口方法 | 
|---|---|---|---|
| ServletContext | ServletContextAttributeListener | 应用域属性添加/删除/替换时 | attributeAdded()attributeRemoved()attributeReplaced() | 
| HttpSession | HttpSessionAttributeListener | 会话域属性添加/删除/替换时 | attributeAdded()attributeRemoved()attributeReplaced() | 
| ServletRequest | ServletRequestAttributeListener | 请求域属性添加/删除/替换时 | attributeAdded()attributeRemoved()attributeReplaced() | 
3. 监听绑定到 HttpSession 对象的状态变化
| 接口名称 | 用途 | 实现方式(需对象自身实现) | 接口方法 | 
|---|---|---|---|
| HttpSessionBindingListener | 监听对象与会话的绑定/解绑 | 对象需实现此接口 | valueBound()valueUnbound() | 
| HttpSessionActivationListener | 监听会话的钝化(序列化)和活化(反序列化) | 对象需实现此接口 | sessionWillPassivate()sessionDidActivate() | 
三、核心接口详解
1. ServletContextListener
 
- 用途:监听应用域(ServletContext)的创建和销毁。
- 典型场景:应用启动时初始化全局资源(如数据库连接池),关闭时释放资源。
- 示例代码:@WebListener public class AppContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {// 应用启动时执行sce.getServletContext().setAttribute("onlineCount", 0);}@Overridepublic void contextDestroyed(ServletContextEvent sce) {// 应用关闭时执行// 释放资源} }
2. HttpSessionListener
 
- 用途:监听会话的创建和销毁。
- 典型场景:统计在线用户数量。
- 示例代码:@WebListener public class SessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {// 会话创建时增加在线人数ServletContext context = se.getSession().getServletContext();int count = (int) context.getAttribute("onlineCount");context.setAttribute("onlineCount", count + 1);}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {// 会话销毁时减少在线人数ServletContext context = se.getSession().getServletContext();int count = (int) context.getAttribute("onlineCount");context.setAttribute("onlineCount", count - 1);} }
3. HttpSessionAttributeListener
 
- 用途:监听会话域属性的增删改。
- 典型场景:监控敏感数据的修改(如用户权限变化)。
- 示例代码:@WebListener public class SessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionBindingEvent event) {System.out.println("属性 [" + event.getName() + "] 被添加到会话");}@Overridepublic void attributeRemoved(HttpSessionBindingEvent event) {System.out.println("属性 [" + event.getName() + "] 被移出会话");}@Overridepublic void attributeReplaced(HttpSessionBindingEvent event) {System.out.println("属性 [" + event.getName() + "] 被替换");} }
4. HttpSessionBindingListener
 
- 用途:监听对象与会话的绑定/解绑。
- 实现方式:需在对象类中直接实现此接口。
- 典型场景:对象被加入/移出会话时执行清理或初始化操作。
- 示例代码:public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用户被绑定到会话");// 初始化操作}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println("用户从会话解绑");// 释放资源} }
四、监听器注册方式
-  通过注解(Servlet 3.0+): @WebListener public class MyListener implements ServletContextListener { ... }
-  通过 web.xml配置:<listener><listener-class>com.example.MyListener</listener-class> </listener>
五、总结
| 监听对象 | 监听类型 | 对应接口 | 触发时机 | 
|---|---|---|---|
| ServletContext | 创建/销毁 | ServletContextListener | 应用启动/关闭 | 
| 属性变化 | ServletContextAttributeListener | 属性添加/删除/替换 | |
| HttpSession | 创建/销毁 | HttpSessionListener | 会话创建/销毁 | 
| 属性变化 | HttpSessionAttributeListener | 会话属性添加/删除/替换 | |
| 对象绑定/解绑 | HttpSessionBindingListener | 对象被加入/移出会话 | |
| 钝化/活化(序列化) | HttpSessionActivationListener | 会话钝化(存储)/活化(恢复) | |
| ServletRequest | 创建/销毁 | ServletRequestListener | 请求创建/销毁 | 
| 属性变化 | ServletRequestAttributeListener | 请求属性添加/删除/替换 | 
六、常见应用场景
- 资源管理:如数据库连接、文件句柄的自动释放(通过 valueUnbound或sessionDestroyed)。
- 在线人数统计:通过 sessionCreated和sessionDestroyed维护计数器。
- 单点登录(SSO):在 valueBound中检查并强制下线重复登录的用户。
- 日志记录:监控敏感操作(如会话属性的修改)。
通过合理使用这些监听器,可以更高效地管理 Web 应用的生命周期和状态变化。
4️⃣ 参考 4
在 Java Servlet 规范里,监听器(Listener)属于 Servlet 组件,其用途是对 Servlet 容器里的特定事件进行监听,当事件发生时执行相应的操作。Java Servlet 主要提供了以下几类监听器:
1. 针对 ServletContext 的监听器
 
ServletContext 代表整个 Web 应用,这些监听器用于监听其生命周期和属性变化。
- ServletContextListener- 功能:监听 ServletContext对象的创建和销毁。
- 应用场景:可在 Web 应用启动时进行初始化操作,如加载配置文件、初始化数据库连接池;在 Web 应用关闭时进行清理操作,如关闭数据库连接池。
- 示例代码:
 
- 功能:监听 
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletContextListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("Web 应用启动");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("Web 应用关闭");}
}
- ServletContextAttributeListener- 功能:监听 ServletContext对象中属性的添加、移除和替换。
- 应用场景:记录属性变化日志、更新全局缓存等。
- 示例代码:
 
- 功能:监听 
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {@Overridepublic void attributeAdded(ServletContextAttributeEvent event) {System.out.println("添加属性: " + event.getName());}@Overridepublic void attributeRemoved(ServletContextAttributeEvent event) {System.out.println("移除属性: " + event.getName());}@Overridepublic void attributeReplaced(ServletContextAttributeEvent event) {System.out.println("替换属性: " + event.getName());}
}
2. 针对 HttpSession 的监听器
 
HttpSession 代表用户会话,这些监听器用于监听会话的生命周期和属性变化。
- HttpSessionListener- 功能:监听 HttpSession对象的创建和销毁。
- 应用场景:统计在线用户数量、记录用户登录和退出时间。
- 示例代码:
 
- 功能:监听 
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyHttpSessionListener implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("会话创建: " + se.getSession().getId());}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("会话销毁: " + se.getSession().getId());}
}
- HttpSessionAttributeListener- 功能:监听 HttpSession对象中属性的添加、移除和替换。
- 应用场景:记录会话属性变化日志、更新用户会话状态。
- 示例代码:
 
- 功能:监听 
import javax.servlet.http.HttpSessionAttributeEvent;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyHttpSessionAttributeListener implements HttpSessionAttributeListener {@Overridepublic void attributeAdded(HttpSessionAttributeEvent event) {System.out.println("会话添加属性: " + event.getName());}@Overridepublic void attributeRemoved(HttpSessionAttributeEvent event) {System.out.println("会话移除属性: " + event.getName());}@Overridepublic void attributeReplaced(HttpSessionAttributeEvent event) {System.out.println("会话替换属性: " + event.getName());}
}
- HttpSessionBindingListener- 功能:允许对象自身感知其何时被绑定到 HttpSession以及何时从HttpSession中解绑。
- 应用场景:当对象绑定或解绑会话时执行特定操作,如资源分配和释放。
- 示例代码:
 
- 功能:允许对象自身感知其何时被绑定到 
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;public class User implements HttpSessionBindingListener {private String name;public User(String name) {this.name = name;}@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println(name + " 绑定到会话");}@Overridepublic void valueUnbound(HttpSessionBindingEvent event) {System.out.println(name + " 从会话解绑");}
}
- HttpSessionActivationListener- 功能:监听 HttpSession对象的钝化(序列化到磁盘)和活化(从磁盘反序列化)。
- 应用场景:在会话钝化和活化时进行资源管理。
- 示例代码:
 
- 功能:监听 
import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;
import java.io.Serializable;public class MySessionActivationListener implements HttpSessionActivationListener, Serializable {@Overridepublic void sessionWillPassivate(HttpSessionEvent se) {System.out.println("会话将钝化: " + se.getSession().getId());}@Overridepublic void sessionDidActivate(HttpSessionEvent se) {System.out.println("会话已活化: " + se.getSession().getId());}
}
3. 针对 ServletRequest 的监听器
 
ServletRequest 代表客户端请求,这些监听器用于监听请求的生命周期和属性变化。
- ServletRequestListener- 功能:监听 ServletRequest对象的创建和销毁。
- 应用场景:记录请求处理时间、统计请求数量。
- 示例代码:
 
- 功能:监听 
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletRequestListener implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {System.out.println("请求初始化");}@Overridepublic void requestDestroyed(ServletRequestEvent sre) {System.out.println("请求销毁");}
}
- ServletRequestAttributeListener- 功能:监听 ServletRequest对象中属性的添加、移除和替换。
- 应用场景:记录请求属性变化日志、进行数据验证。
- 示例代码:
 
- 功能:监听 
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.annotation.WebListener;@WebListener
public class MyServletRequestAttributeListener implements ServletRequestAttributeListener {@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {System.out.println("请求添加属性: " + srae.getName());}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {System.out.println("请求移除属性: " + srae.getName());}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {System.out.println("请求替换属性: " + srae.getName());}
}
这些监听器可以通过 @WebListener 注解或者在 web.xml 文件中进行配置。
5️⃣ 参考 5
Java Servlet 提供了多种监听器(Listener),用于监听 Web 应用程序中的各种事件。以下是常见的监听器及其用途:
1. ServletContext 相关监听器
- ServletContextListener:监听- ServletContext的创建和销毁事件。- contextInitialized(ServletContextEvent sce):在- ServletContext初始化时调用。
- contextDestroyed(ServletContextEvent sce):在- ServletContext销毁时调用。
 
- ServletContextAttributeListener:监听- ServletContext属性的添加、删除和替换事件。- attributeAdded(ServletContextAttributeEvent event):属性被添加时调用。
- attributeRemoved(ServletContextAttributeEvent event):属性被删除时调用。
- attributeReplaced(ServletContextAttributeEvent event):属性被替换时调用。
 
2. HttpSession 相关监听器
- HttpSessionListener:监听- HttpSession的创建和销毁事件。- sessionCreated(HttpSessionEvent se):会话创建时调用。
- sessionDestroyed(HttpSessionEvent se):会话销毁时调用。
 
- HttpSessionAttributeListener:监听- HttpSession属性的添加、删除和替换事件。- attributeAdded(HttpSessionBindingEvent event):属性被添加时调用。
- attributeRemoved(HttpSessionBindingEvent event):属性被删除时调用。
- attributeReplaced(HttpSessionBindingEvent event):属性被替换时调用。
 
- HttpSessionBindingListener:监听绑定到- HttpSession的对象的状态变化。- valueBound(HttpSessionBindingEvent event):对象被绑定到会话时调用。
- valueUnbound(HttpSessionBindingEvent event):对象从会话中移除时调用。
 
- HttpSessionActivationListener:监听- HttpSession的钝化和活化事件。- sessionWillPassivate(HttpSessionEvent se):会话钝化前调用。
- sessionDidActivate(HttpSessionEvent se):会话活化后调用。
 
3. ServletRequest 相关监听器
- ServletRequestListener:监听- ServletRequest的创建和销毁事件。- requestInitialized(ServletRequestEvent sre):请求初始化时调用。
- requestDestroyed(ServletRequestEvent sre):请求销毁时调用。
 
- ServletRequestAttributeListener:监听- ServletRequest属性的添加、删除和替换事件。- attributeAdded(ServletRequestAttributeEvent event):属性被添加时调用。
- attributeRemoved(ServletRequestAttributeEvent event):属性被删除时调用。
- attributeReplaced(ServletRequestAttributeEvent event):属性被替换时调用。
 
4. 其他监听器
- AsyncListener:监听异步操作的完成、超时或失败事件。
这些监听器可以通过实现相应的接口来创建,并通过在 web.xml 文件中配置或使用 @WebListener 注解来注册。
6️⃣ 参考 6
Java的Servlet API提供了多种监听器(Listener),用于监听Web应用中的各种事件。以下是一些常见的Servlet监听器:
1. ServletContextListener
- 作用:监听整个Web应用的启动和销毁事件。
- 使用场景:初始化全局资源,如数据库连接池、日志系统等。
2. ServletContextAttributeListener
- 作用:监听ServletContext中属性的添加、移除和替换事件。
- 使用场景:跟踪全局属性的变化。
3. HttpSessionListener
- 作用:监听HttpSession的创建和销毁事件。
- 使用场景:统计在线用户数,管理会话超时等。
4. HttpSessionAttributeListener
- 作用:监听HttpSession中属性的添加、移除和替换事件。
- 使用场景:跟踪会话属性的变化。
5. ServletRequestListener
- 作用:监听ServletRequest的创建和销毁事件。
- 使用场景:记录请求日志,管理请求资源等。
6. ServletRequestAttributeListener
- 作用:监听ServletRequest中属性的添加、移除和替换事件。
- 使用场景:跟踪请求属性的变化。
7. HttpSessionBindingListener
- 作用:监听对象绑定到HttpSession和从HttpSession解绑的事件。
- 使用场景:在对象绑定和解绑时执行特定操作,如资源初始化和清理。
8. HttpSessionActivationListener
- 作用:监听HttpSession的激活和钝化事件(主要用于分布式环境中的会话管理)。
- 使用场景:在会话被钝化(序列化到磁盘)和激活(从磁盘反序列化)时执行操作。
9. SingleSignOnListener(较少使用)
- 作用:监听单点登录相关的事件。
- 使用场景:在单点登录系统中跟踪用户的登录状态变化。
注册监听器的方式
监听器可以通过以下两种方式注册:
- 在web.xml文件中配置:<listener><listener-class>com.example.MyListener</listener-class> </listener>
- 使用注解(适用于Servlet 3.0及以上版本):import javax.servlet.annotation.WebListener;@WebListener public class MyListener implements ServletContextListener {// 实现相应的方法 }
通过合理使用这些监听器,可以更好地管理和控制Web应用的行为,提高应用的灵活性和可维护性。
7️⃣ 参考 7

Java Servlet 监听器类型详解
Java Servlet 监听器(Listener)主要用于监听 Web 应用中的容器级事件和对象状态变化,根据监听目标可分为以下三类六种核心类型,涵盖容器生命周期、会话管理、请求处理等场景。
一、Servlet 上下文监听器(ServletContext)
1. ServletContextListener
- 功能:监听 Web 应用的初始化与销毁
- 方法:void contextInitialized(ServletContextEvent sce); // 应用启动时触发 void contextDestroyed(ServletContextEvent sce); // 应用关闭时触发
- 典型应用: - 加载全局配置(如数据库连接池)
- 释放应用级资源(如关闭线程池)
 public class AppInitListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("应用启动,加载配置文件");} }
2. ServletContextAttributeListener
- 功能:监听上下文(ServletContext)的属性变化
- 方法:void attributeAdded(ServletContextAttributeEvent scae); // 属性添加 void attributeRemoved(ServletContextAttributeEvent scae); // 属性移除 void attributeReplaced(ServletContextAttributeEvent scae); // 属性修改
- 典型应用: - 全局配置变更审计
- 动态刷新缓存
 
二、会话监听器(HttpSession)
1. HttpSessionListener
- 功能:监听会话(Session)的创建与销毁
- 方法:void sessionCreated(HttpSessionEvent se); // 会话创建时触发 void sessionDestroyed(HttpSessionEvent se);// 会话销毁时触发
- 典型应用: - 统计在线用户数
 public class SessionCounter implements HttpSessionListener {private static int activeSessions = 0;@Overridepublic void sessionCreated(HttpSessionEvent se) {activeSessions++;} }
2. HttpSessionAttributeListener
- 功能:监听会话属性变化(所有属性)
- 方法:void attributeAdded(HttpSessionBindingEvent se); // 属性添加 void attributeRemoved(HttpSessionBindingEvent se); // 属性移除 void attributeReplaced(HttpSessionBindingEvent se); // 属性修改
- 对比: - 与 HttpSessionBindingListener不同,此接口独立于被存储对象,可监听所有会话属性。
 
- 与 
3. HttpSessionActivationListener
- 功能:监听会话的序列化(钝化)与反序列化(活化),用于分布式会话
- 方法:void sessionWillPassivate(HttpSessionEvent se); // 会话钝化前触发 void sessionDidActivate(HttpSessionEvent se); // 会话活化后触发
- 典型应用: - 释放/重建非序列化资源(如文件句柄)
 
三、请求监听器(ServletRequest)
1. ServletRequestListener
- 功能:监听 HTTP 请求的初始化和销毁
- 方法:void requestInitialized(ServletRequestEvent sre); // 请求到达时触发 void requestDestroyed(ServletRequestEvent sre); // 请求处理完毕时触发
- 典型应用: - 记录请求耗时
 public class RequestTimer implements ServletRequestListener {@Overridepublic void requestInitialized(ServletRequestEvent sre) {sre.getServletRequest().setAttribute("startTime", System.currentTimeMillis());} }
2. ServletRequestAttributeListener
- 功能:监听请求属性变化
- 方法:void attributeAdded(ServletRequestAttributeEvent srae); // 属性添加 void attributeRemoved(ServletRequestAttributeEvent srae); // 属性移除 void attributeReplaced(ServletRequestAttributeEvent srae); // 属性修改
四、特殊对象绑定监听器
HttpSessionBindingListener
- 功能:由被存储对象自身实现,监听自身与 Session 的绑定/解绑事件(如 session.setAttribute("key", obj))
- 方法:void valueBound(HttpSessionBindingEvent event); // 绑定到 Session 时触发 void valueUnbound(HttpSessionBindingEvent event); // 从 Session 移除时触发
- 特点: - 无需注册,自动触发
- 适用于对象级生命周期管理(如自动释放资源)。
 
监听器对比表
| 类型 | 监听目标 | 是否需要注册 | 典型场景 | 
|---|---|---|---|
| ServletContextListener | Web 应用生命周期 | 是 | 全局资源配置 | 
| HttpSessionListener | 会话创建/销毁 | 是 | 在线用户统计 | 
| HttpSessionBindingListener | 对象绑定事件 | 否 | 对象级资源管理 | 
| ServletRequestAttributeListener | 请求属性变化 | 是 | 请求参数审计 | 
配置方式
-  注解配置(Servlet 3.0+) @WebListener public class MyListener implements ServletContextListener { ... }
-  web.xml 配置 <listener><listener-class>com.example.AppInitListener</listener-class> </listener>
相关问题
- 如何通过 HttpSessionActivationListener实现分布式会话的数据一致性?
- 在 Spring Boot 中如何整合自定义的 Servlet 监听器?
- HttpSessionAttributeListener和- HttpSessionBindingListener的事件触发顺序是怎样的?
8️⃣ 参考 8
Java Servlet 规范中定义了 8 类监听器,主要用于监听 Servlet 三大域对象(ServletContext、HttpSession、ServletRequest) 的生命周期、属性变化及会话绑定操作。以下是分类详解及核心接口说明:
一、生命周期监听器
监听域对象的 创建与销毁 事件:
-  ServletContextListener
 • 作用:监听 Web 应用的启动(contextInitialized)和关闭(contextDestroyed)事件。
 • 典型应用:初始化数据库连接池、加载全局配置文件。@WebListener public class AppListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("Web应用启动");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("Web应用关闭");} }
-  HttpSessionListener
 • 作用:监听会话的创建(sessionCreated)和销毁(sessionDestroyed)。
 • 典型应用:统计在线用户数,记录会话超时日志。@WebListener public class SessionTracker implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("新会话创建:" + se.getSession().getId());} }
-  ServletRequestListener
 • 作用:监听请求的初始化(requestInitialized)和结束(requestDestroyed)。
 • 典型应用:记录请求耗时、统计 API 调用量。
二、属性变化监听器
监听域对象中 属性的增删改 事件:
 4. ServletContextAttributeListener
 • 作用:监听 ServletContext 属性的增删改。
 • 典型应用:动态刷新全局配置(如切换日志级别)。
-  HttpSessionAttributeListener
 • 作用:监听HttpSession属性的增删改。
 • 典型应用:用户权限变更时实时更新权限缓存。
-  ServletRequestAttributeListener
 • 作用:监听ServletRequest属性的增删改。
 • 典型应用:校验请求参数合法性(如敏感词过滤)。
三、会话绑定与钝活化监听器
监听 会话中对象的绑定状态 和 序列化行为:
 7. HttpSessionBindingListener
 • 作用:对象感知自身被绑定到会话(valueBound)或解绑(valueUnbound)。
 • 特点:无需配置,由对象自身实现接口。
public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用户绑定到Session");}
}
- HttpSessionActivationListener
 • 作用:监听对象随会话 钝化(持久化到磁盘) 和 活化(加载到内存) 的过程。
 • 依赖:需配合- Serializable接口实现序列化。
四、其他扩展监听器(Servlet 3.0+)
- AsyncListener
 • 作用:监听异步请求的完成、超时或错误事件。
 • 典型应用:处理长时间任务(如文件上传进度跟踪)。
五、配置方式
• 注解:使用 @WebListener 标记监听器类(Servlet 3.0+)。
 • XML:在 web.xml 中添加 <listener> 标签。
<listener><listener-class>com.example.MyListener</listener-class>
</listener>
引用说明
:八大监听器分类及核心接口定义。
 :配置方式及典型应用场景。
 :扩展监听器 AsyncListener 的作用。
9️⃣ 参考 9
在 Java 的 Servlet API 中,监听器(Listener)用于监听 Web 应用中对象的生命周期和状态变化。以下是 Servlet 监听器的主要类型及其用途的分类总结:
一、应用(ServletContext)监听器
监听 Web 应用的生命周期 和 应用级属性变化:
-  ServletContextListener- 用途:监听整个 Web 应用的启动和关闭。
- 方法: - contextInitialized(ServletContextEvent event):应用启动时触发。
- contextDestroyed(ServletContextEvent event):应用关闭时触发。
 
- 典型场景:初始化全局资源(如数据库连接池)、加载配置文件、记录应用启动日志。
 
-  ServletContextAttributeListener- 用途:监听 ServletContext(应用级)属性的增删改事件。
- 方法: - attributeAdded:属性添加时触发。
- attributeRemoved:属性删除时触发。
- attributeReplaced:属性值被替换时触发。
 
- 典型场景:监控全局配置变化、记录属性操作日志。
 
- 用途:监听 
二、会话(HttpSession)监听器
监听 用户会话的生命周期 和 会话属性变化:
-  HttpSessionListener- 用途:监听会话的创建和销毁。
- 方法: - sessionCreated(HttpSessionEvent event):会话创建时触发(如用户首次访问需会话的资源)。
- sessionDestroyed(HttpSessionEvent event):会话销毁时触发(如超时、调用- invalidate())。
 
- 典型场景:统计在线用户数、记录用户登录/下线时间、释放会话资源。
 
-  HttpSessionAttributeListener- 用途:监听 HttpSession(会话级)属性的增删改事件。
- 方法: - attributeAdded:属性添加时触发。
- attributeRemoved:属性删除时触发。
- attributeReplaced:属性值被替换时触发。
 
- 典型场景:监控用户状态变化(如购物车更新)、同步缓存数据。
 
- 用途:监听 
-  HttpSessionBindingListener- 用途:由 对象自身 实现,监听对象被绑定到会话或解除绑定的事件。
- 方法: - valueBound(HttpSessionBindingEvent event):对象被绑定到会话时触发。
- valueUnbound(HttpSessionBindingEvent event):对象从会话中解除绑定时触发。
 
- 典型场景:在对象绑定时初始化资源(如数据库连接),解除绑定时释放资源。
 
-  HttpSessionActivationListener- 用途:在 分布式会话 场景下,监听会话钝化(序列化到磁盘)和激活(反序列化到内存)事件。
- 方法: - sessionDidActivate(HttpSessionEvent event):会话激活时触发。
- sessionWillPassivate(HttpSessionEvent event):会话钝化前触发。
 
- 典型场景:在会话迁移时清理非序列化字段(如线程局部变量)。
 
三、请求(ServletRequest)监听器
监听 单个 HTTP 请求的生命周期 和 请求属性变化:
-  ServletRequestListener- 用途:监听单个请求的创建和销毁。
- 方法: - requestInitialized(ServletRequestEvent event):请求创建时触发。
- requestDestroyed(ServletRequestEvent event):请求销毁时触发。
 
- 典型场景:记录请求开始/结束时间、统计请求耗时。
 
-  ServletRequestAttributeListener- 用途:监听 ServletRequest(请求级)属性的增删改事件。
- 方法: - attributeAdded:属性添加时触发。
- attributeRemoved:属性删除时触发。
- attributeReplaced:属性值被替换时触发。
 
- 典型场景:监控请求参数变化、记录属性操作日志。
 
- 用途:监听 
四、其他监听器
- ServletRequestListener和- HttpSessionListener的子类:- 例如 AsyncListener(用于异步请求监听),但属于更高级的用法。
 
- 例如 
监听器的配置方式
- 方式 1:通过注解(Servlet 3.0+):
 在监听器类上添加@WebListener注解,无需额外配置。
- 方式 2:在 web.xml中声明:<listener><listener-class>com.example.MyListener</listener-class> </listener>
总结表格
| 监听器类型 | 监听对象 | 主要用途 | 核心方法 | 
|---|---|---|---|
| ServletContextListener | 应用(ServletContext) | 应用的启动和关闭 | contextInitialized(),contextDestroyed() | 
| ServletContextAttributeListener | 应用属性 | 监控应用级属性变化 | attributeAdded(),attributeRemoved(),attributeReplaced() | 
| HttpSessionListener | 会话(HttpSession) | 会话的创建和销毁 | sessionCreated(),sessionDestroyed() | 
| HttpSessionAttributeListener | 会话属性 | 监控会话级属性变化 | attributeAdded(),attributeRemoved(),attributeReplaced() | 
| HttpSessionBindingListener | 对象绑定到会话 | 对象被绑定或解除绑定到会话 | valueBound(),valueUnbound() | 
| HttpSessionActivationListener | 会话钝化/激活 | 分布式会话的钝化和激活事件 | sessionDidActivate(),sessionWillPassivate() | 
| ServletRequestListener | 请求(ServletRequest) | 请求的创建和销毁 | requestInitialized(),requestDestroyed() | 
| ServletRequestAttributeListener | 请求属性 | 监控请求级属性变化 | attributeAdded(),attributeRemoved(),attributeReplaced() | 
Java的Servlet监听器(Listener)是Java Servlet规范中定义的一种特殊类,它可以监听Web应用程序中的特定事件,并在这些事件发生时执行相应的处理[1]。Servlet监听器主要包括以下几种:
-  ServletContextListener - 功能描述:用于监听ServletContext对象的创建和销毁事件。当Web应用启动时,容器会自动创建一个ServletContext对象,并调用实现该接口类的contextInitialized方法;当Web应用停止时,容器会调用contextDestroyed方法。
- 应用场景:在contextInitialized方法中可以进行一些初始化操作,如加载配置文件、初始化数据库连接池等;在contextDestroyed方法中可以进行清理工作,如释放资源、关闭数据库连接等。
 
-  HttpSessionListener - 功能描述:用于监听HttpSession对象的创建和销毁事件。当一个HttpSession被创建时,容器会调用实现该接口类的sessionCreated方法;当一个HttpSession被销毁时,容器会调用sessionDestroyed方法。
- 应用场景:在sessionCreated方法中可以记录用户的登录信息、初始化用户的会话数据等;在sessionDestroyed方法中可以进行清理工作,如移除用户在服务器上的缓存数据等。
 
-  ServletRequestListener - 功能描述:用于监听ServletRequest对象的初始化和结束事件。当一个请求被创建时,容器会调用实现该接口类的requestInitialized方法;当一个请求结束时,容器会调用requestDestroyed方法。
- 应用场景:可以在requestInitialized方法中进行请求的预处理,如检查用户的权限、记录请求的日志等;在requestDestroyed方法中可以进行请求的后处理,如释放资源、统计请求的处理时间等。
 
-  HttpSessionAttributeListener - 功能描述:用于监听HttpSession对象中属性的增加、删除和替换事件。当一个属性被添加到HttpSession中时,容器会调用实现该接口类的attributeAdded方法;当一个属性从HttpSession中删除时,容器会调用attributeRemoved方法;当一个属性在HttpSession中被替换时,容器会调用attributeReplaced方法。
- 应用场景:可以在attributeAdded方法中对新添加的属性进行处理,如验证属性的值、更新相关的业务数据等;在attributeRemoved方法中可以清理与属性相关的资源;在attributeReplaced方法中可以处理属性值的变化,如触发相关的业务逻辑。
 
-  ServletRequestAttributeListener - 功能描述:用于监听ServletRequest对象中属性的增加、删除和替换事件。当一个属性被添加到ServletRequest中时,容器会调用实现该接口类的attributeAdded方法;当一个属性从ServletRequest中删除时,容器会调用attributeRemoved方法;当一个属性在ServletRequest中被替换时,容器会调用attributeReplaced方法。
- 应用场景:与HttpSessionAttributeListener类似,可以在attributeAdded、attributeRemoved和attributeReplaced方法中对ServletRequest中的属性变化进行处理,以满足特定的业务需求。
 
-  HttpSessionBindingListener - 功能描述:用于监听对象与HttpSession绑定和解除绑定的事件。当一个实现了该接口的对象被绑定到HttpSession中时,容器会调用valueBound方法;当该对象从HttpSession中解绑时,容器会调用valueUnbound方法。
- 应用场景:可以在valueBound方法中执行对象与HttpSession绑定时的初始化操作,如将对象的状态设置为已绑定等;在valueUnbound方法中可以进行清理工作,如释放对象占用的资源等。
 
-  HttpSessionActivationListener - 功能描述:用于监听HttpSession的活化和钝化事件。当一个HttpSession被激活时(即客户端恢复与服务器的交互),容器会调用实现该接口类的sessionWillActivate方法;当一个HttpSession被钝化时(即客户端长时间未与服务器交互),容器会调用sessionDidPassivate方法。
- 应用场景:可以在sessionWillActivate方法中进行一些操作,如重新建立与后端系统的连接等;在sessionDidPassivate方法中可以将HttpSession中的数据持久化到存储设备中,以便在会话恢复时能够快速恢复数据。
 
🔟 参考 10
Java Servlet 监听器(Listener)用于监听 Web 应用中关键对象(如 ServletContext、HttpSession、ServletRequest)的生命周期和属性变化,共分为 8 种类型,按功能分类如下:
一、监听对象创建与销毁
| 监听器接口 | 作用 | 触发方法 | 来源 | 
|---|---|---|---|
| ServletContextListener | 监听 ServletContext(应用级作用域)的创建和销毁,如应用启动/关闭时触发 | contextInitialized()、contextDestroyed() | |
| HttpSessionListener | 监听 HttpSession(会话级作用域)的创建和销毁,如用户登录/退出或 Session 超时 | sessionCreated()、sessionDestroyed() | |
| ServletRequestListener | 监听 ServletRequest(请求级作用域)的创建和销毁,如每次请求到达服务器时触发 | requestInitialized()、requestDestroyed() | 
二、监听对象属性变化
| 监听器接口 | 作用 | 触发方法 | 来源 | 
|---|---|---|---|
| ServletContextAttributeListener | 监听 ServletContext属性的添加、修改、删除 | attributeAdded()、attributeReplaced()、attributeRemoved() | |
| HttpSessionAttributeListener | 监听 HttpSession属性的添加、修改、删除 | 同上 | |
| ServletRequestAttributeListener | 监听 ServletRequest属性的添加、修改、删除 | 同上 | 
三、监听 Session 对象绑定与钝化
| 监听器接口 | 作用 | 触发方法 | 来源 | 
|---|---|---|---|
| HttpSessionBindingListener | 监听对象绑定到 Session 或从 Session 解绑(需对象实现该接口) | valueBound()、valueUnbound() | |
| HttpSessionActivationListener | 监听 Session 的钝化(内存持久化到硬盘)和活化(硬盘加载到内存)(需对象序列化) | sessionWillPassivate()、sessionDidActivate() | 
四、典型应用场景
- 初始化资源 - ServletContextListener:应用启动时初始化数据库连接池或加载全局配置 。
 
- 统计在线用户 - HttpSessionListener:通过- sessionCreated()和- sessionDestroyed()统计活跃会话数 。
 
- 请求日志记录 - ServletRequestListener:记录请求开始和结束时间,计算耗时 。
 
- 用户登录状态管理 - HttpSessionBindingListener:用户登录时绑定对象到 Session,退出时释放资源 。
 
- 分布式会话同步 - HttpSessionActivationListener:在集群环境中同步 Session 数据 。
 
五、配置方式
- 注解:在监听器类上添加 @WebListener(推荐)。
- XML:在 web.xml中配置<listener>标签 。
总结
Servlet 监听器通过监听 对象生命周期 和 属性变化,实现资源管理、日志记录、会话跟踪等核心功能。根据监听对象不同,分为 应用级、会话级 和 请求级 三类,开发者可根据需求选择合适的监听器类型。