內容快取是 Web 應用常見優化技術。傳統做法使用自訂標籤 <jc:cache> 封裝頁面片段,將產出內容存為應用範圍變數,後續請求直接輸出快取內容,避免重複執行。但此法無法支援每位用戶/請求的個人化內容。
利用 JSP 2.0 Expression Language (EL),允許快取片段包含未賦值的 EL 表達式(如 ${sessionScope.counter}),於每次輸出時由標籤動態求值。結合 JSTL 與自訂標籤庫,實現「靜態片段快取 + 動態表達式即時運算」的混合模式。
| 策略 | 優點 | 缺點 |
|---|---|---|
| 內容快取 | 實作簡單,適合靜態片段 | 無法個人化 |
| 資料快取 | 記憶體效率高,無 HTML 標記 | 需額外呈現層邏輯 |
| 混合快取 | 資料與呈現分別快取,彈性高 | 架構較複雜 |
JSP 內建 scoped attributes 提供 ID-Object 映射,應用範圍 (application) 為共享快取理想位置。JSTL 範例:
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<c:if test="${empty cachedFragment}">
<c:set var="cachedFragment" scope="application">...</c:set>
</c:if>
${applicationScope.cachedFragment}
需個人化時(如計數器),快取靜態片段 cachedFragment1、cachedFragment2,動態值用 EL 即時運算:
${cachedFragment1} ${counter} ${cachedFragment2}
進階自訂標籤 <jc:cache> + <jc:dynamic expr="..."/> 封裝邏輯:
<jc:cache id="cachedFragmentWithCounter">
... <jc:dynamic expr="sessionScope.counter"/> ...
</jc:cache>
簡單應用用 JSP 變數即可;大量動態內容需專用快取框架,提供大小控制、淘汰策略、監控等功能。EL API 讓 Java 開發者輕鬆實現「模板快取 + 運算式注入」的高效能架構。