Expression Language (EL) 是 JSP 2.0 引入的簡易表達式語言,主要用於取代 JSP 頁面中的 Java Scriptlet,讓頁面更乾淨、易維護。
${expression}.(屬性存取)與 [](動態/特殊字元鍵值存取)| 情境 | 建議用法 | 範例 |
|---|---|---|
| 屬性名為合法識別碼 | . | ${user.name} |
| 屬性名含特殊字元(-, ., 空白等) | [] | ${user["my-name"]} |
| 鍵值為變數(動態存取) | [] | ${sessionScope.user[data]} |
未指定範圍時,EL 依序搜尋:pageScope → requestScope → sessionScope → applicationScope,找到即回傳,否則回傳 null(不拋異常)。
pageScope、requestScope、sessionScope、applicationScope${requestScope.username} 等同 request.getAttribute("username")param:單一值 ${param.id} ≡ request.getParameter("id")paramValues:多值 ${paramValues.ids} ≡ request.getParameterValues("ids")| 對象 | 用途 | 範例 |
|---|---|---|
| cookie | 取得 Cookie 值 | ${cookie.userCountry} |
| header / headerValues | HTTP 標頭 | ${header["User-Agent"]} |
| initParam | Context 參數 | ${initParam.adminEmail} |
| pageContext | 請求/會話/應用上下文資訊 | ${pageContext.request.remoteAddr} |
| 類別 | 符號 | 文字別名 | 範例 |
|---|---|---|---|
| 算術 | + | - | ${price + 10} |
| - | - | ${total - discount} | |
| * | - | ${qty * unitPrice} | |
| / 或 div | div | ${sum / count} | |
| % 或 mod | mod | ${index mod 2} | |
| 關係 | == | eq | ${status eq 'ok'} |
| != | ne | ${role ne 'admin'} | |
| < | lt | ${age lt 18} | |
| > | gt | ${score gt 60} | |
| <= | le | ${qty le 100} | |
| >= | ge | ${level ge 5} | |
| 邏輯 | && | and | ${isLogin and hasRole} |
| || | or | ${isVip or isStaff} | |
| ! | not | ${not empty list} | |
| 其他 | empty | - | ${empty param.name} |
| ?: | - | ${flag ? 'Y' : 'N'} | |
| () | - | ${(a + b) * c} |
<c:forEach><%@ taglib prefix="c" uri="https://java.sun.com/jstl/core_rt" %>
<c:forEach items="${messages}" var="item" begin="0" end="9" step="1" varStatus="vs">
${vs.index} : ${item.title} <br/>
</c:forEach>
<c:out><c:out value="${logininfo.username}" />
<!-- 等同 ${logininfo.username},但會自動跳脫 HTML 特殊字元 -->
<c:if> / <c:choose><c:if test="${var.index % 2 == 0}">偶數行</c:if>
<c:choose>
<c:when test="${var.index % 2 == 0}">*</c:when>
<c:otherwise>!</c:otherwise>
</c:choose>
Spring MVC 預將 Model 資料放入 requestScope,因此:
${logininfo.username}(自動搜尋 requestScope)${requestScope.logininfo.username}${sessionScope.logininfo.username}(除非確定存放在 Session)<%@ page isELIgnored="false" %> <!-- 預設 true,JSP 2.0+ 容器預設啟用 -->
EL + JSTL 讓 JSP 回歸「視圖」本職,業務邏輯移至 Controller/Service。掌握範圍搜尋順序、隱含對象、運算子與 JSTL 標籤,即可撰寫乾淨、可維護的前端頁面。