三大框架-課件ajaxjquery等課程b.講義第五章struts2中ognl_第1頁
三大框架-課件ajaxjquery等課程b.講義第五章struts2中ognl_第2頁
三大框架-課件ajaxjquery等課程b.講義第五章struts2中ognl_第3頁
三大框架-課件ajaxjquery等課程b.講義第五章struts2中ognl_第4頁
三大框架-課件ajaxjquery等課程b.講義第五章struts2中ognl_第5頁
免費預(yù)覽已結(jié)束,剩余35頁可下載查看

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第五章Struts2中的OGNL學(xué)習(xí)目標(biāo)掌握OGNL表達式的使用掌握值棧的概念掌握struts2對OGNL表達式的增強OGNL簡介Struts2的一個關(guān)鍵特性就是它可以對Action攜帶的數(shù)據(jù)進行讀寫訪問,例如在前面我們在表單中使用user.username指定數(shù)據(jù)傳遞給Action的user對象的username屬性,在<s:property>元素中使用user.username來獲取用戶的名字,這是通過表達式語言(ExpressionLanguage,EL)來實現(xiàn)的,這種表達式語言就是OGNL。OGNL的全稱是ObjectGraphNavigationLanguage(對象圖導(dǎo)航語言),它是一種強大的表達式語言,讓你通過簡單一致的表達式語法來讀取和設(shè)置Java對象的屬性值,調(diào)用對象的方法,遍歷整個對象的結(jié)構(gòu)圖,實現(xiàn)字段類型轉(zhuǎn)換等功能。為什么要使用OGNL視圖層的表達式語言通常是用來簡化數(shù)據(jù)的訪問操作,取代Java腳本代碼,提供更清晰的視圖層實現(xiàn)。例如,在JSP頁面中使用JSP2.0內(nèi)置的表達式語言獲取user對象的username屬性,可以簡寫為${user.username},如果換作Java腳本代碼,則需要寫為:<%@pagelanguage="java"import="java.util.*.neusoft.pojo.User"pageEncoding="gbk"%><% Useruser=(User)request.getAttribute("user"); Stringusername=user.getUsername(); out.print(username);%>哪一種方法更為簡捷,相信大家已經(jīng)一目了然了。既然JSP2.0已經(jīng)內(nèi)置了一種表達式語言,那么為什么還要使用OGNL呢?相對于其它的表達式語言而言,OGNL的功能更為強大,它提供了很多高級而必須的特性,例如強大的類型轉(zhuǎn)換功能,靜態(tài)或?qū)嵗椒ǖ膱?zhí)行,跨集合投影(projection),以及動態(tài)lambda表達式定義等。OGNL基礎(chǔ)OGNL表達式的計算都是圍繞OGNL上下文來進行的,OGNL上下文實際上就是一個Map對象,由ognl.OgnlContext類(實現(xiàn)了java.util.Map接口)來表示。OGNL上下文可以包含一個或多個JavaBean對象,在這些對象中有一個是特殊的,這個對象就是上下文的根(root)對象。如果在寫表達式的時候,沒有指定使用上下文中的哪一個對象,那么根對象將被假定為表達式所依據(jù)的對象。計算OGNL表達式的示例代碼(一):計算OGNL表達式的示例代碼(二)計算OGNL表達式的示例代碼(三)說明OgnlContext就是一個Map,在Map中保存值,需要指定鍵(key),你在寫表達式的時候使用的就是鍵名,而不是對象名,這一點一定要注意。在Ognl上下文中,只能有一個根對象,如果你訪問根對象,那么在寫表達式的時候,直接寫對象屬性(property)就可以了;否則,你需要使用”#key”前綴,例如表達式:#.另外需要注意的是,OGNL表達式中的屬性(property)是JavaBean的屬性,而不是類中的實例變量。再看一個簡單示例請看下面的需求,假設(shè)有如下用戶對象模型:

Java代碼

publicinterfaceUser{

publicStringgetName();

publicDategetRegisterDate();

publicCustomergetCustomer();

}

publicinterfaceCustomer{

publicStringgetId();

publicStringgetName();

publicbooleanisVip();

}

publicinterfaceEntCustomerextendsCustomer{

publicStringgetTrustId();//組織機構(gòu)代碼證號

}

問題及解決方案(一)對于給定的用戶jack,且該用戶所屬客戶是企業(yè)客戶,那么我們?nèi)绾潍@取該用戶的姓名?如何獲取用戶所屬客戶的名稱?如何判斷該用戶所屬客戶是否是VIP客戶?如何取jack所屬企業(yè)的組織機構(gòu)代碼證號?*采用java代碼的方式,我們可以用如下的API調(diào)用得到所需信息:

Java代碼

jack.getName();

jack.getCustomer().getName();

jack.getCustomer().isVip();

((EntCustomer)jack.getCustomer()).getTrustId();

問題及解決方案(二)*但我們現(xiàn)在在講述OGNL,因此通過采用OGNL,我們可以用如下方式取得我們所需要的信息:

Java代碼

jack.customer.vip

jack.customer.trustId

由此我們可以看到OGNL的表達方式與java表達方式有以下幾點不同:

**不需關(guān)注對象類型,不需進行類型轉(zhuǎn)換

**表達方式更簡短和直觀OGNL表達式最大的優(yōu)點就是:*簡單*和*直觀*,你不這樣認(rèn)為嗎?如果你覺得上面的表達式還不夠簡單和直觀,那我們再來看:

Java代碼

name

這也是一個OGNL表達式,也就是取姓名!簡單嗎?至少足夠直觀了吧

OGNL基本概念我們前面看到了OGNL的一個最簡單的例子,事實上OGNL確實很簡單,如果能理解上面那個例子的用法,那么我們就掌握了OGNL的80%的用法了。

上面的例子雖然簡單,但其中卻含有OGNL的兩個最基本的概念:*表達式(expression)*和*上下文(context)*,我們先看*表達式*。

表達式

OGNL就是表達式!它能讓我們用簡潔直觀的語法表達我們的想法,如同上面的例子一般。簡潔直觀就是表達式的最大優(yōu)點!我們知道表達式總是有一個結(jié)果,也就是說表達式總是會求值出一個結(jié)果,這個結(jié)果可能是一個字符串(如名稱、組織機構(gòu)代碼證號等),或者是一個布爾值(如是否是VIP客戶等),至于這個結(jié)果要怎么使用,那就是我們自己來決定的了。

上下文(context)

表達式的概念,我相信很好理解,但什么是上下文(context)?簡單來說上下文就是環(huán)境,表達式求值的環(huán)境!還是不理解嗎?我們來看一個例子:

還是上面最后那個例子:Java代碼

name

細心的你是否會問,這個表達式要取誰的姓名呢?OK,很好!這就是環(huán)境,"誰"就存在于環(huán)境之中,也就是存在上下文之中。對于不同的環(huán)境/上下文,相同的表達式會有不同的結(jié)果!而環(huán)境/上下文的實質(zhì)是什么呢?就是一組帶名稱的對象集合。

OGNL上下文概念詳解OGNL上下文概念詳解

我們前面說上下文就是一組名稱-對象對的集合,如下圖所示就是一個簡單的上下文:Java代碼

user>User(name:"jack",...)

request>HttpServletRequest(header:...)

那么在上面的環(huán)境中,我們可以有如下的OGNL表達式:

Java代碼

#//取用戶的姓名

#user.age//取用戶年齡

#user.birthday//取用戶生日

#//取用戶所屬客戶的名稱

#request.parameters//取請求參數(shù)

請注意上面表達式中的"#user"和"#request"的用法,"#"表示訪問環(huán)境/上下文中的對象。OGNL上下文概念詳解現(xiàn)在可以很方便地訪問環(huán)境中的對象了,那么如果你比較懶惰的話(記住:在程序員群體,懶惰是褒義詞!),你是否覺得訪問用戶的姓名,年齡,生日,等等其它屬性如果全部要使用“#user”來訪問會不會太麻煩了呢?OK,OGNL的設(shè)計者早就考慮了這個問題,我們可以指定user為環(huán)境中的特權(quán)對象,訪問該對象可以不需要使用#user的方式,如下所示代碼與上面的完全等價,當(dāng)然,前提是要預(yù)先指定user為特權(quán)對象:

Java代碼

name//取用戶的姓名

age//取用戶年齡

birthday//取用戶生日

//取用戶所屬客戶的名稱

#request.parameters//取請求參數(shù)

我們上面所說的"特權(quán)對象"在OGNL中稱為"根對象"(root)

綜上所述,理解OGNL表達式的關(guān)鍵是理解其上下文的概念,因為OGNL的上下文概念中引入了“根對象”的概念。struts2中的OGNL上下文struts2中的OGNL上下文

struts2對OGNL上下文的概念又做了進一步擴充,在struts2中,OGNL上下文通常如下所示:

Java代碼

|--application

|

|--session

|contextmap|--OgnlValueStack(root)[user,action,OgnlUtil,...]

|

|--request

|

|--parameters

|

|--attr

我們可以使用"#request"訪問HttpServletRequest對象,"#session"訪問HttpSession對象,但請注意"根對象"是什么?是ValueStack!

那么ValueStack是什么?值棧。也就是一組對象的堆棧。也就是說,在struts2中,根對象不是我們通常的一個對象,而是一組對象。我們可以push新的對象到值棧中,也可以彈出值棧的棧頂對象。假設(shè)我們將user對象push到值棧中,那么如下的表達式將與之前我們見過的表達式一樣,具有相同的結(jié)果:

Java代碼

name//取用戶的姓名

age//取用戶年齡

birthday//取用戶生日

//取用戶所屬客戶的名稱

#request.parameters//取請求參數(shù)

也就是說,我們使用name這個表達式的時候,ONGL會取"根對象"的name屬性,但現(xiàn)在根對象是ValueStack!那么訪問ValueStack的name屬性意味著什么呢?這意味著:ValueStack會先查看棧頂元素是否有name屬性,如果有就返回該屬性值,否則取出棧頂下的元素,繼續(xù)查看,直到棧底為止。

以上就是OGNL表達式的核心概念,你理解了嗎?下一步,你需要了進一步了解OGNL的語法,以發(fā)掘其更強大的功能!理解Struts2中的ValueStackValueStack實際是一個接口,在Struts2中利用OGNL時,實際上使用的是實現(xiàn)了該接口的OgnlValueStack類,這個類是Struts2利用OGNL的基礎(chǔ)。OgnlValueStack類的主要屬性關(guān)系圖如下

|--application

|

|--sessioncontextmap(OgnlValueStack屬性)--|

|--valuestack(OgnlValueStack的root屬性,實際是個ArrayList)

|

|--request

|

|--parameters

|

|--attr(searchespage,request,session,thenapplicationscopes)OgnlValueStack類包含兩個重要的屬性,一個root和一個context。其中root本質(zhì)上是一個ArrayList,而context是一個Map(更確切的說是一個OgnlContext對象)。在這個OgnlContext對象(context)中,有一個默認(rèn)的頂層對象root,OGNL訪問context中這個默認(rèn)頂層對象中的元素時,是不需要#號的,直接通過元素的名稱來進行訪問,而訪問其他對象時,如request、session、attr等,則需要#號引用。Struts2將OgnlValueStack的root對象賦值給了context中的root對象,在OgnlValueStack的root對象中,保存著調(diào)用Action的實例,因此,在頁面上通過Struts2標(biāo)簽訪問Action的屬性時,就不需要通過#號來引用。當(dāng)系統(tǒng)創(chuàng)建了Action實例后,該Action實例已經(jīng)被保存到ValueStack中,故無須書寫#即可訪問Action屬性。OgnlValueStack與ActionContext的關(guān)系OgnlValueStack與ActionContext的關(guān)系在Struts2中,OgnlValueStack是ActionContext的基礎(chǔ),在ActionContext中,有一個Map類型的屬性context,而這個context就是OgnlValueStack的context對象,ActionContext中的getSession()、getApplication()等方法,底層都是通過context.get()來實現(xiàn)的。分清ActionContext、ValueStack、StackContext

ActionContext一次Action調(diào)用都會創(chuàng)建一個ActionContext調(diào)用:ActionContextcontext=ActionContext.getContext()ValueStack由OGNL框架實現(xiàn)可以把它簡單的看作一個棧(List)。StackObject:放入stack中的對象,一般是action。StackContext(map):stack上下文,它包含一系列對象,包括request/session/attr/applicationmap等。EL:存取對象的任意屬性,調(diào)用對象的方法,遍歷整個對象結(jié)果…ActionContext是Action上下文,可以得到request,session,applicationValueStack是值棧存放表單中的值StackContext棧上下文也是用來存值的Struts2表達式OGNL支持的常量1.字符串常量(stringliteral)以單引號或雙引號括起來的字符串,例如:‘HelloWorld’和”HelloWorld”.在JAVA中,不能用單引號來界定字符串常量,而在OGNL中是可以的。不過特別要注意的是:如果是單個字符的字符串常量,則必須使用雙引號來界定,例如:“S”。OGNL的字符串也支持轉(zhuǎn)義序列,例如:要在JSP頁面中輸出”Yousaid,”HelloWorld”.”,那么可以使用<s:property>標(biāo)簽,如下:<s:propertyvalue=“’Yousaid,\”HelloWorld\”.’”/>注意:不要忽略了用于界定整個常量字符串的單引號。如果沒有寫單引號,那么整個字符串將不會被看成是字符串常量,而是被當(dāng)作根對象的屬性名,從而導(dǎo)致錯誤。字符常量(Characterliteral)以單引號括起來的字符。例如,‘H’。注意,不能使用雙引號,否則將被看成是字符串常量。數(shù)值常量(Numericliteral)除了Java中的int,long,float,double外,OGNL還讓你用“B”或“b”后綴指定BigDecimal常量,用“H”或”h”后綴指定BigInteger常量,例如,123(int常量),123l(long常量),123.35f(float常量),123b(BigDecimal常量),123h(BigInteger常量)。布爾常量(Booleanliteral)true和falsenull常量(nullliteral).struts2中OGNL表達式的使用Struts2默認(rèn)的表達式語言是OGNL,原因是它相對其它表達式語言具有下面幾大優(yōu)勢:支持對象方法調(diào)用,如xxx.doSomeSpecial();支持類靜態(tài)的方法調(diào)用和值訪問,表達式的格式為@[類全名(包括包路徑)]@[方法名|值名],例如:@java.lang.String@format('foo%s','bar')或@tutorial.MyConstant@APP_NAME;支持賦值操作和表達式串聯(lián),如price=100,discount=0.8,calculatePrice(),這個表達式會返回80;訪問OGNL上下文(OGNLcontext)和ActionContext;操作集合對象。#、%和$:“#”的用途訪問OGNL上下文和Action上下文①#相當(dāng)于ActionContext.getContext();下表有幾個ActionContext中有用的屬性:parameters:包含當(dāng)前HTTP請求參數(shù)的Map,#parameters.id[0]作用相當(dāng)于request.getParameter("id")request:包含當(dāng)前HttpServletRequest的屬性(attribute)的Map,#request.userName相當(dāng)于request.getAttribute("userName")session:包含當(dāng)前HttpSession的屬性(attribute)的Map,#session.userName相當(dāng)于session.getAttribute("userName")application:包含當(dāng)前應(yīng)用的ServletContext的屬性(attribute)的Map,#application.userName相當(dāng)于application.getAttribute("userName")attr:用于按request>session>application順序訪問其屬性(attribute),#attr.userName相當(dāng)于按順序在以上三個范圍(scope)內(nèi)讀取userName屬性,直到找到為止②用于過濾和投影(projecting)集合,如books.{?#this.price<100};③構(gòu)造Map,如#{'foo1':'bar1','foo2':'bar2'}。

#、%和$:“%”的用途“%”符號的用途是在標(biāo)志的屬性為字符串類型時,計算OGNL表達式的值。例如在Ognl.jsp中加入以下代碼:<hr/><h3>%的用途</h3><s:urlvalue="#foobar['foo1']"/><s:urlvalue="%{#foobar['foo1']}"/>#、%和$:“$”的用途“$”有兩個主要的用途:用于在國際化資源文件中,引用OGNL表達式

例如國際化資源文件中的代碼:reg.agerange=國際化資源信息:年齡必須在${min}同${max}之間。

在Struts2框架的配置文件中引用OGNL表達式,例如下面的代碼片斷所示:<validators>

<fieldname=”intb”>

<field-validatortype=”int”>

<paramname=”min”>10</param>

<paramname=”max”>100</param>

<message>BAction-test校驗:數(shù)字必須為${min}為${max}之間!</message>

</field-validator>

</field></validators>Struts2配置文件中,引用OGNL表達式,如<actionname=“AddPhoto”class=“addPhoto”>

<interceptor-refname=“fileUploadStack”/>

<resulttype=“redirect”>ListPhotos.action?albumId=${albumId}</result></action>OGNL的應(yīng)用場景標(biāo)簽中:

<s:property

value=""

/>

配置文件中:<resulttype="redirect">/main.jsp?name=${name}</result>

OGNL訪問屬性訪問方法訪問靜態(tài)屬性和方法訪問構(gòu)造方法訪問數(shù)組訪問集合–投影、選擇(?^$)Lambda:[…]OGNL訪問舉例調(diào)用值棧中屬性:<s:propertyvalue=“user.username”/>調(diào)用Action中的靜態(tài)方法:<s:propertyvalue=“.neusoftLoginAction@get()”/>調(diào)用JDK中的類的靜態(tài)方法:<s:propertyvalue=“@java.lang.Math@floor(44.56)”/>等同于:<s:propertyvalue=“@@floor(44.56)”/>調(diào)用值棧中對象的普通方法:<s:propertyvalue=“user.get()”/>調(diào)用普通類中的靜態(tài)屬性:<s:propertyvalue=“.vo.Addrss@aa”/> 注意屬性不能聲明為私有的即private調(diào)用普通類的構(gòu)造方法:<s:propertyvalue=“newcom.neusoft.Student(‘張三‘,’學(xué)校’)”/>獲取List:<s:propertyvalue=“testlist”/>獲取List某一元素:<s:propertyvalue=“testlist[0]”/>獲取Set:<s:propertyvalue=“testset”/>獲取Map:<s:propertyvalue=“testmap”/>獲取Map中某一元素:<s:propertyvalue=“testmap[‘m1’]”/>注意:在OGNL中可以使用如上形式:@[className]@[fieldormethod]調(diào)用靜態(tài)變量或方法。Set由于是無序的,所以不能使用下標(biāo)獲取數(shù)據(jù)。訪問靜態(tài)方法<s:propertyvalue=".test.util.S@abc()">注意,兩個@是約定..也就是必須這么寫.第一個@后面跟的是類的全名.第二個@后面跟的是對應(yīng)的方法名.當(dāng)然,這個方法必須是靜態(tài)的

這個訪問靜態(tài)方法在struts2.1以后的版本里面需要設(shè)置一個屬性,否則系統(tǒng)默認(rèn)是不支持訪問靜態(tài)方法的(struts2.0版本默認(rèn)是支持訪問靜態(tài)方法的).具體的方法是在struts.xml里面添加這么一句

<constantname="struts.ognl.allowStaticMethodAccess"value="true"></constant>集合的偽屬性O(shè)GNL能夠引用集合的一些特殊的屬性,這些屬性并不是JavaBeans模式,例如size(),length()等等.當(dāng)表達式引用這些屬性時,OGNL會調(diào)用相應(yīng)的方法,這就是偽屬性.CollectionSpecialPropertiesCollection(inheritedbyMap,List&Set)size,isEmptyListiteratorMapkeys,valuesSetiteratorIteratornext,hasNextEnumerationnext,hasNext,nextElement,hasMoreElementsOGNL中#的使用:#可以取出堆棧上下文中的存放的對象.

名稱作用例子parameters包含當(dāng)前HTTP請求參數(shù)的Map#parameters.id[0]作用相當(dāng)于request.getParameter("id")request包含當(dāng)前HttpServletRequest的屬性(attribute)的Map#request.userName相當(dāng)于request.getAttribute("userName")session包含當(dāng)前HttpSession的屬性(attribute)的Map#session.userName相當(dāng)于session.getAttribute("userName")application包含當(dāng)前應(yīng)用的ServletContext的屬性(attribute)的Map#application.userName相當(dāng)于application.getAttribute("userName")attr用于按request>session>application順序訪問其屬性(attribute)#application.userName相當(dāng)于application.getAttribute("userName")OGNL引用Action的屬性

OGNL是一個對象,屬性的查詢語言。在OGNL中有一個類型為Map的Context(稱為上下文),在這個上下文中有一個根元素(root),對根元素的屬性的訪問可以直接使用屬性名字,但是對于其他非根元素屬性的訪問必須加上特殊符號#。因為Action實例被放在ValueStack中,而ValueStack又是根元素(root)中的一個,所以對Action中的屬性的訪問可以不使用標(biāo)記#,而對其他的訪問都必須使用#標(biāo)記。<s:propertyvalue="postalCode"/>ActionContext中的其他非根(root)元素的屬性可以按照如下的方式訪問:<s:propertyvalue="#session.mySessionPropKey"/>or<s:propertyvalue="#session["mySessionPropKey"]"/>or<s:propertyvalue="#request["mySessionPropKey"]/>Action類可以使用ActionContext中的靜態(tài)方法來訪問ActionContext。ActionContext.getContext().getSession().put("mySessionPropKey",mySessionObject);OGNL與Collection(Lists,Maps,Sets)

生成List的語法為:{e1,e2,e3}.<s:selectlabel="label"name="name“l(fā)ist="{'name1','name2','name3'}"value="%{'name2'}"/>上面的代碼生成了一個HTMLSelect對象,可選的內(nèi)容為:name1,name2,name3,默認(rèn)值為:name2。生成Map的語法為:#{key1:value1,key2:value2}. <s:selectlabel="label"name="name“l(fā)ist="#{'foo':'foovalue','bar':'barvalue'}"/>上面的代碼生成了一個HTMLSelect對象,foo名字表示的內(nèi)容為:foovalue,bar名字表示的內(nèi)容為:barvalue。對于集合,OGNL提供了兩個元素符:in和notin,其中in判斷某個元素是否在指定集合中;notin則用于判斷某個元素是否不在指定集合中。判斷一個對象是否在List內(nèi)存在:<s:iftest="'foo'in{'foo','bar'}">

muhahaha</s:if><s:else>

boo</s:else><s:iftest="'foo'notin{'foo','bar'}">

muhahaha</s:if><s:else>

boo</s:else>取得一個List的一部分:?–所有滿足選擇邏輯的對象^-

第一個滿足選擇邏輯的對象$-

最后一個滿足選擇邏輯的對象例如:person.relatives.{?#this.gender=='male'}上述代碼取得這個人(person)所有的男性(this.gender==male)的親戚(relatives)Lambda表達式OGNL支持簡單的Lambda表達式語法,使用這些語法可以建立簡單的lambda函數(shù)。例如: Fibonacci:ifn==0return0;elseifn==1return1;elsereturnfib(n-2)+fib(n-1);fib(0)=0fib(1)=1fib(11)=89OGNL的Lambda表達式如何工作呢?Lambda表達式必須放在方括號內(nèi)部,#this表示表達式的參數(shù)。例如:<s:propertyvalue="#fib=:[#this==0?0:#this==1?1:#fib(#this-2)+#fib(#this-1)],#fib(11)"/>#fib=:[#this==0?0:#this==1?1:#fib(#this-2)+#fib(#this-1)]定義了一個Lambda表達式#fib(11)調(diào)用了這個表達式。所以上述代碼的輸出為:89聲明一個使用遞歸來計算階乘的函數(shù),#fact=:[#this<=1?1:#this*#fact(#this-1)],#fact(30H)注意在JSP2.1中#被用作了JSPEL(表達式語言)的特殊記好,所以對OGNL的使用可能導(dǎo)致問題,一個簡單的方法是禁用JSP2.1的EL特性,這需要修改web.xml文件:<jsp-config>

<jsp-property-group>

<url-pattern>*.jsp</url-pattern>

<el-ignored>true</el-ignored>

</jsp-property-group></jsp-config>Struts2在OGNL基礎(chǔ)上的增強值棧(ValueStack)

Struts2將OGNL上下文設(shè)置為Struts2中的ActionContext(內(nèi)部使用的仍然是OgnlContext),并將值棧設(shè)為OGNL的根對象。我們知道,OGNL上下文中的根對象可以直接訪問,不需要使用任何特殊的“標(biāo)記”,而引用上下文中的其他對象則需要使用“#”來標(biāo)記。由于值棧是上下文中的根對象,因此可以直接訪問。那么對于值棧中的對象該如何訪問呢?Struts2提供了一個特殊的OGNLPropertyAccessor,它可以自動查找棧內(nèi)的所有對象(從棧頂?shù)綏5?,直接找到一個具有你所查找的屬性的對象。也就是說,對于值棧中的任何對象都可以直接訪問,而不需要使用“#”。

假設(shè)值棧中有兩個對象:student和employee,兩個對象都有name屬性,student有學(xué)號屬性number,而employee有薪水屬性salary。employee先入棧,student后入棧,位于棧頂,那么對于表達式name,訪問的就是student的name屬性,因為student對象位于棧頂;表達式salary,訪問的就是employee的salary屬性。正如你所見,訪問值棧中的對象屬性或方法,無須指明對象,也不用“#”,就好像值棧中的對象都是OGNL上下文中的根對象一樣。這就是Struts2在OGNL基礎(chǔ)上做出的改進。OGNL[N]語法[N]語法如上所述,如果想要訪問employee的name屬性,應(yīng)該如何寫表達式呢?我們可以使用[N].xxx(N是從0開始的整數(shù))這樣的語法來指定從哪一個位置開始向下查找對象的屬性,表達式[1].name訪問的就是employee對象的name屬性。OGNL[N]語法在使用[N].xxx語法時,要注意位置序號的含義,它并不是表示“獲取棧中索引為N的對象”,而是截取從位置N開

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論