傳統 JSP 開發大量使用 Scriptlet(<% ... %>)嵌入 Java 代碼,雖然靈活但帶來嚴重維護問題:
JSTL (JSP Standard Tag Library) 為常見展示層任務提供標準標籤庫,配合表達式語言 (Expression Language, EL),實現「無 Java 代碼的 JSP」,大幅降低維護成本。
JSTL 1.0 包含四大標籤庫與兩個驗證器:
| 標籤庫 | 前綴 | 核心功能 |
|---|---|---|
| Core | c | 變量管理、流程控制 (if/choose/forEach)、URL 操作 |
| Format | fmt | 數字/日期格式化、國際化 (i18n) 資源包支持 |
| XML | x | XML 解析、XPath 選擇、XSLT 轉換 |
| SQL | sql | 數據庫查詢、更新、事務控制 (生產環境建議避免直接使用) |
驗證器:ScriptFreeTLV 禁用 Scriptlet,PermittedTaglibsTLV 限制可用標籤庫,強制編碼規範。
EL 表達式以 ${...} 定界,可嵌入標籤屬性或模板文本:
<c:out value="${user.firstName}"/>
<c:out value="Hello ${user.firstName} ${user.lastName}"/> <!-- 字符串拼接 -->
EL 提供 11 個隱式對象,均為 Map 類型,便於查找:
pageScope、requestScope、sessionScope、applicationScope —— 精確指定作用域查找,避免默認順序查找 (page→request→session→application)param (單值)、paramValues (數組)header、headerValuescookie —— 鍵為 Cookie 名,值為 Cookie 對象initParam —— 對應 web.xml 中的 <context-param>此外 pageContext 提供對所有 JSP 隱式對象 (request、response、session 等) 的訪問入口。
${user.address.city}),遵循 JavaBean 規範 (需有 getter)${urls[3]}) 或 Map 鍵值 (${commands["dir"]}),鍵可為表達式null 時返回 null 而不拋異常,鏈式調用極其安全${user["firstName"]} 與 ${user.firstName} 等價;${commands.dir} 與 ${commands["dir"]} 等價| 類別 | 運算符 | 備註 |
|---|---|---|
| 算術 | + - * / (div) % (mod) | div/mod 為 XPath 兼容別名 |
| 關係 | == (eq) != (ne) < (lt) > (gt) <= (le) >= (ge) | 字母別名避免 XML 轉義衝突 |
| 邏輯 | && (and) || (or) ! (not) | |
| 驗證 | empty | 檢測 null、空集合、空字符串 |
優先級順序:[] . () → 一元運算符 → * / % → + - → 關係運算符 → 邏輯運算符。括號可改變優先級。
數字、字符串 (單/雙引號)、布爾值 (true/false)、null。
<%@ taglib uri="https://java.sun.com/jstl/core" prefix="c" %> <!-- EL 版本 -->
<%@ taglib uri="https://java.sun.com/jstl/core_rt" prefix="c_rt" %> <!-- RT 版本 (使用 JSP 表達式) -->
<!-- 屬性方式設置 -->
<c:set var="timezone" scope="session" value="CST"/>
<c:set var="square" value="${param['x'] * param['x']}"/>
<!-- 主體內容方式設置 (可嵌套標籤) -->
<c:set var="timezone" scope="session">CST</c:set>
<!-- 移除變量 -->
<c:remove var="timezone" scope="session"/>
scope 默認為 page,可選 request、session、application。
<c:out value="${user.username}" default="Guest" escapeXml="true"/>
default:值為 null 或空串時的備用輸出escapeXml:默認 true,自動轉義 <>& 為實體,防 XSS<c:set var="timezone" scope="session">
<c:out value="${cookie['tzPref'].value}" default="CST"/>
</c:set>
若 Cookie 不存在,EL 返回 null,<c:out> 輸出默認值 "CST",最終賦給變量。
<c:choose>
<c:when test="${user.role == 'member'}">
<p>Welcome, member!</p>
</c:when>
<c:otherwise>
<p>Welcome, guest!</p>
</c:otherwise>
</c:choose>
完全基於標籤結構,無 Java 代碼,設計師易讀易維護。
JSTL + EL 為 JSP 提供了標準化、可維護的展示層解決方案:
採用 JSTL 開發的 JSP 頁面,純標籤結構接近 HTML,大幅降低維護門檻,是現代 JSP 開發的必經之路。