首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JSTL 標簽庫完全速查手冊:fmt、fn、c 標簽核心用法與實戰技巧

     編輯:Java 綜合教學

JSTL 標簽庫完全速查手冊:fmt、fn、c 標簽核心用法與實戰技巧

JSTL (JSP Standard Tag Library) 是 JSP 頁面開發的標準工具箱,將格式化、字符串操作、流程控制等通用邏輯封裝為聲明式標簽,大幅減少 Scriptlet 代碼。本文系統整理 fmt 格式化、fn 函數庫、c 核心流程控制 三大模塊高頻用法,附帶實戰片段,作為開發時的「隨身速查表」。

一、 fmt 模塊:格式化輸出利器

1. 數字格式化 <fmt:formatNumber>

<!-- 百分比輸出:0.85 → 85% -->
<fmt:formatNumber value="${user.adoptRate}" type="percent" />

<!-- 貨幣格式:1234.5 → ¥1,234.50 -->
<fmt:formatNumber value="${order.amount}" type="currency" currencySymbol="¥" />

<!-- 保留 2 位小數 -->
<fmt:formatNumber value="${ratio}" maxFractionDigits="2" />

2. 日期時間格式化 <fmt:formatDate>

type 屬性輸出示例說明
date2024-03-15僅日期
time14:30:45僅時間
both2024-03-15 14:30:45日期+時間
<!-- 自定義模式(推薦:統一項目格式) -->
<fmt:formatDate value="${createTime}" pattern="yyyy-MM-dd HH:mm:ss" />
<fmt:formatDate value="${createTime}" pattern="yyyy年MM月dd日 EEEE" /> <!-- 2024年03月15日 星期五 -->

<!-- 時區控制 -->
<fmt:formatDate value="${utcTime}" timeZone="GMT+8" pattern="yyyy-MM-dd HH:mm:ss" />

3. 解析輸入 <fmt:parseNumber> / <fmt:parseDate>

<fmt:parseNumber value="1,234.56" type="currency" var="parsedNum" /> <!-- var 存入變量 -->
<fmt:parseDate value="2024-03-15" pattern="yyyy-MM-dd" var="parsedDate" />

4. 國際化資源包 <fmt:bundle> + <fmt:message>

<fmt:bundle basename="i18n.messages">
    <fmt:message key="welcome" /> <!-- 輸出 messages_zh_CN.properties 中 welcome 值 -->
</fmt:bundle>

二、 fn 函數庫:EL 表達式中的字符串瑞士軍刀

命名空間:xmlns:fn="https://java.sun.com/jsp/jstl/functions"

函數簽名說明示例
containsboolean contains(string, substring)包含判斷(區分大小寫)${fn:contains(name, 'admin')}
containsIgnoreCaseboolean containsIgnoreCase(string, substring)忽略大小寫包含${fn:containsIgnoreCase(email, 'GMAIL')}
startsWithboolean startsWith(string, prefix)前綴匹配${fn:startsWith(url, 'https')}
endsWithboolean endsWith(string, suffix)後綴匹配${fn:endsWith(fileName, '.pdf')}
substringString substring(string, begin, end)截取 [begin, end)${fn:substring(id, 0, 6)}
substringBeforeString substringBefore(string, separator)分隔符前部分${fn:substringBefore(email, '@')}
substringAfterString substringAfter(string, separator)分隔符後部分${fn:substringAfter(url, '://')}
replaceString replace(string, before, after)全量替換${fn:replace(content, '<', '&lt;')}
splitString[] split(string, separator)分割為數組${fn:split(tags, ',')}
joinString join(array, separator)數組連接為字符串${fn:join(roles, ', ')}
lengthint length(item)集合/數組/字符串長度${fn:length(userList) > 0}
toUpperCaseString toUpperCase(string)轉大寫${fn:toUpperCase(code)}
toLowerCaseString toLowerCase(string)轉小寫${fn:toLowerCase(domain)}
trimString trim(string)去首尾空白${fn:trim(input)}
escapeXmlString escapeXml(string)轉義 XML/HTML 特殊字符${fn:escapeXml(userInput)}
indexOfint indexOf(string, substring)首次出現索引${fn:indexOf(str, 'error') != -1}

三、 c 模塊:流程控制與變量管理

1. 條件判斷 <c:if> / <c:choose>

<c:if test="${not empty user.avatar}">
    <img src="${user.avatar}" />
</c:if>

<c:choose>
    <c:when test="${user.role == 'ADMIN'}">管理員</c:when>
    <c:when test="${user.role == 'VIP'}">會員</c:when>
    <c:otherwise>普通用戶</c:otherwise>
</c:choose>

2. 循環迭代 <c:forEach>

<!-- 列表遍歷 -->
<c:forEach items="${articleList}" var="article" varStatus="status">
    ${status.count}. ${article.title} <br/>
</c:forEach>

<!-- 數字範圍 -->
<c:forEach begin="1" end="10" step="2" var="i">
    ${i}  
</c:forEach>

<!-- 分割字符串遍歷(配合 fn:split) -->
<c:forEach items="${fn:split(searchKeywords, ',')}" var="kw">
    <span class="tag">${kw}</span>
</c:forEach>

3. 變量設置 <c:set> / <c:remove>

<c:set var="pageSize" value="20" scope="session" />
<c:set target="${map}" property="key" value="newValue" /> <!-- Map/Bean 設置屬性 -->
<c:remove var="tempVar" scope="request" />

4. URL 重寫 <c:url> / <c:param>

<c:url value="/search" var="searchUrl">
    <c:param name="q" value="${keyword}" />
    <c:param name="page" value="${pageNum}" />
</c:url>
<a href="${searchUrl}">搜索</a>

四、 實戰組合拳:關鍵詞高亮標簽雲

<c:if test="${not empty searchForm.keywords}">
    <c:set var="kwArray" value="${fn:split(searchForm.keywords, ',')}" />
    <c:forEach items="${kwArray}" var="kw" varStatus="vs">
        <span class="badge badge-${vs.index % 5 + 1}">
            ${fn:escapeXml(kw)} <!-- 防 XSS -->
        </span>
    </c:forEach>
</c:if>

五、 避坑指南

  1. EL 表達式不生效:檢查 web.xml version="3.0+"、JSP 頁面 isELIgnored="false"、引入 jstl-1.2.jar(非 1.0/1.1)。
  2. fn:split 返回數組非 List:<c:forEach> 直接支持數組,無需轉換。
  3. fmt:formatDate 時區坑:服務器時區非目標時區時,必須顯式 timeZone 屬性。
  4. escapeXml 必用於用戶輸入輸出:防止 XSS,是安全底線。
  5. 不要在 JSTL 中做複雜業務邏輯:屬於 Controller/Service 層,JSTL 僅負責視圖邏輯。

JSTL 標簽庫雖屬「上古」技術,但在存量 JSP 系統、傳統 MVC 專案、甚至 Thymeleaf/FreeMarker 模板中,其聲明式風格與 fn 函數庫仍具極高參考價值。熟練掌握上述核心標簽,能讓視圖層代碼乾淨、安全、易維護。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved