Expression Language (EL) 是 JSP 2.0 引入的簡化表達式語言,旨在替代冗長的 Scriptlet,使頁面更接近純 HTML。本文系統講解 EL 定義、語法結構、運算符、隱式對象、變量查找機制,並提供豐富對照範例,助力開發者快速掌握 EL 核心用法。
${expression}<%@ page isELIgnored="true" %> 或 web.xml 配置 <el-ignored>true</el-ignored>${user.name} — 標準屬性存取${user["my-name"]} — 屬性名含特殊字符時必須用括號${sessionScope.user[data]} — data 為變量實現動態鍵存取,點運算符無法做到${username} 未指定作用域時,依序搜尋:
找到即返回,否則返回 null(不拋異常)。可顯式指定作用域:${requestScope.username}。
| 類別 | 運算符 | 說明 |
|---|---|---|
| 算術 | + - * / div % mod | div// 同義,mod/% 同義 |
| 關系 | == eq != ne < lt > gt <= le >= ge | 字母與符號等價,建議用字母避免 XML 轉義 |
| 邏輯 | && and || or ! not | |
| empty | empty expr | 前綴運算符,判斷 null、空字符串、空集合、空 Map、空數組 |
| 條件 | expr ? val1 : val2 | 三元運算 |
| 對象 | 映射 | 等價 Servlet API |
|---|---|---|
| param | 單值參數 | request.getParameter(name) |
| paramValues | 多值參數數組 | request.getParameterValues(name) |
| header | 單值 Header | request.getHeader(name) |
| headerValues | 多值 Header 數組 | request.getHeaders(name) |
| cookie | Cookie 名→對象 | request.getCookies() 遍歷 |
| initParam | 上下文初始化參數 | servletContext.getInitParameter(name) |
pageScope、requestScope、sessionScope、applicationScope — Map<String, Object>,鍵為屬性名,值為屬性對象。
pageContext — 對應 JSP 隱式對象 pageContext,可鏈式訪問 request、response、session、servletContext 等。
注意:${pageContext} 返回 PageContext 對象本身,而非屬性值。
| 傳統 Scriptlet | EL 表達式 | 說明 |
|---|---|---|
<%=request.getParameter("username")%> | ${param.username} | 單值參數 |
<%=request.getAttribute("user")%> | ${requestScope.user} | 請求屬性 |
<%=session.getAttribute("cart")%> | ${sessionScope.cart} | 會話屬性 |
<%=application.getAttribute("config")%> | ${applicationScope.config} | 應用屬性 |
<%=request.getHeader("User-Agent")%> | ${header["User-Agent"]} | Header 含連字符需括號 |
<%=request.getCookies()[0].getValue()%> | ${cookie.username.value} | Cookie 值存取 |
| 判斷空並輸出預設值 | ${empty user.name ? '匿名' : user.name} | empty + 三元運算 |
${my:formatDate(date)}${list[0]}、${map.key}、${map['key.with.dot']}${user.address.city} 自動調用 getter 鏈${pageContext.request} 是 request 對象 — 實為 PageContext,需 ${pageContext.request.remoteAddr} 鏈式取值isELIgnored 導致舊專案升級後 EL 失效EL 以簡潔語法、豐富運算符、完善隱式對象,將 JSP 從 Java 代碼混雜中解脫,配合 JSTL 標籤庫可構建近乎零 Scriptlet 的現代視圖層。掌握變量查找機制與 empty 運算符,是避免空指針異常、編寫健壯頁面的關鍵。