JSP標準標簽庫(JSTL)封裝了Web開發中高頻的通用功能:迭代/條件判斷、數據格式化、XML操作、數據庫訪問、國際化等。它讓JSP作者擺脫<% %>Scriptlet的纏繞,實現「頁面無Java代碼」的潔淨分層。本文系統梳理JSTL 1.0四大標簽庫與EL表達式核心語法。
傳統Scriptlet實現條件內容:
<% if (user.getRole().equals("member")) { %>
<p>Welcome, member!</p>
<% } else { %>
<p>Welcome, guest!</p>
<% } %>
痛點:花括號匹配極易出錯、嵌套Scriptlet調試困難、設計師與程序員職責混淆、編譯錯誤信息難定位。JSTL以聲明式標簽解決所有問題。
| 前綴 | URI | 功能領域 | 核心標簽示例 |
|---|---|---|---|
| c | https://java.sun.com/jsp/jstl/core | 流程控制、變量管理、URL操作 | <c:if> <c:choose/when/otherwise> <c:forEach> <c:set> <c:url> |
| fmt | https://java.sun.com/jsp/jstl/fmt | 數字/日期格式化、國際化(i18n) | <fmt:formatNumber> <fmt:formatDate> <fmt:message> <fmt:setLocale> |
| x | https://java.sun.com/jsp/jstl/xml | XML解析、XPath選擇、XSLT轉換 | <x:parse> <x:out> <x:forEach> <x:transform> |
| sql | https://java.sun.com/jsp/jstl/sql | 數據庫查詢/更新、事務控制 | <sql:query> <sql:update> <sql:transaction> |
另含兩個驗證器:ScriptFreeTLV(禁用Scriptlet)、PermittedTaglibsTLV(限制可用標簽庫),在web.xml中配置<jsp-property-group>啟用。
EL格式:${expression},定界符${ }。支持:
pageScope、requestScope、sessionScope、applicationScope、param、paramValues、header、headerValues、cookie、initParam、pageContext)。${user.name}(點號)、${user['full-name']}(括號)、${list[0]}(索引)、${map.key}(Map鍵)。? :。<!-- 單純輸出 -->
<c:out value="${user.firstName}"/>
<!-- 字符串拼接 -->
<c:out value="Hello ${user.firstName} ${user.lastName}"/>
<!-- 條件判斷 -->
<c:choose>
<c:when test="${user.role eq 'admin'}"><span class="badge">Admin</span></c:when>
<c:when test="${user.role eq 'member'}">Member</c:when>
<c:otherwise>Guest</c:otherwise>
</c:choose>
<!-- 迭代集合 -->
<c:forEach var="item" items="${cart.items}" varStatus="status">
<tr class="${status.index % 2 == 0 ? 'even' : 'odd'}">
<td>${item.name}</td><td>${item.price}</td>
</tr>
</c:forEach>
<!-- 格式化貨幣 -->
<fmt:formatNumber value="${order.total}" type="currency" currencySymbol="¥"/>
ScriptFreeTLV強制團隊使用JSTL/EL。javax.el),語法更強大(支持方法調用、Lambda等)。JSTL+EL是JSP頁面「去代碼化」的基石,掌握它等於掌握了現代JSP開發的正確姿勢。