在 JSP 頁面中使用 EL 表達式(${...})卻發現瀏覽器直接顯示原始文字(如 ${user.name}),而非渲染後的值。這通常由以下幾個原因導致,本文提供完整排查清單。
EL 表達式需 Servlet 2.4 / JSP 2.0 以上支援。若 web.xml 宣告為 2.3,容器預設關閉 EL。
<!-- 錯誤:Servlet 2.3 不支援 EL -->
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" ...>
<!-- 正確:Servlet 3.0+ -->
<web-app xmlns="https://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/javaee
https://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
頁面頂端若有 <%@ page isELIgnored="true" %>,會強制忽略 EL。移除或設為 false。
確認 JSP 檔案儲存編碼為 UTF-8,且 EL 表達式使用正確的大括號 ${...},非全形字元。
使用 <c:forEach> 等標籤時,需在頁面引入:
<%@ taglib prefix="c" uri="https://java.sun.com/jsp/jstl/core" %>
且專案需包含 jstl-1.2.jar(或更新版本)。
極舊版 Tomcat(< 5.0)或非標準容器可能不支援 EL。升級至 Tomcat 8.5+ / 9.0+。
提問者回饋解決方式:「在 c:foreach 裡面加表格標簽,只是在 value 裡面寫 value="${item.(strList裡面封裝的String名)}" 就可以了」。這說明問題在於 EL 變數路徑寫法錯誤,而非容器配置。正確存取 List 中 String 元素:
<c:forEach var="item" items="${strList}">
<tr>
<td>${item}</td> <!-- 直接輸出 String 元素 -->
</tr>
</c:forEach>
web.xml 版本 ≥ 2.4isELIgnored="true"WEB-INF/lib${bean.property} 或 ${map.key} 或 ${list[index]}逐項排查,多數情況下即可恢復 EL 正常解析。