簡介 EL


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> 的設定為何。