Servlet 可透過 web.xml 的 <load-on-startup> 在 Web 容器啟動時自動初始化,適合載入不常變動的字典表、設定檔等資料到記憶體快取。本文示範建立 UserCacheServlet,容器啟動時預載用戶 ID/名稱,手動呼叫可刷新快取。
File → New → Web → Standard ServletUserCacheServlet,Package: bookstore.servletdoGet()(預設),Next 跳過第 3 步/usercacheservlet,Finish雙擊專案節點開啟 Web Module DD 編輯器,展開 Servlets → usercacheservlet,設定 Load on startup = 2(順序 1 留給系統基礎 Servlet)。
生成的 web.xml 片段:
<servlet>
<servlet-name>usercacheservlet</servlet-name>
<servlet-class>bookstore.servlet.UserCacheServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>usercacheservlet</servlet-name>
<url-pattern>/usercacheservlet</url-pattern>
</servlet-mapping>
注意:刪除 Servlet 類別時,web.xml 部署描述不會自動刪除,需手動移除。
public class UserCacheServlet extends HttpServlet {
public void init() throws ServletException {
UserList.fillUser(); // 容器啟動時自動執行
}
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
UserList.fillUser(); // 手動刷新快取
resp.setContentType("text/html; charset=GBK");
PrintWriter out = resp.getWriter();
out.println("刷新成功!");
out.close();
}
}
public class UserList {
private static Map userMap; // userId → userName
public static void fillUser() {
if (userMap == null) userMap = new HashMap();
else userMap.clear();
// JDBC 查詢 T_USER,填入 userMap
}
public static String getUserListHTML() {
// 從 userMap 產生 <option> 下拉選單 HTML
}
}
init() → fillUser() 從 DB 載入快取login.jsp 產生下拉選單時,呼叫 getUserListHTML() 直接讀快取/usercacheservlet → doGet() 刷新快取避免每次登入頁面都查資料庫,減少 I/O、CPU、網路開銷。此模式適用於「寫少讀多、資料相對靜態」的字典表、代碼表、設定參數等場景。