作用域
使用el的時(shí)候,默認(rèn)會(huì)以一定順序搜索四個(gè)作用域,將最先找到的變量值顯示出來(lái)。

如果我們有${username}這樣一個(gè)正則表達(dá)式,它回去依次調(diào)用pageContext.getAttribute("username") -> request.getAttribute("username") -> session.getAttribute("username") -> application.getAttribute("username"),只要找到某一個(gè)不為空的值就立刻返回。
這樣的確方便我們的操作,但是隨之也出現(xiàn)了另外一個(gè)問(wèn)題,如果pageContext和request中有同名變量,但是我想取得request中的變量該如何是好呢?這就需要為el表達(dá)式引入作用域的概念了。
${pageScope.username}
${requestScope.username}
我們可以直接訪問(wèn)13-04這個(gè)應(yīng)用,看看el表達(dá)式支持的所有對(duì)象。

下面我們分別對(duì)每個(gè)作用域?qū)ο筮M(jìn)行講解。
表?13.1.?el中的作用域
例子中的${pageContext.request.contextPath}返回的是request.getContextPath()的值,在此例中就是/13-04,我們經(jīng)常使用這個(gè)來(lái)拼接jsp中的絕對(duì)路徑。 這里的${pageContext.request.contextPath}是一種特殊用法,不能使用${request.contextPath}的形式替代。 |
|
pageScope, requestScope, sessionScope, appliationScope都可以看作是Map型變量,調(diào)用其中的數(shù)據(jù)可以使用${pageScope.name} 或${pageScope["name"]}的形式,這兩種寫(xiě)法是等價(jià)的。 在某些情況下只能使用${pageScope["content-type"]},這里不能寫(xiě)成${pageScope.content-type},jsp無(wú)法解析連字符(-)會(huì)出現(xiàn)錯(cuò)誤。 |
|
需要注意的是${paramValues.name}得到的是一個(gè)字符串?dāng)?shù)組,如果需要獲得其中某個(gè)值,還需要使用${paramValues.name[0]}指定數(shù)組中的索引。 這與下面的${headerValues.name}是相似的。 |
|
${header.name}會(huì)取得http請(qǐng)求中的header參數(shù),現(xiàn)實(shí)工作中很少用到這里的數(shù)據(jù)。 例子中使用Host是指請(qǐng)求訪問(wèn)的主機(jī)地址,包括ip和端口號(hào)。而Referer比較有趣,如果用戶通過(guò)超鏈接跳轉(zhuǎn)過(guò)來(lái)的,Referer會(huì)保存上次訪問(wèn)頁(yè)面的地址,我們就可以通過(guò)它來(lái)統(tǒng)計(jì)哪些用戶是從哪里轉(zhuǎn)來(lái)的了。 |
|
${cookie.name}將獲得對(duì)應(yīng)cookie的對(duì)象,比如我們用jsp將一段cookie發(fā)送給客戶端。 Cookie cookie = new Cookie("username", "Username in cookie"); 創(chuàng)建一個(gè)名稱為username,值為"Username in cookie"的Cookie對(duì)象,然后發(fā)送給客戶端。 然后我們就可以使用${cookie.username}獲得這個(gè)cookie了,${cookie.username.name}獲得cookie名稱,${cookie.username.value}獲得cookie值。 |
|
ServletContext.getInitParamter()指的應(yīng)用的初始變量,這些變量都是定義在web.xml中的。 <context-param> ${initParam.username}就會(huì)得到這里的變量值。 |
以上都是死記硬背的東西,建議實(shí)際用到的時(shí)候翻看一下就好了,演示代碼都放在13-04下,為了獲得param和cookie還要點(diǎn)擊一下最下邊的連接才可以。
el表達(dá)式中支持java中所有的操作符,并且還有一些擴(kuò)展,下面我們簡(jiǎn)要做一下對(duì)照。
表?13.3.?比較運(yùn)算
符號(hào) | 說(shuō)明 |
---|---|
==或eq | 相等(equals) |
!=或ne | 不相等(not equals) |
<或lt | 小于(less than) |
>或gt | 大于(greater than) |
<=或le | 小于等于(less than or equals) |
>=或ge | 大于等于(greater than or equals) |
下面上所有運(yùn)算符的顯示結(jié)果,順便說(shuō)一下如果想在jsp中顯示${name}而不讓jsp把它當(dāng)作el計(jì)算出來(lái),可以寫(xiě)成\${name},這樣最后顯示的結(jié)果就是${name}了。
