jsp 表達式語言
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屬性或者一個映射條目 |
[] | 訪問一個數組或者鏈表的元素 |
( ) | 組織一個子表達式以改變優先級 |
+ | 加 |
- | 減或負 |
* | 乘 |
/ 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中的函數
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支持下表列出的隱含對象:
隱含對象 | 描述 |
---|---|
pagescope | page 作用域 |
requestscope | request 作用域 |
sessionscope | session 作用域 |
applicationscope | application 作用域 |
param | request 對象的參數,字符串 |
paramvalues | request對象的參數,字符串集合 |
header | http 信息頭,字符串 |
headervalues | http 信息頭,字符串集合 |
initparam | 上下文初始化參數 |
cookie | cookie值 |
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>
運行結果如下:
header對象返回單一值,而headervalues則返回一個字符串數組。