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

Servlet 核心知識點精講:ServletConfig、ServletContext、線程安全與生命周期

     編輯:Java 綜合教學

Servlet 核心知識點精講:ServletConfig、ServletContext、線程安全與生命周期

Servlet 是 Java Web 開發的基石,掌握其配置對象、上下文共享、線程模型與加載時機,是寫出高併發、無 Bug Web 應用的前提。

1. ServletConfig:單個 Servlet 的配置視圖

對應 web.xml 中 <servlet> 標籤內的配置。由容器實現,每個 Servlet 實例擁有一個專屬的 ServletConfig。

// 核心 API
String getServletName();                    // 獲取 <servlet-name>
ServletContext getServletContext();         // 獲取全局上下文
String getInitParameter(String name);       // 獲取指定初始化參數
Enumeration getInitParameterNames();// 獲取所有參數名

配置示例:

<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>com.example.MyServlet</servlet-class>
    <init-param>
        <param-name>configPath</param-name>
        <param-value>/WEB-INF/config.properties</param-value>
    </init-param>
</servlet>

2. ServletContext:整個 Web 應用的全局共享對象

對應 <web-app>,一個 Web 應用僅有一個實例。容器啟動時創建,關閉時銷毀。所有 Servlet 共享同一實例,適合存放全局配置、緩存、資源路徑解析。

核心功能

  • 全局初始化參數:<context-param> 定義,getInitParameter() 讀取。
  • 屬性作用域:setAttribute/getAttribute/removeAttribute,生命周期 = 應用生命周期。
  • 資源路徑操作:
    String getRealPath(String path);           // 相對路徑轉絕對磁盤路徑
    InputStream getResourceAsStream(String path); // 讀取 classpath/webapp 下資源
    Set getResourcePaths(String path);   // 列出目錄下所有資源
    
  • 請求轉發/包含:getRequestDispatcher(path).forward/include(req, resp)。
  • 日誌輸出:log(String msg) 寫入容器日誌。

3. Servlet 線程安全:無狀態是鐵律

  • Servlet 非線程安全,容器對每個請求啟動新線程調用同一實例的 service() 方法。
  • 禁用實例變量(成員變量)存儲請求相關狀態,否則多線程並發會數據錯亂。
  • 只能使用局部變量(棧內存,線程私有)或無狀態/只讀的成員變量(如 DataSource、配置對象、Service Bean)。
  • 若必須共享狀態,使用 ThreadLocal、請求屬性(request.setAttribute)或 Session。

4. 容器啟動時實例化:<load-on-startup>

<servlet>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>com.example.InitServlet</servlet-class>
    <load-on-startup>0</load-on-startup> <!-- 非負整數,越小優先級越高 -->
</servlet>
  • 值 >= 0:容器啟動時實例化並調用 init(),數值越小越早載入。
  • 值 < 0 或缺省:首次請求時延遲加載。
  • 用途:預加載緩存、啟動定時任務、初始化連接池、註冊 ShutdownHook。

5. URL 映射模式 <url-pattern>

  • 以 / 開頭:/user/*、*.do、/api/user。
  • 精確匹配優先 > 目錄匹配 > 擴展名匹配 > 默認 Servlet(/)。
  • Servlet 3.0+ 支援 @WebServlet("/user/*") 註解配置,無需 web.xml。

總結速記表

對象作用域生命周期主要用途
ServletConfig單 ServletServlet 實例存活期讀取初始化參數、獲取 ServletContext
ServletContext全局應用容器啟動~關閉全局配置、屬性共享、資源訪問、請求轉發
ServletRequest單次請求請求處理期間請求參數、屬性、轉發/包含
HttpSession用戶會話30min 默認/手動失效用戶狀態、購物車、登錄態

牢記「Servlet 單實例多線程、無狀態設計、Context 全局共享、Config 局部配置」,即可規避 90% 的 Servlet 併發與配置坑。

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