《表達(dá)式語言O(shè)GNL》PPT課件.ppt_第1頁
《表達(dá)式語言O(shè)GNL》PPT課件.ppt_第2頁
《表達(dá)式語言O(shè)GNL》PPT課件.ppt_第3頁
《表達(dá)式語言O(shè)GNL》PPT課件.ppt_第4頁
《表達(dá)式語言O(shè)GNL》PPT課件.ppt_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

表達(dá)式語言O(shè)GNL,課程結(jié)構(gòu),第四章:表達(dá)式語言O(shè)GNL,目標(biāo):本章旨在向?qū)W員介紹:1)OGNL表達(dá)式的基本語法2)理解值棧3)會(huì)訪問值棧以及上下文中的內(nèi)容,時(shí)間:3學(xué)時(shí)教學(xué)方法:授課+練習(xí),第四章:表達(dá)式語言O(shè)GNL,本章內(nèi)容4.1OGNL簡(jiǎn)介4.2OGNL基礎(chǔ)4.3OGNL基本語法,4.1.1表達(dá)式語言,EL(ExpressionLanguage)的作用避免(MyType)request.getAttribute()和myBean.getMyProperty()之類的語句,使頁面更簡(jiǎn)潔;支持運(yùn)算符(如+-*/),比普通的標(biāo)志具有更高的自由度和更強(qiáng)的功能;簡(jiǎn)單明了地表達(dá)代碼邏輯,使用代碼更可讀與便于維護(hù)。,4.1.2Struts2支持的表達(dá)式語言,Struts2支持以下幾種表達(dá)式語言O(shè)GNL(Object-GraphNavigationLanguage),可以方便地操作對(duì)象屬性的開源表達(dá)式語言;JSTL(JSPStandardTagLibrary),JSP2.0集成的標(biāo)準(zhǔn)的表達(dá)式語言;Groovy,基于Java平臺(tái)的動(dòng)態(tài)語言,它具有時(shí)下比較流行的動(dòng)態(tài)語言(如Python、Ruby和Smarttalk等)的一些起特性;Velocity,嚴(yán)格來說不是表達(dá)式語言,它是一種基于Java的模板匹配引擎,具說其性能要比JSP好。Struts2默認(rèn)的表達(dá)式語言是OGNL是一種表達(dá)式語言,通過簡(jiǎn)單一致的表達(dá)式語法,可以存取對(duì)象的任意屬性。,4.1.3OGNL的優(yōu)勢(shì),支持對(duì)象方法調(diào)用,如xxx.doSomeSpecial()支持類靜態(tài)的方法調(diào)用和值訪問支持賦值操作和表達(dá)式串聯(lián),如price=100,discount=0.8,calculatePrice(),這個(gè)表達(dá)式會(huì)返回80訪問OGNL上下文(OGNLcontext)和ActionContext操作集合對(duì)象,4.1.4OGNL,OGNL是Object-GraphNavigationLanguage的縮寫,它是一種功能強(qiáng)大的表達(dá)式語言(ExpressionLanguage,簡(jiǎn)稱為EL),通過它簡(jiǎn)單一致的表達(dá)式語法,可以存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功能。它使用相同的表達(dá)式去存取對(duì)象的屬性?,F(xiàn)在的Struts2.x中使用OGNL取代原來的EL來做界面數(shù)據(jù)綁定,所謂界面數(shù)據(jù)綁定,也就是把界面元素和對(duì)象層某個(gè)類的某個(gè)屬性綁定在一起,修改和顯示自動(dòng)同步。和struts1.x的formbean相比,這樣做的好處非常明顯:在Struts2.x中不需要為每個(gè)頁面專門寫formbean,可以直接利用對(duì)象層的對(duì)象。如果我們把表達(dá)式看做是一個(gè)帶有語義的字符串,那么OGNL無疑成為了這個(gè)語義字符串與Java對(duì)象之間溝通的橋梁。,4.1.5使用OGNL的原因,OGNL稱為對(duì)象圖導(dǎo)航語言。所謂對(duì)象圖,即以任意一個(gè)對(duì)象為根,通過OGNL可以訪問與這個(gè)對(duì)象關(guān)聯(lián)的其它對(duì)象。示例:,publicclassUserprivateStringusername;privateGroupgroup;publicStringgetUsername()returnusername;publicvoidsetUsername(Stringusername)this.username=username;publicGroupgetGroup()returngroup;publicvoidsetGroup(Groupgroup)this.group=group;,4.1.5使用OGNL的原因,publicclassGroupprivateStringname;privateOrganizationorg;publicStringgetName()returnname;publicvoidsetName(Stringname)=name;publicOrganizationgetOrg()returnorg;publicvoidsetOrg(Organizationorg)=org;,publicclassOrganizationprivateStringorgId;publicStringgetOrgId()returnorgId;publicvoidsetOrgId(StringorgId)Id=orgId;,4.1.5使用OGNL的原因,上面三個(gè)類,描述了通過一個(gè)User對(duì)象,可以導(dǎo)航到Group對(duì)象,進(jìn)而導(dǎo)航到Organization對(duì)象,以User對(duì)象為根,一個(gè)對(duì)象圖如下所示:在真實(shí)的環(huán)境下,這個(gè)對(duì)象圖可能會(huì)極其復(fù)雜,但是通過基本的getters方法,都應(yīng)該能夠訪問到某個(gè)對(duì)象的其它關(guān)聯(lián)對(duì)象。,User(root)-username-group-name-org-orgId,4.1.5使用OGNL的原因,下述代碼將創(chuàng)建一個(gè)User對(duì)象,及其相關(guān)的一系列對(duì)象:如果通過JAVA代碼來進(jìn)行導(dǎo)航(依賴于getters方法),導(dǎo)航到Organization的orgId屬性,如下所示:user.getGroup().getOrg().getOrgId();導(dǎo)航的目的,是為了獲取某個(gè)對(duì)象的值或設(shè)置某個(gè)對(duì)象的值或調(diào)用某個(gè)對(duì)象的方法!OGNL表達(dá)式語言的真正目的,是為了在那些不能寫JAVA代碼的地方執(zhí)行JAVA代碼,或者是為了更方便地執(zhí)行JAVA代碼如果使用OGNL表達(dá)式來進(jìn)行導(dǎo)航,導(dǎo)航到Organization的orgId屬性,如下所示:id可見OGNL表達(dá)式最大的優(yōu)點(diǎn)就是:“簡(jiǎn)單”和“直觀”。,Useruser=newUser();Groupg=newGroup();Organizationo=newOrganization();o.setOrgId(ORGID);g.setOrg(o);user.setGroup(g);,第四章:表達(dá)式語言O(shè)GNL,本章內(nèi)容4.1OGNL簡(jiǎn)介4.2OGNL基礎(chǔ)4.3OGNL基本語法,4.2.1OGNL上下文,Struts2對(duì)OGNL作了進(jìn)一步增強(qiáng)。OGNL表達(dá)式的計(jì)算都是圍繞OGNL上下文來進(jìn)行的,OGNL上下文實(shí)際上就是一個(gè)Map對(duì)象,由ognl.OgnlContext類(實(shí)現(xiàn)了java.util.Map接口)來表示。Struts2把OGNLContext設(shè)置為ActionContext,即在Struts2中OGNL上下文(Context)的實(shí)現(xiàn)為ActionContext。Struts2把ValueStack作為OGNL的根對(duì)象。,4.2.1OGNL上下文,Struts2中的OGNLContext實(shí)現(xiàn)者為ActionContext,它結(jié)構(gòu)示意圖如下:當(dāng)Struts2接受一個(gè)請(qǐng)求時(shí),會(huì)迅速創(chuàng)建ActionContext,ValueStack,action。然后把a(bǔ)ction存放進(jìn)ValueStack,所以action的實(shí)例變量可以被OGNL訪問。,4.2.2值棧,在struts2中將OGNL上下文設(shè)置為struts2中的ActionContext,并將值棧作為OGNL的根對(duì)象。值棧類似于正常的棧,符合后進(jìn)先出的棧的特點(diǎn),你可以在值棧中放入、刪除和查詢對(duì)象,值棧是Struts2的核心。OGNL設(shè)定的根對(duì)象(root對(duì)象),在Struts2中就是ValueStack(值棧)。如果要訪問根對(duì)象(即ValueStack)中對(duì)象的屬性,則可以省略#命名空間,直接訪問該對(duì)象的屬性即可。,4.2.2值棧,在struts2中,根對(duì)象ValueStack的實(shí)現(xiàn)類為OgnlValueStack,該對(duì)象不是我們想像的只存放單個(gè)值,而是存放一組對(duì)象。在OgnlValueStack類里有一個(gè)List類型的root變量,就是使用他存放一組對(duì)象|-request|-applicationcontext-|-OgnlValueStackroot變量action,OgnlUtil,.|-session|-attr|-parameters在root變量中處于第一位的對(duì)象叫棧頂對(duì)象。通常我們?cè)贠GNL表達(dá)式里直接寫上屬性的名稱即可訪問root變量里對(duì)象的屬性,搜索順序是從棧頂對(duì)象開始尋找,如果棧頂對(duì)象不存在該屬性,就會(huì)從第二個(gè)對(duì)象尋找,如果沒有找到就從第三個(gè)對(duì)象尋找,依次往下訪問,直到找到為止。注意:Struts2中,OGNL表達(dá)式需要配合Struts標(biāo)簽才可以使用。如:,4.2.3OGNL的訪問,由于ValueStack(值棧)是Struts2中OGNL的根對(duì)象,如果用戶需要訪問值棧中的對(duì)象,在JSP頁面可以直接通過下面的EL表達(dá)式訪問ValueStack(值棧)中對(duì)象的屬性:$foo/獲得值棧中某個(gè)對(duì)象的foo屬性如果訪問其他Context中的對(duì)象,由于他們不是根對(duì)象,所以在訪問時(shí),需要添加#前綴。application對(duì)象:用于訪問ServletContext,例如#application.userName或者#applicationuserName,相當(dāng)于調(diào)用ServletContext的getAttribute(username)。session對(duì)象:用來訪問HttpSession,例如#session.userName或者#sessionuserName,相當(dāng)于調(diào)用session.getAttribute(userName)。request對(duì)象:用來訪問HttpServletRequest屬性(attribute)的Map,例如#request.userName或者#requestuserName,相當(dāng)于調(diào)用request.getAttribute(userName)。parameters對(duì)象:用于訪問HTTP的請(qǐng)求參數(shù),例如#parameters.userName或者#parametersuserName,相當(dāng)于調(diào)用request.getParameter(username)。attr對(duì)象:按page-request-session-application順序訪問其屬性。,第四章:表達(dá)式語言O(shè)GNL,本章內(nèi)容4.1OGNL簡(jiǎn)介4.2OGNL基礎(chǔ)4.3OGNL基本語法,4.3OGNL基本語法,基本的OGNL語法是十分簡(jiǎn)單的,當(dāng)然OGNL支持豐富的表達(dá)式,一般情況下,不用擔(dān)心OGNL的復(fù)雜性。例如有一個(gè)man對(duì)象,該對(duì)象有一個(gè)name屬性,那么使用OGNL來獲得該name屬性可以使用如下表達(dá)式:OGNL表達(dá)式的基礎(chǔ)單元稱為導(dǎo)航鏈,簡(jiǎn)稱為鏈。一個(gè)最簡(jiǎn)單的鏈由如下部分組成。屬性名稱方法調(diào)用數(shù)組元素說明:OGNL表達(dá)式基于OGNL上下文中的當(dāng)前對(duì)象,一個(gè)“鏈”將使用上一個(gè)“鏈”的處理結(jié)果,開發(fā)者可以任意擴(kuò)展該鏈的長(zhǎng)度,OGNL沒有限制。,4.3.1常量的聲明,字符串常量(stringliteral)以單引號(hào)或雙引號(hào)括起來的字符串,例如:HelloWorld和”HelloWorld”.在JAVA中,不能用單引號(hào)來界定字符串常量,而在OGNL中是可以的。不過特別要注意的是:如果是單個(gè)字符的字符串常量,則必須使用雙引號(hào)來界定,例如:“S”。OGNL的字符串也支持轉(zhuǎn)義序列,例如:要在JSP頁面中輸出”Yousaid,”HelloWorld”.”,那么可以使用標(biāo)簽,如下:注意:不要忽略了用于界定整個(gè)常量字符串的單引號(hào)。如果沒有寫單引號(hào),那么整個(gè)字符串將不會(huì)被看成是字符串常量,而是被當(dāng)作根對(duì)象的屬性名,從而導(dǎo)致錯(cuò)誤。字符常量(Characterliteral)以單引號(hào)括起來的字符。例如,H。注意,不能使用雙引號(hào),否則將被看成是字符串常量。數(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).,4.3.2OGNL操作符,OGNL支持所有的Java操作符(+、-、*、/、+、-、=、!=、=等)與Java類似,并提供了一些特有的操作符。與Java相同的操作符不再介紹,下面看一下OGNL特有的操作符。逗號(hào)(,)或序列操作符OGNL的逗號(hào)操作符是從C語言中借鑒而來的。逗號(hào)被用于分隔兩個(gè)或多個(gè)獨(dú)立的表達(dá)式,整個(gè)表達(dá)式是最后一個(gè)表達(dá)式的值。如:,team1.teamname第一個(gè)表達(dá)式和第二個(gè)表達(dá)式team1.teamname,整個(gè)表達(dá)式的值是第二個(gè)表達(dá)式的值。花括號(hào)()操作符花括號(hào)()操作符用于創(chuàng)建列表。使用花括號(hào)將元素括起來,元素之間使用逗號(hào)分隔,例如:“zhangsan”,“l(fā)ishi”,“wangwu”1此表達(dá)式創(chuàng)建了帶有三個(gè)元素的列表,并且訪問其中第二個(gè)元素。in和notin操作符in和notin用于判斷一個(gè)值是否屬于一個(gè)集合中。如:teamnameinteam1,team2,4.3.3OGNL表達(dá)式,訪問屬性訪問方法訪問靜態(tài)屬性和方法訪問構(gòu)造方法訪問數(shù)組訪問集合投影、選擇(?$)Lambda:,4.3.3訪問屬性,訪問屬性:訪問對(duì)象屬性(get和set):訪問對(duì)象屬性(get和set):,4.3.4訪問方法,訪問類對(duì)象的方法:訪問action的方法:,4.3.5訪問靜態(tài)屬性和方法,OGNL支持調(diào)用類中的靜態(tài)方法和靜態(tài)字段,可以使用如下語法格式:其中class必順給出完整的類名。例如:java.lang.StringvalueOf(5)。如果省略class,那么默認(rèn)使用類是java.lang.Math,classmethod(args)/調(diào)用靜態(tài)方法classfield/訪問靜態(tài)字段(public權(quán)限),訪問靜態(tài)方法:訪問靜態(tài)屬性:訪問Math靜態(tài)方法:,4.3.6訪問構(gòu)造方法,訪問構(gòu)造方法:,4.3.7訪問集合和數(shù)組,OGNL的集合操作如果需要一個(gè)集合元素的時(shí)候(例如List對(duì)象或者M(jìn)ap對(duì)象),可以使用OGNL中同集合相關(guān)的表達(dá)式。可以使用如下代碼直接生成一個(gè)List對(duì)象:該OGNL表達(dá)式中,直接生成了一個(gè)List對(duì)象,該List對(duì)象中包含3個(gè)元素:e1、e2和e3。如果需要更多的元素,可以按照這樣的格式定義多個(gè)元素,多個(gè)元素之間使用逗號(hào)隔開。如下代碼可以直接生成一個(gè)Map對(duì)象:Map類型的集合對(duì)象,使用key-value格式定義,每個(gè)key-value元素使用冒號(hào)標(biāo)識(shí),多個(gè)元素之間使用逗號(hào)隔開。對(duì)于集合類型,OGNL表達(dá)式可以使用in和notin兩個(gè)元素符號(hào)。其中,in表達(dá)式用來判斷某個(gè)元素是否在指定的集合對(duì)象中;notin判斷某個(gè)元素是否不在指定的集合對(duì)象中,如代碼所示。,e1,e2,e3,e1,e2,e3,#key1:value1,key2:value2,4.3.7訪問集合和數(shù)組,訪問List:訪問List中某個(gè)元素:訪問List中元素某個(gè)屬性的集合:訪問List中元素某個(gè)屬性的集合中的特定值:|訪問Set:訪問Set中某個(gè)元素:訪問Map:訪問Map中某個(gè)元素:|訪問Map中所有的key:訪問Map中所有的value:訪問容器的大小:,4.3.7訪問集合和數(shù)組,集合的偽屬性O(shè)GNL能夠引用集合的一些特殊的屬性,這些屬性并不是JavaBeans模式,例如size(),length()等等.當(dāng)表達(dá)式引用這些屬性時(shí),OGNL會(huì)調(diào)用相應(yīng)的方法,這就是偽屬性.,4.3.8投影(Projection),OGNL提供了一種簡(jiǎn)單的方式在一個(gè)集合中對(duì)每一個(gè)元素調(diào)用相同的方法,或者抽取相同的屬性,并將結(jié)果保存為一個(gè)新的集合,稱之為投影。假如employees是一個(gè)包含了employee對(duì)象的列表,那么:在投影期間,使用#this變量來引用迭代中的當(dāng)前元素。OGNL提供了一種簡(jiǎn)單的方式來使用表達(dá)式從集合中選擇某些元素,并將結(jié)果保存到新的集合中,稱為選擇。,#/返回所有雇員的名字的列表,objects.#thisinstanceofString?#this:#this.toString(),#employees.?#this.salary3000將返回薪水大于3000的所有雇員的列表。#employees.#this.salary3000將返回第一個(gè)薪水大于3000的雇員的列表。#employees.$#this.salary3000將返回最后一個(gè)薪水大于3000的雇員的列表。,4.3.8投影(Projection),4.3.9OGNL表達(dá)式符號(hào),struts2OGNL中的#、%和$符號(hào)用法說明#符號(hào)的

溫馨提示

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

評(píng)論

0/150

提交評(píng)論