From Gossip@caterpillar

JSP/Servlet: 簡介 Expression Language

 

 


您可以將一些程式邏輯放入JavaBean中,並配合<jsp:useBean>、<jsp: setProperty>與 <jsp:getProperty>等標籤來撰寫JSP網頁,以實現邏輯與視圖分開的目的,然而使用JavaBean有其限制, JavaBean配合標籤只能用來存取一些簡單的屬性,而不能用來存取集合中的某個元素,這仍必須要配合Scriptlet才能存取。

為了要使用一些JSP隱含物件,例如request、response、session等等,您也不免要使用Scriptlet,在 JSP中,為了要實現邏輯視圖分離的目的,您還必須要搭配使用JSP標準標籤函式庫(JavaServer Page Standard Library,JSTL)或甚至自訂標籤函式庫(custom tag library)來實現。

JSP Expression Language本來是包括在JSTL 1.0的一個簡單的資料存取與運算的語言,在JSP 2.0中,則納入了JSP正式標準之中,成為JSP所支援的特性之一,JSP Expression Language定義了變數存取、運算、隱含物件、函式等內容,配合JSTL的其它標籤或流程控制標籤,就可以實現更好的邏輯視圖分離之目的。

來看個簡單的例子,瞭解JSP Expression Language的基本使用方式,下面這個JSP網頁可以計算使用者所請求的兩個數字相加結果:

  • elTest.jsp
<html> 
<head><title>EL Test</title></head>
<body>
簡單的EL資料存取與運算:
<H1> ${param.a} + ${param.b} = ${param.a + param.b} </H2>
</body>
</html>

如果使用表單或直接在網址上傳入a與b的值,例如:
http://localhost:8080/myjsp/elTest.jsp?a=10&b =14

則會取得下面的結果:
<html>
<head><title>EL Test</title></head>
<body>
    簡單的EL資料存取與運算:
    <H1> 10 + 14 = 24 </H2>
</body>
</html>

在這個簡單的例子中,您可以看到Expression Language是使用 ${ 與 } 來包括所要存取的隱含物件、變數與進行運算,param是Expression Language的隱含物件,表示使用者的請求參數,param.a表示取得使用者請求參數a的值。

大致而言,Expression Language中的每一個隱含物件,其存取的資料與作用範圍對應於JSP隱含物件,在之後的主題中將會有更詳細的介紹,至於 + 則是Expression Language中定義的運算子,EL運算子同一般的程式語言一樣,提供有算術運算、邏輯運算、關係運算等運算子,另外還有一些特別的運算子,這在之後會 再介紹。

在上面這個例子中,您看不到Scriptlet的部份,在語法上可以更切合的結合在HTML語法中,再來看一個簡單的例子,使用Expression Language的pageContext隱含物件來取得一些使用者的相關訊息:

  • elTest.jsp
<html> 
<head><title>EL Test</title></head>
<body>
請求方法:<b> ${pageContext.request.method} </b><br>
請求參數:<b> ${pageContext.request.queryString} </b><br>
使用者IP:<b> ${pageContext.request.remoteAddr} </b><br>
</body>
</html>

這個例子是取過Expression Language的pageContext來存取javax.servlet.ServletContext, 並透過該介面來存取request屬性,也就是呼叫getRequest()方法來取得HttpServletRequest,然後再存取 HttpServletRequest的各個屬性,也就是分別呼叫getMethod()、getQueryString()、 getRemoteAddr()等方法,執行的結果可能是:
<html>
<head><title>EL Test</title></head>
<body>
    請求方法:<b> GET </b><br>
    請求參數:<b> a=10&b=14 </b><br>
    使用者IP:<b> 127.0.0.1 </b><br>
</body>
</html>

關於Expression Language的一般例子,您可以在Tomcat的範例中先找到一些程式,啟動Tomcat之後您就可以進行線上測試,本地測試網址是:
http: //localhost:8080/jsp-examples/

您可以使用 page指令元素 的isELIgnored屬性來設定JSP網頁是否使用EL,原因在於您的網頁中可能已含有與EL類似的語法,例如樣版文字之類,您也可以在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>是用來預設所有JSP網頁是否使用EL,如果JSP網頁使用page指令元素的isELIgnored設定是否支援EL,則以page指令元素的設定為主。