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

EL 表達式語言完整指南:語法、運算符、隱式對象與最佳實踐

     編輯:關於JSP

啟用與禁用

<%@ page isELIgnored="true" %>   <!-- 禁用 EL,預設 false (啟用) -->

JSP 2.0+ 容器原生支援 EL,無需 JSTL 標籤庫即可在頁面任意位置使用。

核心語法

所有 EL 以 ${ 開始、} 結束:

${sessionScope.user.sex}
${sessionScope.user["sex"]}          <!-- 等價 -->
${sessionScope.shoppingCart[0].price} <!-- 陣列/List 索引 -->
${user["My-Name"]}                    <!-- 屬性名含特殊字符必須用 [] -->
${sessionScope.user[data]}            <!-- data 為變數,動態取值 -->

運算符

類別運算符說明
存取.、[]屬性/Map Key/索引存取,可混合
算術+ - * / div % moddiv/mod 為除/取餘別名,避免與路徑衝突
比較== eq != ne < lt > gt <= le >= ge字母別名避免 XML 轉義
邏輯&& and || or ! not
三元condition ? yes : no
空值emptyempty obj 判斷 null、空字串、空集合、空 Map

11 大隱式對象(作用域優先級:page → request → session → application)

EL 名稱對應 API用途
pageScopePageContext.getAttribute()頁面級暫存
requestScopeHttpServletRequest.getAttribute()請求屬性
sessionScopeHttpSession.getAttribute()會話屬性
applicationScopeServletContext.getAttribute()全域應用屬性
paramrequest.getParameter()單值請求參數
paramValuesrequest.getParameterValues()多值請求參數 (陣列)
headerrequest.getHeader()單值 Header
headerValuesrequest.getHeaders()多值 Header
cookierequest.getCookies()Cookie Map (名→值)
initParamcontext.getInitParameter()上下文初始化參數
pageContextPageContext頁面上下文根物件,可導航 request/response/session/application

實戰範例

<!-- 表單回顯 -->
<input name="email" value="${param.email}">

<!-- 多選框回顯 -->
<c:forEach items="${paramValues.interests}" var="i">
  <input type="checkbox" name="interests" value="${i}" checked>${i}<br>
</c:forEach>

<!-- 判斷登入狀態 -->
<c:if test="${empty sessionScope.user}">
  <a href="/login">登入</a>
</c:if>

<!-- 迭代集合 -->
<c:forEach items="${requestScope.products}" var="p" varStatus="st">
  ${st.index + 1}. ${p.name} - $${p.price}
</c:forEach>

最佳實踐

  1. 優先使用 EL 輸出,避免 <%= %> 腳本程式碼,配合 <c:out> 自動 HTML 轉義防 XSS。
  2. 明確指定作用域:${requestScope.attr} 避免跨作用域同名衝突、提升可讀性。
  3. 複雜邏輯移至 Java Bean:EL 僅做呈現層簡單運算,業務規則封裝在 CDI/Spring Bean 中。
  4. 關閉開發模式:生產 isELIgnored="false"(預設),但確保容器 development=false 避免重複解析開銷。

EL 3.0 (JSR-341) 新特性預覽

  • Lambda 表達式:${list.stream().map(x -> x.name).collect(Collectors.toList())}
  • 集合運算:${set1.union(set2)}、${map.filter(k,v -> v > 10)}
  • 資源注入:${bean.property} 直接注入 CDI/Spring Bean(需容器支援)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved