jsp 表達(dá)式語(yǔ)言
jsp表達(dá)式語(yǔ)言(el)使得訪問(wèn)存儲(chǔ)在javabean中的數(shù)據(jù)變得非常簡(jiǎn)單。jsp el既可以用來(lái)創(chuàng)建算術(shù)表達(dá)式也可以用來(lái)創(chuàng)建邏輯表達(dá)式。在jsp el表達(dá)式內(nèi)可以使用整型數(shù),浮點(diǎn)數(shù),字符串,常量true、false,還有null。
一個(gè)簡(jiǎn)單的語(yǔ)法
典型的,當(dāng)您需要在jsp標(biāo)簽中指定一個(gè)屬性值時(shí),只需要簡(jiǎn)單地使用字符串即可:
<jsp:setproperty name="box" property="perimeter" value="100"/>
jsp el允許您指定一個(gè)表達(dá)式來(lái)表示屬性值。一個(gè)簡(jiǎn)單的表達(dá)式語(yǔ)法如下:
${expr}
其中,expr指的是表達(dá)式。在jsp el中通用的操作符是 . 和 {} 。這兩個(gè)操作符允許您通過(guò)內(nèi)嵌的jsp對(duì)象訪問(wèn)各種各樣的javabean屬性。
舉例來(lái)說(shuō),上面的<jsp:setproperty>標(biāo)簽可以使用表達(dá)式語(yǔ)言改寫(xiě)成如下形式:
<jsp:setproperty name="box" property="perimeter" value="${2*box.width+2*box.height}"/>
當(dāng)jsp編譯器在屬性中見(jiàn)到"${}"格式后,它會(huì)產(chǎn)生代碼來(lái)計(jì)算這個(gè)表達(dá)式,并且產(chǎn)生一個(gè)替代品來(lái)代替表達(dá)式的值。
您也可以在標(biāo)簽的模板文本中使用表達(dá)式語(yǔ)言。比如<jsp:text>標(biāo)簽簡(jiǎn)單地將其主體中的文本插入到j(luò)sp輸出中:
<jsp:text> <h1>hello jsp!</h1> </jsp:text>
現(xiàn)在,在<jsp:text>標(biāo)簽主體中使用表達(dá)式,就像這樣:
<jsp:text> box perimeter is: ${2*box.width + 2*box.height} </jsp:text>
在el表達(dá)式中可以使用圓括號(hào)來(lái)組織子表達(dá)式。比如${(1 + 2) * 3}等于9,但是${1 + (2 * 3)} 等于7。
想要停用對(duì)el表達(dá)式的評(píng)估的話(huà),需要使用page指令將iselignored屬性值設(shè)為true:
<%@ page iselignored ="true|false" %>
這樣,el表達(dá)式就會(huì)被忽略。若設(shè)為false,則容器將會(huì)計(jì)算el表達(dá)式。
el中的基礎(chǔ)操作符
el表達(dá)式支持大部分java所提供的算術(shù)和邏輯操作符:
操作符 | 描述 |
---|---|
. | 訪問(wèn)一個(gè)bean屬性或者一個(gè)映射條目 |
[] | 訪問(wèn)一個(gè)數(shù)組或者鏈表的元素 |
( ) | 組織一個(gè)子表達(dá)式以改變優(yōu)先級(jí) |
+ | 加 |
- | 減或負(fù) |
* | 乘 |
/ or div | 除 |
% or mod | 取模 |
== or eq | 測(cè)試是否相等 |
!= or ne | 測(cè)試是否不等 |
< or lt | 測(cè)試是否小于 |
> or gt | 測(cè)試是否大于 |
<= or le | 測(cè)試是否小于等于 |
>= or ge | 測(cè)試是否大于等于 |
&& or and | 測(cè)試邏輯與 |
|| or or | 測(cè)試邏輯或 |
! or not | 測(cè)試取反 |
empty | 測(cè)試是否空值 |
jsp el中的函數(shù)
jsp el允許您在表達(dá)式中使用函數(shù)。這些函數(shù)必須被定義在自定義標(biāo)簽庫(kù)中。函數(shù)的使用語(yǔ)法如下:
${ns:func(param1, param2, ...)}
ns指的是命名空間(namespace),func指的是函數(shù)的名稱(chēng),param1指的是第一個(gè)參數(shù),param2指的是第二個(gè)參數(shù),以此類(lèi)推。比如,有函數(shù)fn:length,在jstl庫(kù)中定義,可以像下面這樣來(lái)獲取一個(gè)字符串的長(zhǎng)度:
${fn:length("get my length")}
要使用任何標(biāo)簽庫(kù)中的函數(shù),您需要將這些庫(kù)安裝在服務(wù)器中,然后使用<taglib>標(biāo)簽在jsp文件中包含這些庫(kù)。
jsp el隱含對(duì)象
jsp el支持下表列出的隱含對(duì)象:
隱含對(duì)象 | 描述 |
---|---|
pagescope | page 作用域 |
requestscope | request 作用域 |
sessionscope | session 作用域 |
applicationscope | application 作用域 |
param | request 對(duì)象的參數(shù),字符串 |
paramvalues | request對(duì)象的參數(shù),字符串集合 |
header | http 信息頭,字符串 |
headervalues | http 信息頭,字符串集合 |
initparam | 上下文初始化參數(shù) |
cookie | cookie值 |
pagecontext | 當(dāng)前頁(yè)面的pagecontext |
您可以在表達(dá)式中使用這些對(duì)象,就像使用變量一樣。接下來(lái)會(huì)給出幾個(gè)例子來(lái)更好的理解這個(gè)概念。
pagecontext對(duì)象
pagecontext對(duì)象是jsp中pagecontext對(duì)象的引用。通過(guò)pagecontext對(duì)象,您可以訪問(wèn)request對(duì)象。比如,訪問(wèn)request對(duì)象傳入的查詢(xún)字符串,就像這樣:
${pagecontext.request.querystring}
scope對(duì)象
pagescope,requestscope,sessionscope,applicationscope變量用來(lái)訪問(wèn)存儲(chǔ)在各個(gè)作用域?qū)哟蔚淖兞俊?/p>
舉例來(lái)說(shuō),如果您需要顯式訪問(wèn)在applicationscope層的box變量,可以這樣來(lái)訪問(wèn):applicationscope.box。
param和paramvalues對(duì)象
param和paramvalues對(duì)象用來(lái)訪問(wèn)參數(shù)值,通過(guò)使用request.getparameter方法和request.getparametervalues方法。
舉例來(lái)說(shuō),訪問(wèn)一個(gè)名為order的參數(shù),可以這樣使用表達(dá)式:${param.order},或者${param["order"]}。
接下來(lái)的例子表明了如何訪問(wèn)request中的username參數(shù):
<%@ 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對(duì)象返回單一的字符串,而paramvalues對(duì)象則返回一個(gè)字符串?dāng)?shù)組。
header和headervalues對(duì)象
header和headervalues對(duì)象用來(lái)訪問(wèn)信息頭,通過(guò)使用 request.getheader方法和request.getheaders方法。
舉例來(lái)說(shuō),要訪問(wèn)一個(gè)名為user-agent的信息頭,可以這樣使用表達(dá)式:${header.user-agent},或者${header["user-agent"]}。
接下來(lái)的例子表明了如何訪問(wèn)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>
運(yùn)行結(jié)果如下:
header對(duì)象返回單一值,而headervalues則返回一個(gè)字符串?dāng)?shù)組。