ServletContext 是 Servlet 容器提供的應用層級上下文,全域唯一,支援跨 Servlet 共享資料與配置。本文系統整理三大核心用法:初始化參數讀取、容器日誌記錄、資源文件存取,並釐清 server.xml 與 web.xml 兩層配置的差異。
ServletContext 提供 getInitParameter(String name) 統一讀取介面,但參數來源分兩層:
server.xml 的 <Context>)<Context path="/testcontext" docBase="/context" ...>
<Parameter name="name" value="yangqisheng" />
</Context>
此參數屬於 整個 Web 應用在容器部署時的配置,適合資料庫連線、第三方服務金鑰等環境相關設定。
web.xml 的 <context-param>)<context-param>
<param-name>age</param-name>
<param-value>24</param-value>
</context-param>
此參數隨 WAR 包部署,適合應用內部固定配置(如分頁大小、功能開關)。
程式碼統一讀取:
String name = getServletContext().getInitParameter("name"); // 來自 server.xml
String age = getServletContext().getInitParameter("age"); // 來自 web.xml
透過 ServletContext.log(String msg) 可將訊息寫入容器日誌系統。
server.xml)<Logger className="org.apache.catalina.logger.FileLogger"
prefix="localhost_log." suffix=".txt" timestamp="true"/>
prefix/suffix:檔案命名模式timestamp:是否在檔名加入時間戳getServletContext().log("使用者登入:user123");
輸出範例:localhost_log.2024-05-20.txt
避免硬編碼絕對路徑,ServletContext 提供兩種資源存取方式:
| 方法 | 回傳型別 | 特點 |
|---|---|---|
getResource(String path) |
URL |
路徑必須以 / 開頭(Web 應用根目錄),可轉為 File 或 InputStream |
getResourceAsStream(String path) |
InputStream |
直接取得輸入流,適合讀取屬性檔、XML、JSON 等 |
WEB-INF/me.properties// 1. 取得輸入流
InputStream is = getServletContext().getResourceAsStream("/WEB-INF/me.properties");
// 2. 載入 Properties
Properties props = new Properties();
props.load(is);
// 3. 讀取屬性
String name = props.getProperty("name"); // yangqisheng
String age = props.getProperty("age"); // 25
關鍵優勢:不需知道部署絕對路徑,專案遷移、容器升級皆不受影響。
server.xml)與應用層(web.xml),同一 API 讀取。ServletContext.log() 配合 server.xml <Logger> 實現標準化輸出。getResourceAsStream() 以流方式讀取,路徑以 / 開頭對應 Web 根目錄。