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

JSTL 入門指南:表達式語言 (EL) 全面解析

     編輯:Java 相關知識

為什麼需要 JSTL 與 EL?

傳統 JSP 開發大量使用 Scriptlet(<% ... %>)嵌入 Java 代碼,雖然靈活但帶來嚴重維護問題:

  • 頁面邏輯與展示混雜,設計師與開發師職責不清
  • 括號匹配、語法錯誤難以排查,編譯錯誤提示不明確
  • 代碼複用性差,相同邏輯在多頁重複

JSTL (JSP Standard Tag Library) 為常見展示層任務提供標準標籤庫,配合表達式語言 (Expression Language, EL),實現「無 Java 代碼的 JSP」,大幅降低維護成本。

JSTL 1.0 架構概覽

JSTL 1.0 包含四大標籤庫與兩個驗證器:

標籤庫前綴核心功能
Corec變量管理、流程控制 (if/choose/forEach)、URL 操作
Formatfmt數字/日期格式化、國際化 (i18n) 資源包支持
XMLxXML 解析、XPath 選擇、XSLT 轉換
SQLsql數據庫查詢、更新、事務控制 (生產環境建議避免直接使用)

驗證器:ScriptFreeTLV 禁用 Scriptlet,PermittedTaglibsTLV 限制可用標籤庫,強制編碼規範。

EL 核心語法與特性

基本格式

EL 表達式以 ${...} 定界,可嵌入標籤屬性或模板文本:

<c:out value="${user.firstName}"/>
<c:out value="Hello ${user.firstName} ${user.lastName}"/>  <!-- 字符串拼接 -->

隱式對象 (11 個)

EL 提供 11 個隱式對象,均為 Map 類型,便於查找:

  • 作用域映射:pageScope、requestScope、sessionScope、applicationScope —— 精確指定作用域查找,避免默認順序查找 (page→request→session→application)
  • 請求參數:param (單值)、paramValues (數組)
  • 請求頭:header、headerValues
  • Cookie:cookie —— 鍵為 Cookie 名,值為 Cookie 對象
  • 初始化參數:initParam —— 對應 web.xml 中的 <context-param>

此外 pageContext 提供對所有 JSP 隱式對象 (request、response、session 等) 的訪問入口。

存取器:點運算符 (.) 與方括號 ([])

  • 點運算符:訪問 Bean 屬性 (${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。

Core 庫關鍵標籤實戰

Taglib 指令

<%@ 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> 與 <c:remove>

<!-- 屬性方式設置 -->
<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>

<c:out value="${user.username}" default="Guest" escapeXml="true"/>
  • default:值為 null 或空串時的備用輸出
  • escapeXml:默認 true,自動轉義 <>& 為實體,防 XSS

組合技巧:嵌套 <c:out> 於 <c:set> 提供默認值

<c:set var="timezone" scope="session">
  <c:out value="${cookie['tzPref'].value}" default="CST"/>
</c:set>

若 Cookie 不存在,EL 返回 null,<c:out> 輸出默認值 "CST",最終賦給變量。

條件邏輯:<c:choose> 替代 Scriptlet

<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 提供了標準化、可維護的展示層解決方案:

  1. 消除 Scriptlet,分離頁面邏輯與業務代碼
  2. EL 簡潔語法支援複雜數據導航與運算
  3. 標準標籤庫覆蓋 90% 以上常見展示需求
  4. 驗證器強制團隊編碼規範

採用 JSTL 開發的 JSP 頁面,純標籤結構接近 HTML,大幅降低維護門檻,是現代 JSP 開發的必經之路。

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