2015-02-21

[轉載] [JSP] Expression Language (EL)

轉載自:JSP 表达式语言 | w3cschool菜鸟教程

JSP 表達式語言(EL)使得訪問存儲在 JavaBean 中的數據變得非常簡單。JSP EL 既可以用來創建算術表達式也可以用來創建邏輯表達式。在 JSP EL 表達式內可以使用整型數,浮點數,字符串,常量 true、false,還有 null。


一個簡單的語法


典型的,當您需要在JSP標簽中指定一個屬性值時,只需要簡單地使用字符串即可:
<jsp:setProperty name="box" property="perimeter" value="100"/>

JSP EL 允許您指定一個表達式來表示屬性值。一個簡單的表達式語法如下:
${expr}

其中,expr 指的是表達式。在 JSP EL 中通用的操作符是"."和"[]"。這兩個操作符允許您通過內嵌的 JSP 物件訪問各種各樣的 JavaBean 屬性。

舉例來說,上面的 <jsp:setProperty> 標簽可以使用表達式語言改寫成如下形式:
<jsp:setProperty name="box" property="perimeter" 
                  value="${2*box.width+2*box.height}"/>

當 JSP 編譯器在屬性中見到"${}"格式後,它會產生代碼來計算這個表達式,並且產生一個替代品來代替表達式的值。

您也可以在標簽的模板文本中使用表達式語言。
比如 <jsp:text> 標簽簡單地將其主體中的文本插入到 JSP 輸出中:
<jsp:text>
  <h1>Hello JSP!</h1>
</jsp:text>

現在,在 <jsp:text> 標簽主體中使用表達式,就像這樣:
<jsp:text>
  Box Perimeter is: ${2*box.width + 2*box.height}
</jsp:text>

在 EL 表達式中可以使用圓括號來組織子表達式。
比如 ${(1 + 2) * 3} 等於9,但是 ${1 + (2 * 3)} 等於7。

想要停用對 EL 表達式的評估的話,需要使用 page 指令將 isELIgnored 屬性值設為 true:
<%@ page isELIgnored ="true|false" %>

這樣,EL 表達式就會被忽略。若設為 false,則容器將會計算 EL 表達式。



EL 中的基礎操作符


EL表達式支持大部分Java所提供的算術和邏輯操作符:
操作符描述
.訪問一個 Bean 屬性或者一個映射條目
[]訪問一個數組或者鏈表的元素
()組織一個子表達式以改變優先級
+
-減或負
*
/ 或 div
% 或 mod取模
== 或 eq測試是否相等
!= 或 ne測試是否不等
< 或 lt測試是否小於
> 或 gt測試是否大於
<= 或 le測試是否小於等於
>= 或 gt測試是否大於等於
&& 或 and測試邏輯與
|| 或 or測試邏輯或
! 或 not測試取反
empty測試是否空值



JSP EL 中的函數


JSP EL 允許您在表達式中使用函數。這些函數必須被定義在自定義標簽庫中。函數的使用語法如下:
${ns:func(param1, param2, ...)}

ns 指的是命名空間(namespace),func 指的是函數的名稱,param1 指的是第一個參數,param2 指的是第二個參數,以此類推。比如,有函數 fn:length,在 JSTL 庫中定義,可以像下面這樣來獲取一個字符串的長度:
${fn:length("Get my length")}

要使用任何標簽庫中的函數,您需要將這些庫安裝在服務器中,然後使用 <taglib> 標簽在JSP文件中包含這些庫。



JSP EL 隱含物件


JSP EL支持下表列出的隱含物件:
隱含物件描述
pageScopepage 作用域
requestScoperequest 作用域
sessionScopesession 作用域
applicationScopeapplication 作用域
paramRequest 物件的參數,字符串
paramValuesRequest 物件的參數,字符串集合
headerHTTP 信息頭,字符串
headerValuesHTTP 信息頭,字符串集合
initParam上下文初始化參數
cookieCookie 值
pageContext當前頁面的 pageContext

您可以在表達式中使用這些物件,就像使用變量一樣。接下來會給出幾個例子來更好的理解這個概念。



pageContext 物件


pageContext 物件是 JSP 中 pageContext 物件的引用。通過 pageContext 物件,您可以訪問 request 物件。比如,訪問 request 物件傳入的查詢字符串,就像這樣:
${pageContext.request.queryString}



Scope 物件


pageScope,requestScope,sessionScope,applicationScope 變量用來訪問存儲在各個作用域層次的變量。

舉例來說,如果您需要顯式訪問在 applicationScope 層的 box 變量,可以這樣來訪問:
${applicationScope.box}



param 和 paramValues 物件


param 和 paramValues 物件用來訪問參數值,通過使用 request.getParameter 方法和 request.getParameterValues 方法。

舉例來說,訪問一個名為 order 的參數,可以這樣使用表達式:${param.order} 或者 ${param["order"]}

接下來的例子表明了如何訪問request中的username參數:
<%@ page import="java.io.*,java.util.*" %>
<%
    String title = "Accessing Request Param";
%>
<html>
  <head>
    <title><% out.print(title); %></title>
  </head>
  <body>
    <center>
      <h1><% out.print(title); %></h1>
    </center>
    <div align="center">
      <p>${param["username"]}</p>
    </div>
  </body>
</html>

param 物件返回單一的字符串,而 paramValues 物件則返回一個字符串數組。



header 和 headerValues 物件


header 和 headerValues 物件用來訪問信息頭,通過使用 request.getHeader 方法和 request.getHeaders 方法。

舉例來說,要訪問一個名為 user-agent 的信息頭,可以這樣使用表達式:${header.user-agent} 或者 ${header["user-agent"]}

接下來的例子表明了如何訪問 user-agent 信息頭:
<%@ page import="java.io.*,java.util.*" %>
<%
    String title = "User Agent Example";
%>
<html>
  <head>
    <title><% out.print(title); %></title>
  </head>
  <body>
    <center>
      <h1><% out.print(title); %></h1>
    </center>
    <div align="center">
      <p>${header["user-agent"]}</p>
    </div>
  </body>
</html>

運行結果如下:
User Agent Example
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; HPNTDF; .NET4.0C; InfoPath.2)

header 物件返回單一值,而 headerValues 則返回一個字符串數組。

0 回應: