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

JavaWeb EL 表達式完整教學:語法、隱含對象、運算符、自定義函數與實戰應用

     編輯:Java 相關知識

一、EL 表達式基礎

EL (Expression Language) 是 JSP 2.0 核心特性,用於替代 `<%= %>` 腳本,實現頁面與 Java 程式碼分離。

語法

${expression}  // 例:${user.name}、${list[0]}、${map.key}、${param.id}

關鍵字(不可作識別符)

and, eq, gt, true, instanceof, or, ne, le, false, empty, not, lt, ge, null, div, mod

二、核心功能

1. 獲取數據:自動搜尋四大域

${identifier} 相當於 pageContext.findAttribute("identifier"),依序搜尋:

  1. PageContext (pageScope)
  2. HttpServletRequest (requestScope)
  3. HttpSession (sessionScope)
  4. ServletContext (applicationScope)

找不到回傳空字串 ""(非 null),避免 NPE。

2. 存取物件屬性與集合

類型語法範例說明
JavaBean${user.name}、${user.address.city}自動呼叫 getter
List/陣列${list[0]}、${list[3].name}索引存取
Map${map.key}、${map['key-name']}鍵值存取,含特殊字元用 []

3. 迭代輸出:搭配 JSTL

<c:forEach var="user" items="${userList}">
    ${user.name} - ${user.email}<br/>
</c:forEach>

<c:forEach var="entry" items="${userMap}">
    ${entry.key} = ${entry.value.name}<br/>
</c:forEach>

三、運算符完整支援

類別運算符範例
算術+, -, *, / (div), % (mod)${price * quantity}
關係==, !=, <, >, <=, >= (eq, ne, lt, gt, le, ge)${user.age ge 18}
邏輯&&, ||, ! (and, or, not)${not empty list}
empty檢查 null、空字串、空陣列、空集合、空 Map${empty param.name}
三元condition ? value1 : value2${user.loggedIn ? user.name : '訪客'}
存取. (屬性)、[] (索引/鍵)${list[0]}、${map['key']}

四、11 大隱含對象

對象型別用途範例
pageContextPageContext存取 request、session、application 等${pageContext.request.contextPath}
pageScopeMappage 域屬性${pageScope.attr}
requestScopeMaprequest 域屬性${requestScope.formData}
sessionScopeMapsession 域屬性${sessionScope.user}
applicationScopeMapapplication 域屬性${applicationScope.counter}
paramMap<String,String>請求參數(單值)${param.id}
paramValuesMap<String,String[]>請求參數(多值)${paramValues.hobby[0]}
headerMap<String,String>請求頭(單值)${header['User-Agent']}
headerValuesMap<String,String[]>請求頭(多值)${headerValues.Accept[0]}
cookieMap<String,Cookie>Cookie 物件${cookie.JSESSIONID.value}
initParamMap<String,String>web.xml context-param${initParam.appName}

實戰:表單回顯

<form action="${pageContext.request.contextPath}/register" method="post">
    <input name="username" value="${param.username}" />
    <input type="submit" value="註冊" />
</form>

五、自定義 EL 函數開發

步驟 1:編寫靜態方法類

package com.example.util;
public class HtmlUtils {
    public static String escape(String input) {
        if (input == null) return "";
        return input.replace("&", "&")
                   .replace("<", "<")
                   .replace(">", ">")
                   .replace("\"", """)
                   .replace("'", "'");
    }
}

步驟 2:編寫 TLD 描述檔 /WEB-INF/tlds/functions.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.1" xmlns="https://java.sun.com/xml/ns/javaee"
        xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="https://java.sun.com/xml/ns/javaee web-jsptaglibrary_2_1.xsd">
    <tlib-version>1.0</tlib-version>
    <short-name>Custom Functions</short-name>
    <uri>https://example.com/functions</uri>
    <function>
        <name>escapeHtml</name>
        <function-class>com.example.util.HtmlUtils</function-class>
        <function-signature>java.lang.String escape(java.lang.String)</function-signature>
    </function>
</taglib>

步驟 3:JSP 引入與使用

<%@ taglib prefix="fn" uri="https://example.com/functions" %>
${fn:escapeHtml("")}
// 輸出:<script>alert('XSS')</script>

六、常見問題與啟用條件

  • EL 不生效:確認 web.xml version="2.5" 以上,或 JSP 頁面添加 `<%@ page isELIgnored="false" %>`
  • Tomcat 版本:需支援 Servlet 2.4/JSP 2.0 以上(Tomcat 5.5+)
  • 空值處理:EL 回傳 "" 而非 null,搭配 empty 運算符判斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved