基本介紹,基本用法,注意事項,特殊情況,特殊情況一,特殊情況二,其他情況,
基本介紹
基本用法
EL 全名為Expression Language,它原本是JSTL 1.0為方便存取數據所自定義的語言。當時EL
只能在JSTL 標籤中使用,如下:
<c:out value="${ 3 + 7}">
程式執行結果為10。但是你卻不能直接在JSP 網頁中使用:
<p>Hi ! ${ username }</p>
到了JSP 2.0 之後,EL 已經正式納入成為標準規範之一。因此,只要是支持Servlet 2.4 / JSP
2.0 的Container,就都可以在JSP 網頁中直接使用EL 了。
除了JSP 2.0 建議使用EL 之外,JavaServer Faces( JSR-127 ) 也考慮將EL 納入規範,由此
可知,EL 如今已經是一項成熟、標準的技術。
注意事項
假若您所用的Container 只支持Servlet 2.3/JSP 1.2,如:Tomcat 4.1.29,您就不能在
JSP 網頁中直接使用EL,必須安裝支持Servlet 2.4 / JSP 2.0 的Container。
EL 語法
EL 語法很簡單,它最大的特點就是使用上很方便。接下來介紹EL 主要的語法結構:
${sessionScope.user.sex}
所有EL都是以 ${ 為起始、以} 為結尾的。上述EL範例的意思是:從Session的範圍中,取得
用戶的性別。假若依照之前JSP Scriptlet的寫法如下:
User user = (User)session.getAttribute("user");
String sex = user.getSex( );
6-2-1 .與 [ ] 運算符
EL 提供 . 和 [ ] 兩種運算符來存取數據。下列兩者所代表的意思是一樣的:
${sessionScope.user.sex}
等於
${sessionScope.user["sex"]}
. 和 [ ] 也可以同時混合使用,如下:
${sessionScope.shoppingCart[0].price}
回傳結果為shoppingCart中第一項物品的價格。
特殊情況
不過,以下兩種情況,兩者會有差異:
特殊情況一
(當要存取的屬性名稱中包含一些特殊字元,如 . 或 – 等並非字母或數字的符號,就一定
要使用 [ ],例如:
${user.My-Name }
上述是不正確的方式,應當改為:
${user["My-Name"] }
特殊情況二
我們來考慮下列情況:
${sessionScope.user[data]}
此時,data 是一個變數,假若data的值為"sex"時,那上述的例子等於${sessionScope.user.sex};
假若data 的值為"name"時,它就等於${sessionScope.user.name}。因此,如果要動態取值時,就可以
用上述的方法來做,但 . 無法做到動態取值。
其他情況
接下來,我們更詳細地來討論一些情況,首先假設有一個EL:
${expr-a[expr-b]}
(1) 當expr-a 的值為null時,它會回傳null。
(2) 當expr-b的值為null時,它會回傳null。
(3) 當expr-a 的值為一Map 類型時:
● 假若 !value-a.containsKey(value-b)為真,則回傳null。
● 否則回傳value-a.get(value-b)。
(4) 當expr-a 的值為List 或array 類型時:
● 將value-b 的值強制轉型為int,假若不能轉型為int 時,會產生error。
● 然後, 假若value-a.get(value-b) 或Array.get(value-a, value-b) 產生
ArrayIndexOutOfBoundsException 或IndexOutOfBoundsException 時,則回傳null。
● 假若value-a.get(value-b)或Array.get(value-a, value-b)產生其他的異常時,則會產生
error。
● 最後都沒有任何異常產生時,回傳value-a.get(value-b)或Array.get(value-a, value-b)。
(5) 當expr-a 的值為JavaBean 對象時:
● 將value-b 的值強制轉型為String。
● 假若getter 產生異常時,則會產生error。若沒有異常產生時,則回傳getter 的結果。
6-2-2 EL 變數
EL 存取變數數據的方法很簡單,例如:${username}。它的意思是取出某一範圍中名稱為username
的變數。因為我們並沒有指定哪一個範圍的username,所以它的默認值會先從Page 範圍找,假如
找不到,再依序到Request、Session、Application範圍。假如途中找到username,就直接回傳,
不再繼續找下去,但是假如全部的範圍都沒有找到時,就回傳null(見表6-1):
屬性範圍 在EL 中的名稱
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
自動搜尋順序
我們也可以指定要取出哪一個範圍的變數(見表6-2):
范 例 說 明
${pageScope.username} 取出Page 範圍的username 變數
${requestScope.username} 取出Request 範圍的username 變數
${sessionScope.username} 取出Session 範圍的username 變數
${applicationScope.username} 取出Application 範圍的username 變數
其中,pageScope、requestScope、sessionScope和applicationScope都是EL 的隱含對
6-3 EL 隱含對象
JSP 含有9大內置對象,而EL本身也有自己的內置對象。EL 隱含對象總共有11 個:
隱含對象 類 型 說 明
PageContext javax.servlet.ServletContext 表示此JSP 的PageContext
PageScope java.util.Map 取得Page範圍的屬性名稱所對應的值
RequestScope java.util.Map
取得Request 範圍的屬性名稱所對應
的值
sessionScope java.util.Map
取得Session 範圍的屬性名稱所對應
的值
applicationScope java.util.Map
取得Application 範圍的屬性名稱所
對應的值
param java.util.Map
如同
ServletRequest.getParameter(String
name)。回傳String 類型的值
續表
隱含對象 類 型 說 明
paramValues java.util.Map 如同
隱含對象 類 型 說 明
ServletRequest.getParameterValues(String
name)。回傳String []類型的值
header java.util.Map
如同ServletRequest.getHeader(String
name)。回傳String 類型的值
headerValues java.util.Map
如同ServletRequest.getHeaders(String
name)。回傳String []類型的值
cookie java.util.Map 如同HttpServletRequest.getCookies( )
initParam java.util.Map
如同
ServletContext.getInitParameter(String
name)。回傳String 類型的值