Java的Servlet的監聽器Listener 筆記250417

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請求屬性增刪改流程跟蹤、動態校驗

五、注意事項

  1. 線程安全

    • ServletContextHttpSession 中的共享資源需確保線程安全(如使用 AtomicInteger 或同步鎖)。
    • ServletRequest 是線程局部的,無需額外同步。
  2. 性能影響

    • 避免在監聽器中執行耗時操作(如復雜計算、同步 I/O)。
    • 高頻事件(如請求屬性變更)需優化監聽邏輯。
  3. 遞歸調用

    • 在監聽器中修改同一作用域的屬性可能導致循環觸發事件。
  4. 分布式環境

    • 會話監聽器需處理序列化問題(如實現 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 {// 實現方法
}

四、注意事項

  1. 線程安全

    • ServletContextHttpSession 中的共享資源需線程安全(如用 AtomicInteger)。
    • ServletRequest 是線程局部的,無需同步。
  2. 性能優化

    • 避免在監聽器中執行耗時操作(如復雜計算或 I/O)。
    • 高頻事件(如請求屬性變更)需輕量級處理。
  3. 遞歸陷阱

    • 在監聽器中修改同一作用域的屬性可能導致循環觸發事件。
  4. 分布式環境

    • 會話監聽器需處理序列化(如實現 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+ 為例)

  1. 注解配置
    @WebListener
    public class MyListener implements ServletContextListener {// 實現方法
    }
    
  2. web.xml 配置
    <listener><listener-class>com.example.MyListener</listener-class>
    </listener>
    

注意事項

  • 執行順序:監聽器的執行順序由容器決定,避免依賴特定順序。
  • 性能影響:避免在監聽器中執行耗時操作,以免阻塞事件處理線程。
  • 線程安全:監聽器方法可能由多線程并發調用,需保證線程安全。

這些監聽器構成了 Servlet 事件驅動模型的核心,靈活利用它們可以實現應用狀態監控、資源管理和審計等功能。










3?? 參考 3

以下是 Java Servlet 中所有監聽器(Listener)的分類及其用途的詳細說明:


一、按監聽對象分類

Servlet 監聽器主要針對以下三個域對象的生命周期和屬性變化進行監聽:

  1. ServletContext(應用域)
  2. HttpSession(會話域)
  3. ServletRequest(請求域)

二、監聽器類型及接口

1. 監聽域對象的創建和銷毀
域對象監聽器接口事件觸發時機接口方法
ServletContextServletContextListenerWeb應用啟動/關閉時contextInitialized()
contextDestroyed()
HttpSessionHttpSessionListener會話創建/銷毀時sessionCreated()
sessionDestroyed()
ServletRequestServletRequestListener請求創建/銷毀時requestInitialized()
requestDestroyed()
2. 監聽域對象屬性的增刪改
域對象監聽器接口事件觸發時機接口方法
ServletContextServletContextAttributeListener應用域屬性添加/刪除/替換時attributeAdded()
attributeRemoved()
attributeReplaced()
HttpSessionHttpSessionAttributeListener會話域屬性添加/刪除/替換時attributeAdded()
attributeRemoved()
attributeReplaced()
ServletRequestServletRequestAttributeListener請求域屬性添加/刪除/替換時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("用戶從會話解綁");// 釋放資源}
    }
    

四、監聽器注冊方式

  1. 通過注解(Servlet 3.0+)

    @WebListener
    public class MyListener implements ServletContextListener { ... }
    
  2. 通過 web.xml 配置

    <listener><listener-class>com.example.MyListener</listener-class>
    </listener>
    

五、總結

監聽對象監聽類型對應接口觸發時機
ServletContext創建/銷毀ServletContextListener應用啟動/關閉
屬性變化ServletContextAttributeListener屬性添加/刪除/替換
HttpSession創建/銷毀HttpSessionListener會話創建/銷毀
屬性變化HttpSessionAttributeListener會話屬性添加/刪除/替換
對象綁定/解綁HttpSessionBindingListener對象被加入/移出會話
鈍化/活化(序列化)HttpSessionActivationListener會話鈍化(存儲)/活化(恢復)
ServletRequest創建/銷毀ServletRequestListener請求創建/銷毀
屬性變化ServletRequestAttributeListener請求屬性添加/刪除/替換

六、常見應用場景

  1. 資源管理:如數據庫連接、文件句柄的自動釋放(通過 valueUnboundsessionDestroyed)。
  2. 在線人數統計:通過 sessionCreatedsessionDestroyed 維護計數器。
  3. 單點登錄(SSO):在 valueBound 中檢查并強制下線重復登錄的用戶。
  4. 日志記錄:監控敏感操作(如會話屬性的修改)。

通過合理使用這些監聽器,可以更高效地管理 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(較少使用)

  • 作用:監聽單點登錄相關的事件。
  • 使用場景:在單點登錄系統中跟蹤用戶的登錄狀態變化。

注冊監聽器的方式

監聽器可以通過以下兩種方式注冊:

  1. web.xml文件中配置
    <listener><listener-class>com.example.MyListener</listener-class>
    </listener>
    
  2. 使用注解(適用于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 移除時觸發
    
  • 特點
    • 無需注冊,自動觸發
    • 適用于對象級生命周期管理(如自動釋放資源)。

監聽器對比表

類型監聽目標是否需要注冊典型場景
ServletContextListenerWeb 應用生命周期全局資源配置
HttpSessionListener會話創建/銷毀在線用戶統計
HttpSessionBindingListener對象綁定事件對象級資源管理
ServletRequestAttributeListener請求屬性變化請求參數審計

配置方式

  1. 注解配置(Servlet 3.0+)

    @WebListener
    public class MyListener implements ServletContextListener { ... }
    
  2. web.xml 配置

    <listener><listener-class>com.example.AppInitListener</listener-class>
    </listener>
    

相關問題

  1. 如何通過 HttpSessionActivationListener 實現分布式會話的數據一致性?
  2. 在 Spring Boot 中如何整合自定義的 Servlet 監聽器?
  3. HttpSessionAttributeListenerHttpSessionBindingListener 的事件觸發順序是怎樣的?










8?? 參考 8

Java Servlet 規范中定義了 8 類監聽器,主要用于監聽 Servlet 三大域對象(ServletContext、HttpSession、ServletRequest) 的生命周期、屬性變化及會話綁定操作。以下是分類詳解及核心接口說明:


一、生命周期監聽器

監聽域對象的 創建與銷毀 事件:

  1. 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應用關閉");}
    }
    
  2. HttpSessionListener
    ? 作用:監聽會話的創建(sessionCreated)和銷毀(sessionDestroyed)。
    ? 典型應用:統計在線用戶數,記錄會話超時日志。

    @WebListener
    public class SessionTracker implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("新會話創建:" + se.getSession().getId());}
    }
    
  3. ServletRequestListener
    ? 作用:監聽請求的初始化(requestInitialized)和結束(requestDestroyed)。
    ? 典型應用:記錄請求耗時、統計 API 調用量。


二、屬性變化監聽器

監聽域對象中 屬性的增刪改 事件:
4. ServletContextAttributeListener
? 作用:監聽 ServletContext 屬性的增刪改。
? 典型應用:動態刷新全局配置(如切換日志級別)。

  1. HttpSessionAttributeListener
    ? 作用:監聽 HttpSession 屬性的增刪改。
    ? 典型應用:用戶權限變更時實時更新權限緩存。

  2. ServletRequestAttributeListener
    ? 作用:監聽 ServletRequest 屬性的增刪改。
    ? 典型應用:校驗請求參數合法性(如敏感詞過濾)。


三、會話綁定與鈍活化監聽器

監聽 會話中對象的綁定狀態序列化行為
7. HttpSessionBindingListener
? 作用:對象感知自身被綁定到會話(valueBound)或解綁(valueUnbound)。
? 特點:無需配置,由對象自身實現接口。

public class User implements HttpSessionBindingListener {@Overridepublic void valueBound(HttpSessionBindingEvent event) {System.out.println("用戶綁定到Session");}
}
  1. HttpSessionActivationListener
    ? 作用:監聽對象隨會話 鈍化(持久化到磁盤)活化(加載到內存) 的過程。
    ? 依賴:需配合 Serializable 接口實現序列化。

四、其他擴展監聽器(Servlet 3.0+)

  1. 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 應用的生命周期應用級屬性變化

  1. ServletContextListener

    • 用途:監聽整個 Web 應用的啟動和關閉。
    • 方法
      • contextInitialized(ServletContextEvent event):應用啟動時觸發。
      • contextDestroyed(ServletContextEvent event):應用關閉時觸發。
    • 典型場景:初始化全局資源(如數據庫連接池)、加載配置文件、記錄應用啟動日志。
  2. ServletContextAttributeListener

    • 用途:監聽 ServletContext(應用級)屬性的增刪改事件。
    • 方法
      • attributeAdded:屬性添加時觸發。
      • attributeRemoved:屬性刪除時觸發。
      • attributeReplaced:屬性值被替換時觸發。
    • 典型場景:監控全局配置變化、記錄屬性操作日志。

二、會話(HttpSession)監聽器

監聽 用戶會話的生命周期會話屬性變化

  1. HttpSessionListener

    • 用途:監聽會話的創建和銷毀。
    • 方法
      • sessionCreated(HttpSessionEvent event):會話創建時觸發(如用戶首次訪問需會話的資源)。
      • sessionDestroyed(HttpSessionEvent event):會話銷毀時觸發(如超時、調用 invalidate())。
    • 典型場景:統計在線用戶數、記錄用戶登錄/下線時間、釋放會話資源。
  2. HttpSessionAttributeListener

    • 用途:監聽 HttpSession(會話級)屬性的增刪改事件。
    • 方法
      • attributeAdded:屬性添加時觸發。
      • attributeRemoved:屬性刪除時觸發。
      • attributeReplaced:屬性值被替換時觸發。
    • 典型場景:監控用戶狀態變化(如購物車更新)、同步緩存數據。
  3. HttpSessionBindingListener

    • 用途:由 對象自身 實現,監聽對象被綁定到會話或解除綁定的事件。
    • 方法
      • valueBound(HttpSessionBindingEvent event):對象被綁定到會話時觸發。
      • valueUnbound(HttpSessionBindingEvent event):對象從會話中解除綁定時觸發。
    • 典型場景:在對象綁定時初始化資源(如數據庫連接),解除綁定時釋放資源。
  4. HttpSessionActivationListener

    • 用途:在 分布式會話 場景下,監聽會話鈍化(序列化到磁盤)和激活(反序列化到內存)事件。
    • 方法
      • sessionDidActivate(HttpSessionEvent event):會話激活時觸發。
      • sessionWillPassivate(HttpSessionEvent event):會話鈍化前觸發。
    • 典型場景:在會話遷移時清理非序列化字段(如線程局部變量)。

三、請求(ServletRequest)監聽器

監聽 單個 HTTP 請求的生命周期請求屬性變化

  1. ServletRequestListener

    • 用途:監聽單個請求的創建和銷毀。
    • 方法
      • requestInitialized(ServletRequestEvent event):請求創建時觸發。
      • requestDestroyed(ServletRequestEvent event):請求銷毀時觸發。
    • 典型場景:記錄請求開始/結束時間、統計請求耗時。
  2. ServletRequestAttributeListener

    • 用途:監聽 ServletRequest(請求級)屬性的增刪改事件。
    • 方法
      • attributeAdded:屬性添加時觸發。
      • attributeRemoved:屬性刪除時觸發。
      • attributeReplaced:屬性值被替換時觸發。
    • 典型場景:監控請求參數變化、記錄屬性操作日志。

四、其他監聽器

  1. ServletRequestListenerHttpSessionListener 的子類
    • 例如 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監聽器主要包括以下幾種:

  1. ServletContextListener

    • 功能描述:用于監聽ServletContext對象的創建和銷毀事件。當Web應用啟動時,容器會自動創建一個ServletContext對象,并調用實現該接口類的contextInitialized方法;當Web應用停止時,容器會調用contextDestroyed方法。
    • 應用場景:在contextInitialized方法中可以進行一些初始化操作,如加載配置文件、初始化數據庫連接池等;在contextDestroyed方法中可以進行清理工作,如釋放資源、關閉數據庫連接等。
  2. HttpSessionListener

    • 功能描述:用于監聽HttpSession對象的創建和銷毀事件。當一個HttpSession被創建時,容器會調用實現該接口類的sessionCreated方法;當一個HttpSession被銷毀時,容器會調用sessionDestroyed方法。
    • 應用場景:在sessionCreated方法中可以記錄用戶的登錄信息、初始化用戶的會話數據等;在sessionDestroyed方法中可以進行清理工作,如移除用戶在服務器上的緩存數據等。
  3. ServletRequestListener

    • 功能描述:用于監聽ServletRequest對象的初始化和結束事件。當一個請求被創建時,容器會調用實現該接口類的requestInitialized方法;當一個請求結束時,容器會調用requestDestroyed方法。
    • 應用場景:可以在requestInitialized方法中進行請求的預處理,如檢查用戶的權限、記錄請求的日志等;在requestDestroyed方法中可以進行請求的后處理,如釋放資源、統計請求的處理時間等。
  4. HttpSessionAttributeListener

    • 功能描述:用于監聽HttpSession對象中屬性的增加、刪除和替換事件。當一個屬性被添加到HttpSession中時,容器會調用實現該接口類的attributeAdded方法;當一個屬性從HttpSession中刪除時,容器會調用attributeRemoved方法;當一個屬性在HttpSession中被替換時,容器會調用attributeReplaced方法。
    • 應用場景:可以在attributeAdded方法中對新添加的屬性進行處理,如驗證屬性的值、更新相關的業務數據等;在attributeRemoved方法中可以清理與屬性相關的資源;在attributeReplaced方法中可以處理屬性值的變化,如觸發相關的業務邏輯。
  5. ServletRequestAttributeListener

    • 功能描述:用于監聽ServletRequest對象中屬性的增加、刪除和替換事件。當一個屬性被添加到ServletRequest中時,容器會調用實現該接口類的attributeAdded方法;當一個屬性從ServletRequest中刪除時,容器會調用attributeRemoved方法;當一個屬性在ServletRequest中被替換時,容器會調用attributeReplaced方法。
    • 應用場景:與HttpSessionAttributeListener類似,可以在attributeAdded、attributeRemoved和attributeReplaced方法中對ServletRequest中的屬性變化進行處理,以滿足特定的業務需求。
  6. HttpSessionBindingListener

    • 功能描述:用于監聽對象與HttpSession綁定和解除綁定的事件。當一個實現了該接口的對象被綁定到HttpSession中時,容器會調用valueBound方法;當該對象從HttpSession中解綁時,容器會調用valueUnbound方法。
    • 應用場景:可以在valueBound方法中執行對象與HttpSession綁定時的初始化操作,如將對象的狀態設置為已綁定等;在valueUnbound方法中可以進行清理工作,如釋放對象占用的資源等。
  7. HttpSessionActivationListener

    • 功能描述:用于監聽HttpSession的活化和鈍化事件。當一個HttpSession被激活時(即客戶端恢復與服務器的交互),容器會調用實現該接口類的sessionWillActivate方法;當一個HttpSession被鈍化時(即客戶端長時間未與服務器交互),容器會調用sessionDidPassivate方法。
    • 應用場景:可以在sessionWillActivate方法中進行一些操作,如重新建立與后端系統的連接等;在sessionDidPassivate方法中可以將HttpSession中的數據持久化到存儲設備中,以便在會話恢復時能夠快速恢復數據。










🔟 參考 10

Java Servlet 監聽器(Listener)用于監聽 Web 應用中關鍵對象(如 ServletContextHttpSessionServletRequest)的生命周期和屬性變化,共分為 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()

四、典型應用場景

  1. 初始化資源
    • ServletContextListener:應用啟動時初始化數據庫連接池或加載全局配置 。
  2. 統計在線用戶
    • HttpSessionListener:通過 sessionCreated()sessionDestroyed() 統計活躍會話數 。
  3. 請求日志記錄
    • ServletRequestListener:記錄請求開始和結束時間,計算耗時 。
  4. 用戶登錄狀態管理
    • HttpSessionBindingListener:用戶登錄時綁定對象到 Session,退出時釋放資源 。
  5. 分布式會話同步
    • HttpSessionActivationListener:在集群環境中同步 Session 數據 。

五、配置方式

  • 注解:在監聽器類上添加 @WebListener(推薦)。
  • XML:在 web.xml 中配置 <listener> 標簽 。

總結

Servlet 監聽器通過監聽 對象生命周期屬性變化,實現資源管理、日志記錄、會話跟蹤等核心功能。根據監聽對象不同,分為 應用級會話級請求級 三類,開發者可根據需求選擇合適的監聽器類型。



















本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77328.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡安全領域的AI戰略準備:從概念到實踐

網絡安全領域的AI準備不僅涉及最新工具和技術的應用&#xff0c;更是一項戰略必需。許多企業若因目標不明確、數據準備不足或與業務重點脫節而未能有效利用AI技術&#xff0c;可能面臨嚴重后果&#xff0c;包括高級網絡威脅數量的激增。 AI準備的核心要素 構建穩健的網絡安全…

[數據結構]2. 順序表

順序表 1. 介紹基本概念存儲方式優點缺點應用場景 2. 順序表操作SeqList.hSeqlist.c 1. 介紹 基本概念 順序表是用一組地址連續的存儲單元依次存儲線性表的數據元素。線性表是具有相同數據類型的 n 個數據元素的有限序列&#xff0c;在順序表中&#xff0c;元素之間的邏輯順序…

o3和o4-mini的升級有哪些亮點?

ChatGPT是基于OpenAI GPT系列的高性能對話生成AI&#xff0c;經過多代迭代不斷提升自然語言理解和生成能力。 在過去的一年中&#xff0c;OpenAI先后發布了GPT-4、GPT?4.1及多種mini版本&#xff0c;為不同使用場景提供靈活選擇。? 隨著用戶需求向更高效、更精準的推理和視覺…

Chrome漏洞可竊取數據并獲得未經授權的訪問權限

在發現兩個關鍵漏洞后,谷歌發布了Chrome瀏覽器的緊急安全更新。這些漏洞可能允許攻擊者竊取敏感數據并未經授權訪問用戶系統。 這些缺陷被識別為CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影響Chrome版本,影響Linux的135.0.7049.95/.96。該更新將在…

力扣面試150題--兩數之和 和 快樂數

Day 25 題目描述 思路 創建一個hashmap從前向后遍歷數組如果存在target-nums[i]在map中&#xff0c;記錄它們兩個的序號返回即可不存在&#xff0c;就將該元素放入map中&#xff0c;存放序號 注意&#xff1a;題目說的是必然存在唯一解 class Solution {public int[] twoSum…

Flutter_學習記錄_狀態管理之GetX

Flutter GetX 狀態管理框架全面解析 1. 狀態管理與 Flutter GetX 介紹 1.1 狀態管理 通俗理解&#xff1a;當我們需要在多個頁面&#xff08;組件/Widget&#xff09;之間共享狀態&#xff08;數據&#xff09;&#xff0c;或者在一個頁面中的多個子組件之間共享狀態時&…

ASP.NET常見安全漏洞及修復方式

Microsoft IIS 版本信息泄露 查看網頁返回的 Header 信息&#xff0c;默認會包含 IIS&#xff0c;ASP.NET 版本信息&#xff1a; 隱藏 Server 標頭 編輯 web.config 文件&#xff0c;在 system.webServer 節點中配置 requestFiltering 來移除Server標頭&#xff1a; <sec…

深入解析Java日志框架Logback:從原理到最佳實踐

Logback作為Java領域最主流的日志框架之一,由Log4j創始人Ceki Glc設計開發,憑借其卓越的性能、靈活的配置以及與SLF4J的無縫集成,成為企業級應用開發的首選日志組件。本文將從架構設計、核心機制、配置優化等維度全面剖析Logback的技術細節。 一、Logback的架構設計與核心模…

OpenStack Yoga版安裝筆記(22)Swift筆記20250418

一、官方文檔 https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html#https://docs.openstack.org/swift/yoga/admin/objectstorage-components.html# 二、對象存儲簡介&#xff08;Introduction to Object Storage&#xff09; OpenStack 對象存儲&a…

Spring Boot日志系統詳解:Logback與SLF4J的默認集成

大家好呀&#xff01;&#x1f44b; 今天我們來聊聊Spring Boot中一個超級重要但又經常被忽視的功能——日志系統&#xff01; 一、日志系統的重要性 首先&#xff0c;咱們得明白為什么日志這么重要&#xff1f;&#x1f937;?♂? 想象一下&#xff0c;你正在玩一個超級復…

【AI提示詞】退休規劃顧問專家

提示說明 隨著人口老齡化的加劇&#xff0c;越來越多的人開始關注退休規劃問題。一個專業的退休規劃顧問可以幫助用戶合理規劃退休生活&#xff0c;確保退休后的生活質量。 提示詞 # 角色 退休規劃顧問專家## 注意 1. 專家設計應符合退休規劃的專業性和可靠性&#xff0c;幫…

樓梯上下檢測數據集VOC+YOLO格式5462張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;5462 標注數量(xml文件個數)&#xff1a;5462 標注數量(txt文件個數)&#xff1a;5462 …

docker 部署服務工具記錄

一、場景 項目需要使用dify和向量庫milvus, 這兩個工具都是使用docker 部署&#xff0c;因此需要安裝docker. 二、docker安裝 系統為debian , 剛開始安裝不是超時&#xff0c;就是依賴版本沖突&#xff0c;查看系統鏡像源文件&#xff1a; cat /etc/apt/sources.list 覺得可…

Oracle、MySQL、PostgreSQL三大數據庫對比分析

Oracle、MySQL、PostgreSQL 三大數據庫的對比分析&#xff0c;結合 Java SpringBoot 項目開發 的實際場景&#xff0c;重點說明分庫分表、主從復制的實現難度及案例。 一、數據庫核心對比 1. 核心區別與適用場景 維度OracleMySQLPostgreSQL定位企業級商業數據庫輕量級開源數據…

Stable Diffusion LoRA模型加載實現風格自由

對于模型微調來說&#xff0c;直接進行微調需要的硬件配置和時間都是相當夸張的&#xff0c;但要想實現風格切換自由&#xff0c;也不是只有模型微調一個方式&#xff0c;LoRA技術可以說很完美的解決了這個難題。無論是二次元畫風還是復古膠片質感&#xff0c;都只需要加載小巧…

貪心算法day10(無重疊區間)

1.無重疊區間 435. 無重疊區間 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 代碼&#xff1a; class Solution {public static int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(v1,v2)->{return v1[0]-v2[0];});int left interva…

Python語言基礎教程(上)4.0

?博客主頁&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客內容》&#xff1a;.NET、Java.測試開發、Python、Android、Go、Node、Android前端小程序等相關領域知識 &#x1f4e2;博客專欄&#xff1a; https://blog.csdn.net/m0_63815035/cat…

PyTorch 浮點數精度全景:從 float16/bfloat16 到 float64 及混合精度實戰

PyTorch 在深度學習中提供了多種 IEEE 754 二進制浮點格式的支持&#xff0c;包括半精度&#xff08;float16&#xff09;、Brain?float&#xff08;bfloat16&#xff09;、單精度&#xff08;float32&#xff09;和雙精度&#xff08;float64&#xff09;&#xff0c;并通過統…

在conda環境下使用pip安裝庫無法import

安裝seleniumwire包&#xff0c;conda環境沒有&#xff0c;pip之后安裝不到當前conda環境 網上的方法都試過了&#xff0c;包括強制安裝等 python -m pip install --upgrade --force-reinstall selenium-wire 最后定位應該是沒有安裝到當前conda的環境下&#xff0c;使用list…

【k8s系列4】工具介紹

1、虛擬機軟件 vmware workstation 2、shell 軟件 MobaXterm 3、centos7.9 下載地址 &#xff08;https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/?spma2c6h.25603864.0.0.374bf5adOaiFPW&#xff09; 4、上網軟件