Servlet 區別於 JSP 的關鍵特性:可透過 web.xml 配置 <load-on-startup>,在 Web 容器啟動時自動初始化。本文示範在 JBuilder 2005 中建立自啟動 Servlet,於啟動期快取系統用戶資料至記憶體。
refresh 介面供手動更新File → New → Web → Standard ServletUserCacheServlet, Package: bookstore.servletdoGet() (供手動刷新呼叫),稍後手動加入 init()/usercacheservlet雙擊專案 webModule 節點,開啟 Web Module DD Editor。
Servlets → 找到 usercacheservlet1 (正整數,數字越小越早啟動)web.xml 將產生:<servlet>
<servlet-name>usercacheservlet</servlet-name>
<servlet-class>bookstore.servlet.UserCacheServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>usercacheservlet</servlet-name>
<url-pattern>/usercacheservlet</url-pattern>
</servlet-mapping>
public class UserCacheServlet extends HttpServlet {
private static Map<Long, String> userCache = new ConcurrentHashMap<>();
@Override
public void init() throws ServletException {
super.init();
loadUsers(); // 容器啟動時自動執行
}
private void loadUsers() {
// 模擬從資料庫載入
userCache.clear();
userCache.put(1L, "Alice");
userCache.put(2L, "Bob");
userCache.put(3L, "Charlie");
System.out.println("用戶快取載入完成,共 " + userCache.size() + " 筆");
}
// 手動刷新入口:GET /usercacheservlet
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
loadUsers();
resp.getWriter().write("用戶快取已刷新,當前筆數:" + userCache.size());
}
// 供其他元件呼叫
public static String getUserName(Long id) {
return userCache.get(id);
}
}
https://localhost:8080/webModule/usercacheservlet → 顯示刷新成功UserCacheServlet.getUserName(id) 即時取得資料load-on-startup 必須為 正整數,0 或負數不生效init() 中異常會導致 Servlet 初始化失敗,容器可能標記為不可用ConcurrentHashMap 或 Cache 框架 (Ehcache/Caffeine)load-on-startup 是 Servlet 規範提供的強大功能,配合 init() 可實現啟動期資料預熱,大幅降低首次請求延遲。JBuilder 視覺化配置降低了出錯機率,實務中建議搭配快取框架使用。