Servlet 是 Java Web 開發的基石,掌握其配置對象、上下文共享、線程模型與加載時機,是寫出高併發、無 Bug Web 應用的前提。
對應 web.xml 中 <servlet> 標籤內的配置。由容器實現,每個 Servlet 實例擁有一個專屬的 ServletConfig。
// 核心 API String getServletName(); // 獲取 <servlet-name> ServletContext getServletContext(); // 獲取全局上下文 String getInitParameter(String name); // 獲取指定初始化參數 EnumerationgetInitParameterNames();// 獲取所有參數名
配置示例:
<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>
對應 <web-app>,一個 Web 應用僅有一個實例。容器啟動時創建,關閉時銷毀。所有 Servlet 共享同一實例,適合存放全局配置、緩存、資源路徑解析。
<context-param> 定義,getInitParameter() 讀取。setAttribute/getAttribute/removeAttribute,生命周期 = 應用生命周期。String getRealPath(String path); // 相對路徑轉絕對磁盤路徑 InputStream getResourceAsStream(String path); // 讀取 classpath/webapp 下資源 SetgetResourcePaths(String path); // 列出目錄下所有資源
getRequestDispatcher(path).forward/include(req, resp)。log(String msg) 寫入容器日誌。service() 方法。ThreadLocal、請求屬性(request.setAttribute)或 Session。<load-on-startup><servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.example.InitServlet</servlet-class>
<load-on-startup>0</load-on-startup> <!-- 非負整數,越小優先級越高 -->
</servlet>
init(),數值越小越早載入。<url-pattern>/ 開頭:/user/*、*.do、/api/user。/)。@WebServlet("/user/*") 註解配置,無需 web.xml。| 對象 | 作用域 | 生命周期 | 主要用途 |
|---|---|---|---|
| ServletConfig | 單 Servlet | Servlet 實例存活期 | 讀取初始化參數、獲取 ServletContext |
| ServletContext | 全局應用 | 容器啟動~關閉 | 全局配置、屬性共享、資源訪問、請求轉發 |
| ServletRequest | 單次請求 | 請求處理期間 | 請求參數、屬性、轉發/包含 |
| HttpSession | 用戶會話 | 30min 默認/手動失效 | 用戶狀態、購物車、登錄態 |
牢記「Servlet 單實例多線程、無狀態設計、Context 全局共享、Config 局部配置」,即可規避 90% 的 Servlet 併發與配置坑。