JSP 中若有用 Scriptlet 撰寫 Java 程式碼,以進行屬性、請求參數、標頭與 Cookie 等訊息的取得,或是一些簡單的運算或判斷,可以試著使用 EL 來取代,以減少 JSP 頁面上 Scriptlet 的使用。
直接來改寫〈錯誤處理〉中有使用到的 add.jsp 範例頁面,當時的 JSP 頁面中,撰寫了以下的Scriptlet:
<%
String a = request.getParameter("a");
String b = request.getParameter("b");
out.println("a + b = " +
(Integer.parseInt(a) + Integer.parseInt(b))
);
%>
如果使用 EL,則可以優雅地用一行程式碼來改寫,甚至加強這段 Scriptlet。例如:
<%@page contentType="text/html" pageEncoding="UTF-8"
errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>加法網頁</title>
</head>
<body>
${param.a} + ${param.b} = ${param.a + param.b}
</body>
</html>
在這個簡單的例子中可以看到幾個 EL 元素。EL 是使用 ${
與 }
來包括所要進行處理的運算式,可使用點運算子(.
)指定要存取的屬性,使用加號(+
)運算子進行加法運算。param
是 EL 隱含物件之一,表示使用者的請求參數,param.a
表示取得使用者所發出的請求參數 a
的值。
EL 優雅地處理了 null
值的情況,對於 null
值直接以空字串加以顯示,而不是直接顯示 null
值,在進行運算時,也不會因此發生錯誤而丟出例外。
EL 的點運算子還可以連續存取物件,就如同在 Java 程式碼一般。例如原先你需要這麼撰寫:
方法:<%= ((HttpServletRequest) pageContext.getRequest()).getMethod() %><br>
參數:<%= ((HttpServletRequest) pageContext.getRequest()).getQueryString() %><br>
IP:<%= ((HttpServletRequest) pageContext.getRequest()).getRemoteAddr() %><br>
若是使用 EL,則可以這麼撰寫:
方法:${pageContext.request.method}<br>
參數:${pageContext.request.queryString}<br>
IP:${pageContext.request.remoteAddr}<br>
pageContext
也是 EL 的隱含物件之一,透過點運算子之後接上 xxx 名稱,表示呼叫 getXxx()
方法,如果必須轉換型態,EL 也會自行處理,而不用像撰寫 JSP 運算式元素時,必須自行作轉換型態的動作。
你可以使用 page
指示元素的 isELIgnored
屬性(預設是 false
),來設定 JSP 網頁是否使用 EL。會這麼作的原因可能在於,你的網頁中已含有與 EL 類似的 ${}
語法功能存在,例如使用了某個樣版(Template)框架之類。
你也可以在 web.xml 中設定 <el-ignored>
標籤為 true
來決定不使用 EL。例如:
<web-app …>
…
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
</web-app>
web.xml 中的 <el-ignored>
是用來預設符合 <url-pattern>
的 JSP 網頁是否使用 EL。
如果 web.xml 中的 <el-ignored>
與 page
指令元素的 isELIgnored
設定都沒有設定,如果 web.xml 是 2.3 或以下的版本,不會執行 EL,如果是 2.4 或以上的版本,則會執行 EL。
如果設定 web.xml 中的 <el-ignored>
為 false
,但不設定 page
指令元素的 isELIgnored
,則會執行 EL,如果設定 web.xml 中的 <el-ignored>
為 true
,但不設定 page
指令元素的 isELIgnored
,則不會執行 EL。
如果 JSP 網頁使用 page
指令元素的 isELIgnored
設定是否支援 EL,則以 page
指令元素的設定為主,不管 web.xml 中的 <el-ignored>
的設定為何。