首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

深入學習 JavaWeb 中 Listener 監聽器的應用

     編輯:Java 相關知識

前言

Servlet 規範定義多種監聽器,用於感知 Web 應用生命週期、會話變化、屬性增刪改等事件。本文詳細講解三大類監聽器:域對象屬性監聽、Session 綁定感知、Servlet 請求/上下文/會話生命週期監聽,附完整代碼與配置示例。

一、域對象屬性監聽器

監聽 ServletContext、HttpSession、ServletRequest 三大域對象的屬性增、刪、改事件。

監聽器介面對應域事件方法
ServletContextAttributeListenerApplicationattributeAdded/Removed/Replaced
HttpSessionAttributeListenerSessionattributeAdded/Removed/Replaced
ServletRequestAttributeListenerRequestattributeAdded/Removed/Replaced

實作範例

@WebListener
public class MyContextAttrListener implements ServletContextAttributeListener {
    @Override public void attributeAdded(ServletContextAttributeEvent e) {
        log.info("Application 新增屬性: {} = {}", e.getName(), e.getValue());
    }
    @Override public void attributeRemoved(ServletContextAttributeEvent e) {
        log.info("Application 移除屬性: {} = {}", e.getName(), e.getValue());
    }
    @Override public void attributeReplaced(ServletContextAttributeEvent e) {
        log.info("Application 替換屬性: {} = {}", e.getName(), e.getValue());
    }
}

web.xml 註冊(或用 @WebListener 註解):

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

二、Session 綁定與鈍化/活化感知

這兩個介面由被綁定的 JavaBean 實作,無需在 web.xml 註冊。

HttpSessionBindingListener
感知自己被放入/移出 Session。
valueBound(HttpSessionBindingEvent) / valueUnbound(...)
HttpSessionActivationListener
感知 Session 鈍化(序列化到磁碟)與活化(反序列化回記憶體)。
sessionWillPassivate(HttpSessionEvent) / sessionDidActivate(...)
前提:類實作 Serializable,且容器配置支援 Session 持久化(如 Tomcat context.xml 配置 PersistentManager)。

範例:綁定感知

public class UserSessionData implements HttpSessionBindingListener, Serializable {
    private String username;
    @Override public void valueBound(HttpSessionBindingEvent e) {
        log.info("用戶 {} 登入,Session ID: {}", username, e.getSession().getId());
    }
    @Override public void valueUnbound(HttpSessionBindingEvent e) {
        log.info("用戶 {} 登出/超時", username);
    }
}
// 使用
session.setAttribute("userData", new UserSessionData("admin")); // 觸發 valueBound
session.removeAttribute("userData"); // 觸發 valueUnbound

三、生命週期監聽器

監聽器監聽對象典型用途
ServletContextListenerWeb 應用啟動/銷毀初始化資源(連接池、配置、定時任務)、銷毀釋放
HttpSessionListenerSession 建立/銷毀在線人數統計、Session 創建時預載資料
ServletRequestListenerRequest 進入/銷毀請求耗時統計、ThreadLocal 清理、Open-in-View 模式

ServletContextListener 經典用法

@WebListener
public class AppInitializer implements ServletContextListener {
    @Override public void contextInitialized(ServletContextEvent sce) {
        ServletContext ctx = sce.getServletContext();
        // 載入配置、初始化連接池、啟動排程器
        DataSource ds = createDataSource();
        ctx.setAttribute("dataSource", ds);
        log.info("應用啟動完成");
    }
    @Override public void contextDestroyed(ServletContextEvent sce) {
        DataSource ds = (DataSource) sce.getServletContext().getAttribute("dataSource");
        if (ds instanceof HikariDataSource) ((HikariDataSource) ds).close();
        log.info("應用關閉,資源釋放完成");
    }
}

四、監聽器執行順序與注意事項

  • ServletContextListener:啟動時按配置順序 contextInitialized;銷毀時逆序 contextDestroyed。
  • 異常處理:contextInitialized 拋出異常會導致應用啟動失敗。
  • 線程安全:監聽器方法由容器調用,多線程並發訪問共享資源需自行同步。
  • Spring 整合:Spring 提供 ContextLoaderListener、RequestContextListener 等,自動橋接 Spring 容器生命週期。

五、總結

監聽器是 JavaWeb 事件驅動架構的核心組件。掌握三大域屬性監聽、Session 綁定/鈍化感知、上下文/會話/請求生命週期監聽,能實現資源管理、統計分析、安全審計、快取預熱等橫切關注點。實務中配合 Spring 事件機制(ApplicationListener)可構建更靈活的業務事件體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved