在早期 JSP 開發中,大量使用 Scriptlet(<% ... %>)嵌入 Java 程式碼,導致視圖與業務邏輯耦合嚴重,維護困難。JSTL(JSP Standard Tag Library)作為標準標籤庫,提供了流程控制、資料格式化、迭代、XML 操作等通用功能,讓 JSP 回歸純標記語言本質,實現前後端職責分離。
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
<c:out> - 安全輸出<c:out value="${user.name}" default="匿名用戶" escapeXml="true" />
自動轉義 HTML 特殊字元(< → <),防範 XSS 攻擊,default 屬性處理 null 值。
<c:set> - 變數賦值<!-- 設定頁面範圍變數 --> <c:set var="siteName" value="技術部落格" scope="page" /> <!-- 移除變數 --> <c:set var="temp" scope="request" />
支援 page/request/session/application 四大作用域,比 Scriptlet 更清晰。
<c:if> / <c:choose> - 條件判斷<c:if test="${not empty param.keyword}">
搜尋關鍵字:${param.keyword}
</c:if>
<c:choose>
<c:when test="${user.role == 'admin'}">管理員面板</c:when>
<c:when test="${user.role == 'editor'}">編輯器介面</c:when>
<c:otherwise>普通用戶視圖</c:otherwise>
</c:choose>
choose/when/otherwise 等同於 if/else if/else,避免巢狀 if 造成可讀性下降。
<c:forEach> - 迭代王者<!-- 數字範圍迭代 -->
<c:forEach var="i" begin="1" end="10" step="2">${i} </c:forEach>
<!-- 集合/陣列迭代(支援 varStatus 獲取索引) -->
<c:forEach items="${articleList}" var="article" varStatus="status">
${status.index + 1}. ${article.title} <br/>
</c:forEach>
<!-- Map 迭代 -->
<c:forEach items="${scoreMap}" var="entry">
${entry.key} : ${entry.value} <br/>
</c:forEach>
varStatus 提供 index(0-based)、count(1-based)、first/last、begin/end 等豐富屬性,極大簡化模板邏輯。
<c:url> / <c:param> - URL 重寫與參數編碼<c:url value="/article/detail" var="detailUrl">
<c:param name="id" value="${article.id}" />
<c:param name="title" value="${article.title}" />
</c:url>
<a href="${detailUrl}">閱讀全文</a>
自動處理 Session ID 重寫(支援無 Cookie 環境)與 URL 編碼,比手工拼接字串安全可靠得多。
<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
<!-- 日期格式化 -->
<fmt:formatDate value="${article.publishTime}" pattern="yyyy-MM-dd HH:mm" />
<!-- 數字格式化(貨幣、百分比、自定義模式) -->
<fmt:formatNumber value="${product.price}" type="currency" currencySymbol="¥" />
<fmt:formatNumber value="${discount}" pattern="#.##%" />
<!-- 解析輸入 -->
<fmt:parseDate value="${param.birthday}" pattern="yyyy-MM-dd" var="birthDate" />
<%@ taglib prefix="fn" uri="https://java.sun.com/jsp/jstl/functions" %>
${fn:length(list)} <!-- 集合/陣列/字串長度 -->
${fn:toUpperCase(name)} <!-- 大小寫轉換 -->
${fn:substring(str, 0, 10)} <!-- 截取子串 -->
${fn:replace(text, 'old', 'new')} <!-- 字串替換 -->
${fn:split(keywords, ',')} <!-- 分割字串為陣列 -->
${fn:escapeXml(html)} <!-- XML 轉義 -->
${fn:contains(haystack, 'needle')} <!-- 包含判斷 -->
<% %>,強制使用 JSTL/EL。page < request < session < application,按需選擇最小作用域。${user.name} 比 <c:out value="${user.name}"> 更簡潔,但需注意 XSS 風險(可配置 escapeXml 預設為 true)。JSTL 核心標籤庫(c:)、格式化標籤庫(fmt:)、函數標籤庫(fn:)構成了 JSP 視圖層的標準工具箱。熟練掌握 forEach 迭代、choose 分支、fmt 格式化,能讓視圖模板乾淨、安全、易維護。下一步建議學習 EL 3.0 的 Lambda/Stream 支援,以及 Thymeleaf/FreeMarker 等現代模板引擎,順應前後端分離趨勢。