JSP_EL的回顧

y_keven發表於2014-01-03
在 JSP 頁面中,使用標籤庫代替傳統的 Java 片段語言來實現頁面的顯示邏輯已經不是新技術了,然而,由自定義標籤很容易造成重複定義和非標準的實現。鑑於此,出現了 JSTL ( JSP Standard Tag Library )。
Sun 釋出的標準 JSTL1.1 標籤庫有以下幾個標籤:
核心標籤庫:包含 Web 應用的常見工作,比如:迴圈、表示式賦值、基本輸入輸出等。
國際化標籤庫:用來格式化顯示資料的工作,比如:對不同區域的日期格式化等。
資料庫標籤庫:可以做訪問資料庫的工作。
XML 標籤庫:用來訪問 XML 檔案的工作,這是 JSTL 標籤庫的一個特點。
函式標籤庫:用來讀取已經定義的某個函式。
此外, JSTL 還提供了 EL 表示式語言( Expression Language )來進行輔助的工作。
說明:在 JSTL 1.1 規範中, JSP2.0 容器已經能夠獨立的理解任何 EL 表示式。 EL 可以獨立出現在 JSP 頁面的任何角落。
  JSTL EL表示式語言簡介
EL基本語法——${expression}
EL使用場景通常如下:
1、 通常在servet中呼叫request.setAttribute(“varName”, “varValue”)
2、 然後在JSP中使用${varName}
3、 簡化方式使用了EL,依次從PageContext,HttpServletRequest,HttpSession,servletContext中查詢varName的屬性對應值。若沒有則返回空字串,若具有同名屬性,取得的是靠前物件中的屬性值。
說明:也可以指定訪問域。如${sessionScope.sampleValue}、${pageScope.color}。
使用EL訪問JavaBean——${beanName.beanVar}
若beanVar是一個引用資料型別,假設beanVar有一個屬性varAttr,則用${beanName.beanVar.varAttr}
說明:
1:為了實現對應用程式的資料的存取,EL提供了兩種操作:.和[]操作
使用.操作符來獲得有名字的屬性。例如表示式${user.username}表明物件user的username屬性
使用[]操作符來獲得有名字或按數字排列的屬性。表示式${user["username"]}和表示式${user. username }含義相同;表示式${row[0]} 表明row集合的第一個條目。
2: .和[]操作符可以出現在同一個EL表示式中
${bookBean[“blish”].publisherName}
注意:當存取的屬性名稱中包含一些特殊字元,如.或-等並非字母或數字的符號,一定要用[]而不能使用. 動態取值的情況,用[]而不是.
使用EL訪問集合物件——${collection[elementName]},其中若collection是陣列或List,則elementName是整數,若collection是Map,則elementName是鍵值。
禁用 EL 計算的語法為:<%@ page isELIgnored ="true|false" %> true表示禁用。
 
  EL隱含物件
pageContext:提供對頁面屬性的訪問
param:返回客戶端的請求引數的字串值
paramValues:返回對映至客戶端的請求引數的一組值
header:返回一個請求標題名稱,然後將該值對映至單個字串值
headerValues:返回對映至請求標題的一組值
cookie:返回對映至單個 Cookie 物件的 Cookie 名稱
initParam:返回對映至單個值的上下文初始化引數名稱
pageScope:返回頁面範圍的變數名,這些名稱已對映至相應的值
requestScope:返回對請求物件的屬性的訪問許可權
sessionScope:返回會話範圍的變數名,這些名稱已對映至相應的值
applicationScope:返回應用範圍內的變數,並將變數名對映至相應的值
說明:11 個隱含對像幾乎包含了 Web 應用的所有基本操作,若一個表示式不使用這些變數而直接使用引數名,那麼就採用就近原則。該表示式將使用最近取得的引數值。
 
三.EL表示式的操作符
EL 表示式中還有許多操作符可以幫助完成各種所需的操作,之前的示例中“ . ”、“ [] ”就是其中的兩個,下面將用表 9.1 來展示所有操作符及它們各自的功能。
表 9.1  EL 表示式的操作符
操作符
功能和作用
.
訪問一個 bean 屬性或者 Map entry
[]
訪問一個陣列或者連結串列元素
()
對子表示式分組,用來改變賦值順序
? :
條件語句,比如:條件 ?ifTrue:ifFalse
如果條件為真,表示式值為前者,反之為後者
+
數學運算子,加操作
-
數學運算子,減操作或者對一個值取反
*
數學運算子,乘操作
/ 或 div
數學運算子,除操作
% 或 mod
數學運算子,模操作 ( 取餘 )
== 或 eq
邏輯運算子,判斷符號左右兩端是否相等,如果相等返回 true ,否則返回 false
!= 或 ne
邏輯運算子,判斷符號左右兩端是否不相等,如果不相等返回 true ,否則返回 false
< 或 lt
邏輯運算子,判斷符號左邊是否小於右邊,如果小於返回 true ,否則返回 false
> 或 gt
邏輯運算子,判斷符號左邊是否大於右邊,如果大於返回 true ,否則返回 false
<= 或 le
邏輯運算子,判斷符號左邊是否小於或者等於右邊,如果小於或者等於返回 true ,否則返回 false
>= 或 ge
邏輯運算子,判斷符號左邊是否大於或者等於右邊,如果大於或者等於返回 true ,否則返回 false
&& 或 and
邏輯運算子,與操作賦。如果左右兩邊同為 true 返回 true ,否則返回 false
|| 或 or
邏輯運算子,或操作賦。如果左右兩邊有任何一邊為 true 返回 true ,否則返回 false
! 或 not
邏輯運算子,非操作賦。如果對 true 取運算返回 false ,否則返回 true
empty
用來對一個空變數值進行判斷 : null 、一個空 String 、空陣列、 空 Map 、沒有條目的 Collection 集合
func(args)
呼叫方法 , func 是方法名, args 是引數,可以沒有,或者有一個、多個引數 . 引數間用逗號隔開
四.EL表示式在JSTL中應用
在JSTL的屬性值中使用表示式有三種方式。
1、 value屬性包含一個表示式
<some:tag value="${expr}"/>
在這種情況下,表示式值被計算出來並根據型別轉換規則賦值給value屬性。比如:<c:out value="${username}" />中的${username}就是一個EL,它相當於JSP語句<%=request.getAttribute(“username”)%>或<%=session.getAttribute(“username”)%>
2、 value屬性包含一個或多個屬性,這些屬性被文字分割或圍繞
<some:tag value="some${expr}${expr}text${expr}"/>
在這種情況下,表示式從左到右進行計算,並將結果轉換為字串型(根據型別轉換規則),並將結果賦值給value屬性
3、value屬性僅僅包含文字
<some:tag value="sometext"/>
在這種情況下,字串型屬性value將根據型別轉換規則轉換為標籤所希望的型別。