JSP 標準標籤庫(JSTL)是一套封裝了 JSP 應用程式通用核心功能的標籤集合。它提供了一種標準化、結構化的方式來處理迭代、條件判斷、XML 文件操作、國際化以及資料庫存取等常見任務,並支援整合自訂標籤的擴充框架。採用 JSTL 能顯著減少 JSP 頁面中的 Java 程式碼,提升程式碼可讀性與維護性。
根據功能不同,JSTL 標籤可分為五大類別:
lib 目錄下的 standard.jar 與 jstl.jar 複製到專案的 /WEB-INF/lib/ 目錄。在 web.xml 中宣告各標籤庫的 URI 與對應的 TLD 檔案位置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="https://java.sun.com/xml/ns/j2ee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<jsp-config>
<taglib>
<taglib-uri>https://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>https://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>https://java.sun.com/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>https://java.sun.com/jstl/xml</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<!-- 其餘 -rt 版本同理 -->
</jsp-config>
</web-app>
每個使用 JSTL 的 JSP 檔案頂部需加入 <%@ taglib %> 指令,例如核心標籤庫:
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
| 標籤 | 功能描述 |
|---|---|
| <c:out> | 輸出資料至頁面,類似 <%= ... %>,但會自動跳脫 XML 特殊字元。 |
| <c:set> | 設定變數值於指定範圍(page、request、session、application)。 |
| <c:remove> | 移除指定範圍內的變數。 |
| <c:catch> | 捕捉例外並選擇性儲存錯誤訊息。 |
| <c:if> | 單一條件判斷。 |
| <c:choose>、<c:when>、<c:otherwise> | 多條件分支結構,類似 switch-case。 |
| <c:import> | 引入絕對或相對 URL 的內容,功能比 <%@ include %> 強大。 |
| <c:forEach> | 通用迭代標籤,支援 Collection、Map、陣列、Iterator 等。 |
| <c:forTokens> | 依指定分隔符切割字串並迭代。 |
| <c:param> | 為 <c:import> 或 <c:redirect> 傳遞參數。 |
| <c:redirect> | 導向至新 URL。 |
| <c:url> | 建立可攜帶查詢參數的 URL,自動處理 Session ID 重寫。 |
引入方式:<%@ taglib prefix="fmt" uri="https://java.sun.com/jsp/jstl/fmt" %>
| 標籤 | 說明 |
|---|---|
| <fmt:formatNumber> | 依指定格式或精度格式化數字、貨幣、百分比。 |
| <fmt:parseNumber> | 解析字串為數字、貨幣或百分比。 |
| <fmt:formatDate> | 依模式或風格格式化日期時間。 |
| <fmt:parseDate> | 解析字串為日期時間物件。 |
| <fmt:bundle> / <fmt:setBundle> | 綁定資源包(ResourceBundle)供國際化訊息使用。 |
| <fmt:setLocale> | 指定當前頁面的 Locale。 |
| <fmt:timeZone> / <fmt:setTimeZone> | 設定時區。 |
| <fmt:message> | 輸出資源包中的國際化訊息。 |
| <fmt:requestEncoding> | 設定 Request 的字元編碼。 |
引入方式:<%@ taglib prefix="sql" uri="https://java.sun.com/jsp/jstl/sql" %>
注意:實務上建議在 Service 層處理資料庫邏輯,JSP 僅負責顯示,避免業務邏輯與視圖耦合。
| 標籤 | 說明 |
|---|---|
| <sql:setDataSource> | 定義資料來源(DataSource 或 JDBC 參數)。 |
| <sql:query> | 執行 SELECT 查詢,結果可存入變數。 |
| <sql:update> | 執行 INSERT、UPDATE、DELETE 等更新操作。 |
| <sql:param> | 為 SQL 參數設定值(防止 SQL 注入)。 |
| <sql:dateParam> | 專門設定日期型別參數。 |
| <sql:transaction> | 提供交易控制,確保多條 SQL 同成功同失敗。 |
引入方式:<%@ taglib prefix="x" uri="https://java.sun.com/jsp/jstl/xml" %>
使用前需額外將 XercesImpl.jar 與 xalan.jar 放入 Tomcat lib 目錄。
| 標籤 | 說明 |
|---|---|
| <x:out> | 輸出 XPath 運算式結果,自動跳脫 XML 字元。 |
| <x:parse> | 解析 XML 文件或字串,建立 Document 物件。 |
| <x:set> | 將 XPath 運算式結果存入變數。 |
| <x:if>、<x:choose>、<x:when>、<x:otherwise> | 針對 XPath 運算式進行條件判斷。 |
| <x:forEach> | 迭代 XML 節點集合。 |
| <x:transform> | 套用 XSLT 樣式表轉換 XML。 |
| <x:param> | 為 XSLT 轉換傳遞參數。 |
引入方式:<%@ taglib prefix="fn" uri="https://java.sun.com/jsp/jstl/functions" %>
常用函數舉例:
fn:contains(str, substr):判斷字串是否包含子字串。fn:split(str, delimiter):依分隔符切割字串為陣列。fn:join(arr, separator):將陣列元素合併為字串。fn:replace(str, before, after):字串替換。fn:escapeXml(str):跳脫 XML 特殊字元。fn:toUpperCase(str) / fn:toLowerCase(str):大小寫轉換。fn:trim(str):移除首尾空白。<c:forEach>、<c:if>、<c:set> 等。