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表達式支援大部分Java所提供的算術和邏輯運算子:
操作符 | 描述 |
---|---|
. | 訪問一個Bean屬性或一個映射條目 |
[] | 存取一個陣列或鍊錶的元素 |
( ) | 組織一個子表達式以改變優先權 |
+ | 加 |
- | 減或負 |
* | 乘 |
/ or div | 除 |
% or mod | 取模 |
== or eq | 測試是否相等 |
!= or ne | 測試是否不等 |
< or lt | 測試是否小於 |
> or gt | 測試是否大於 |
<= or le | 測試是否小於等於 |
>= or ge | 測試是否大於等於 |
&& or and | 測試邏輯與 |
|| or or | 測試邏輯或 |
! or not | 測試取反 |
empty | 測試是否空值 |
JSP EL 允許您在表達式中使用函數。這些函數必須被定義在自訂標籤庫中。函數的使用語法如下:
${ns:func(param1, param2, ...)}
ns 指的是命名空間(namespace),
func指的是函數的名稱,
param1指的是第一個參數,
param2指的是第二個參數,以此類推。比如,有函數
fn:length,在JSTL 庫中定義,可以像下面這樣來取得一個字串的長度:
${fn:length("Get my length")}
要使用任何標籤庫中的函數,您需要將這些庫安裝在伺服器中,然後使用
<taglib>標籤在JSP 檔案中包含這些庫。
JSP EL支援下表列出的隱含物件:
隱含對象 | 描述 |
---|---|
pageScope | page 作用域 |
requestScope | request 作用域 |
sessionScope | session 作用域 |
applicationScope | application 作用域 |
param | Request 物件的參數,字串 |
paramValues | Request物件的參數,字串集合 |
header | HTTP 訊息頭,字串 |
headerValues | HTTP 訊息頭,字串集合 |
initParam | 上下文初始化參數 |
cookie | Cookie值 |
pageContext | 目前頁面的pageContext |
您可以在表達式中使用這些對象,就像使用變數一樣。接下來會給出幾個例子來更好的理解這個概念。
號
pageContext物件是JSP 中
pageContext物件的引用。透過
pageContext對象,您可以存取
request對象。比如,訪問
request物件傳入的查詢字串,就像這樣:
${pageContext.request.queryString}
號
pageScope,
requestScope,
sessionScope,
applicationScope變數用來存取儲存在各個作用域層次的變數。
舉例來說,如果您需要明確存取在
applicationScope層的
box變量,可以這樣來訪問:
applicationScope.box。
號
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物件用來存取資訊頭,透過使用
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>
運行結果如下:
header物件傳回單一值,而headerValues則傳回字串陣列。