小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

剖析el表達(dá)式 (取url地址)

 moonboat 2009-03-10

第 13 章 剖析el表達(dá)式

注意

這里詳細(xì)講解如何在jsp中使用el表達(dá)式。

如果你不滿足以下任一條件,請(qǐng)繼續(xù)閱讀,否則請(qǐng)?zhí)^(guò)此后的部分,進(jìn)入下一章:第 14 章 生命周期。

  1. 了解如何在jsp中使用及禁用el表達(dá)式。

  2. 了解el表達(dá)式的取值方式。

13.1. 再談el(Expression Language)

我們已經(jīng)知道el是jsp-2.0規(guī)范的一部分,tomcat-5.x版本以上都已經(jīng)能夠支持jsp-2.0規(guī)范,但在更低版本的tomcat和webphere,weblogic中還是無(wú)法使用這一便捷方式。

其實(shí)我們也可以選擇在jsp中禁止使用el表達(dá)式,使用jsp指令(directive)可以對(duì)禁用某一個(gè)jsp中的el表達(dá)式。

禁用之后的el表達(dá)式會(huì)以原樣顯示出來(lái),如下圖所示。



為了對(duì)照,我們還在13-01下放了一個(gè)可以正常使用el表達(dá)式的例子,運(yùn)行效果如下圖顯示。




在13-01/index.jsp中禁用el表達(dá)式,是使用了isELIgnore="true"這樣一條jsp指令(directive),請(qǐng)注意大小寫。

<%@ page isELIgnored="true" %>
<%
pageContext.setAttribute("hello", "Hello World");
%>
${hello}

還有一種批量禁用el的方法,我們可以在WEB-INF/web.xml中使用jsp-property-group標(biāo)簽批量禁用el,我們?cè)?3-02/WEB-INF/web.xml中進(jìn)行如下配置。

<xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java./xml/ns/j2ee"
xmlns:xsi="http://www./2001/XMLSchema-instance"
xsi:schemaLocation="http://java./xml/ns/j2ee http://java./xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
</web-app>

這樣就會(huì)禁用所有以.jsp后綴的請(qǐng)求中的el表達(dá)式,使用這種方式需要注意兩點(diǎn)。

  1. jsp-property-group標(biāo)簽是jsp-2.0中新增功能,如果你使用低版本的web.xml(2.3或以下)就不能使用這個(gè)標(biāo)簽了。

  2. 設(shè)置jsp-config會(huì)影響jsp生成servlet的過(guò)程,如果程序修改時(shí)已經(jīng)有jsp轉(zhuǎn)換成servlet并緩存在work目錄下,那么修改后需要先清除緩存,才能看到效果。

實(shí)際上還有第三種方法可以禁用掉所有jsp中的el表達(dá)式,那就是把web.xml定義為2.3版。

<xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java./dtd/web-app_2_3.dtd">
<web-app>
</web-app>

這個(gè)就是13-03/WEB-INF/web.xml的定義,定義了web-app的版本號(hào)是2.3,這樣一來(lái)所有的jsp都無(wú)法使用el表達(dá)式了,因?yàn)閑l表達(dá)式是2.4版才開(kāi)始支持的功能。

注意

說(shuō)了以上三種禁用el表達(dá)式的方法,不是希望大家拋棄el表達(dá)式,相反是希望大家在自己編寫el時(shí)出現(xiàn)問(wèn)題時(shí),先去考慮是否有人在這三個(gè)地方做了設(shè)置造成el表達(dá)式的失效。建議大家多多使用el表達(dá)式,少用一些jsp中的scriptlet代碼。

13.2. 作用域

使用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中的作用域

el中的作用域 對(duì)應(yīng)關(guān)系
pageContext(1) 當(dāng)前頁(yè)的pageContext對(duì)象
pageScope 把page作用域中的數(shù)據(jù)映射為一個(gè)map對(duì)象
requestScope(2) 把request作用域中的數(shù)據(jù)映射為一個(gè)map對(duì)象
sessionScope 把session作用域中的數(shù)據(jù)映射為一個(gè)map對(duì)象
applicationScope 把a(bǔ)pplication作用域中的數(shù)據(jù)映射為一個(gè)map對(duì)象
param 對(duì)應(yīng)request.getParameter()
paramValues(3) 對(duì)應(yīng)request.getParameterValues()
header(4) 對(duì)應(yīng)request.getHeader()
headerValues 對(duì)應(yīng)request.getHeaderValues()
cookie(5) 對(duì)應(yīng)request.getCookies()
initParam(6) 對(duì)應(yīng)ServletContext.getInitParamter()

(1)

例子中的${pageContext.request.contextPath}返回的是request.getContextPath()的值,在此例中就是/13-04,我們經(jīng)常使用這個(gè)來(lái)拼接jsp中的絕對(duì)路徑。

這里的${pageContext.request.contextPath}是一種特殊用法,不能使用${request.contextPath}的形式替代。

(2)

pageScope, requestScope, sessionScope, appliationScope都可以看作是Map型變量,調(diào)用其中的數(shù)據(jù)可以使用${pageScope.name}或${pageScope["name"]}的形式,這兩種寫法是等價(jià)的。

在某些情況下只能使用${pageScope["content-type"]},這里不能寫成${pageScope.content-type},jsp無(wú)法解析連字符(-)會(huì)出現(xiàn)錯(cuò)誤。

(3)

需要注意的是${paramValues.name}得到的是一個(gè)字符串?dāng)?shù)組,如果需要獲得其中某個(gè)值,還需要使用${paramValues.name[0]}指定數(shù)組中的索引。

這與下面的${headerValues.name}是相似的。

(4)

${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)的了。

(5)

${cookie.name}將獲得對(duì)應(yīng)cookie的對(duì)象,比如我們用jsp將一段cookie發(fā)送給客戶端。

Cookie cookie = new Cookie("username", "Username in cookie");
            response.addCookie(cookie);
            

創(chuàng)建一個(gè)名稱為username,值為"Username in cookie"的Cookie對(duì)象,然后發(fā)送給客戶端。

然后我們就可以使用${cookie.username}獲得這個(gè)cookie了,${cookie.username.name}獲得cookie名稱,${cookie.username.value}獲得cookie值。

(6)

ServletContext.getInitParamter()指的應(yīng)用的初始變量,這些變量都是定義在web.xml中的。

<context-param>
            <param-name>username</param-name>
            <param-value>username with context param</param-value>
            </context-param>
            

${initParam.username}就會(huì)得到這里的變量值。

以上都是死記硬背的東西,建議實(shí)際用到的時(shí)候翻看一下就好了,演示代碼都放在13-04下,為了獲得param和cookie還要點(diǎn)擊一下最下邊的連接才可以。

13.3. 運(yùn)算符

el表達(dá)式中支持java中所有的操作符,并且還有一些擴(kuò)展,下面我們簡(jiǎn)要做一下對(duì)照。

表 13.2. 加減乘除四則運(yùn)算

符號(hào) 說(shuō)明
+
-
*
/或div
%或mod 求余

表 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)

表 13.4. 邏輯運(yùn)算

符號(hào) 說(shuō)明
&&或and 邏輯和
||或or 邏輯或
!或not 取反

表 13.5. 特殊運(yùn)算

符號(hào) 說(shuō)明
empty 是否為null或空字符串
: 三元運(yùn)算符

下面上所有運(yùn)算符的顯示結(jié)果,順便說(shuō)一下如果想在jsp中顯示${name}而不讓jsp把它當(dāng)作el計(jì)算出來(lái),可以寫成\${name},這樣最后顯示的結(jié)果就是${name}了。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多