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
可以监听请求属性的变动,这对于跨请求处理器间的数据传递或跟踪非常有用。
- 类似地,