在mvc中,數(shù)據(jù)是在各個(gè)層次之間進(jìn)行流轉(zhuǎn)是一個(gè)不爭(zhēng)的事實(shí)。而這種流轉(zhuǎn),也就會(huì)面臨一些困境,這些困境,是由于數(shù)據(jù)在不同世界中的表現(xiàn)形式不同而造成的:
a. 數(shù)據(jù)在頁(yè)面上是一個(gè)扁平的,不帶數(shù)據(jù)類型的字符串,無(wú)論你的數(shù)據(jù)結(jié)構(gòu)有多復(fù)雜,數(shù)據(jù)類型有多豐富,到了展示的時(shí)候,全都一視同仁的成為字符串在頁(yè)面上展現(xiàn)出來(lái)。
b. 數(shù)據(jù)在java世界中可以表現(xiàn)為豐富的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)類型,你可以自行定義你喜歡的類,在類與類之間進(jìn)行繼承、嵌套。我們通常會(huì)把這種模型稱之為復(fù)雜的對(duì)象樹(shù)。此時(shí),如果數(shù)據(jù)在頁(yè)面和Java世界中互相流轉(zhuǎn)傳遞,就會(huì)顯得不匹配。所以也就引出了幾個(gè)需要解決的問(wèn)題;
c. 當(dāng)數(shù)據(jù)從View層傳遞到Controller層時(shí),我們應(yīng)該保證一個(gè)扁平而分散在各處的數(shù)據(jù)集合能以一定的規(guī)則設(shè)置到Java世界中的對(duì)象樹(shù)中去。同時(shí),能夠聰明的進(jìn)行由字符串類型到Java中各個(gè)類型的轉(zhuǎn)化;
d. 當(dāng)數(shù)據(jù)從Controller層傳遞到View層時(shí),我們應(yīng)該保證在View層能夠以某些簡(jiǎn)易的規(guī)則對(duì)對(duì)象樹(shù)進(jìn)行訪問(wèn)。同時(shí),在一定程度上控制對(duì)象樹(shù)中的數(shù)據(jù)的顯示格式。
如果我們稍微深入一些來(lái)思考這個(gè)問(wèn)題,我們就會(huì)發(fā)現(xiàn),解決數(shù)據(jù)由于表現(xiàn)形式的不同而發(fā)生流轉(zhuǎn)不匹配的問(wèn)題對(duì)我們來(lái)說(shuō)其實(shí)并不陌生。同樣的問(wèn)題會(huì)發(fā)生在Java世界與數(shù)據(jù)庫(kù)世界中,面對(duì)這種對(duì)象與關(guān)系模型的不匹配,我們采用的 解決方法是使用ORM框架,例如Hibernate,iBatis等等。那么現(xiàn)在,在Web層同樣也發(fā)生了不匹配,所以我們也需要使用一些工具來(lái)幫助我們解決問(wèn)題。為了解決數(shù)據(jù)從View層傳遞到Controller層時(shí)的不匹配性,Struts2采納XWork 的一套完美方案。并且在此的基礎(chǔ)上,構(gòu)建了一個(gè)完美的機(jī)制,從而比較完美的解決了數(shù)據(jù)流轉(zhuǎn)中的不匹配性。OGNL方案就應(yīng)運(yùn)而生
OGNL是Object-Graph Navigation Language的縮寫(xiě),它是一種功能強(qiáng)大的表達(dá)式語(yǔ)言,通過(guò)它簡(jiǎn)單一致的表達(dá)式語(yǔ)法,可以存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,
遍歷整個(gè)對(duì)象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功能。
a. OGNL可以讓我們用非常簡(jiǎn)單的表達(dá)式訪問(wèn)對(duì)象層【OGNL支持對(duì)Map的按鍵值查找】
<ww:PRoperty value='user.name' /> 可以直接點(diǎn)對(duì)象的屬性,如user 屬性是list,<ww:property value='user[0].name' /> 可以獲取第一個(gè)user對(duì)象的 name如user 屬性是一個(gè) map <ww:property value='user[name]' /> 獲取user "name" key 對(duì)應(yīng)的 value
b. 支持運(yùn)算符(如+-*/),比普通的標(biāo)志具有更高的自由度和更強(qiáng)的功能
<ww:property value="100 - wcjd"/>
c. 支持對(duì)象方法調(diào)用,如xxx.doSomeSpecial()
d. 支持類靜態(tài)的方法調(diào)用和值訪問(wèn),表達(dá)式的格式為@[類全名(包括包路徑)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME
<ww:property value="#DateUtil.getNowdate(/"yyyy-MM-dd/")"/>
e. 支持賦值操作和表達(dá)式串聯(lián),如price=100, discount=0.8, calculatePrice(price*discount),這個(gè)表達(dá)式會(huì)返回80
f .訪問(wèn)OGNL上下文(OGNL context)和ActionContext
g.你也可以通過(guò)任意類對(duì)象的構(gòu)造函數(shù)進(jìn)行對(duì)象新建
/**new Java.net.URL("xxxxxx/")**/
h.OGNL支持類似數(shù)據(jù)庫(kù)中的投影(projection) 和選擇(selection)。
投影就是選出集合中每個(gè)元素的相同屬性組成新的集合,類似于關(guān)系數(shù)據(jù)庫(kù)的字段操作。投影操作語(yǔ)法為 collection.{XXX},其中XXX 是這個(gè)集合中每個(gè)元素的公共屬性。
/**group.userList.{username}將獲得某個(gè)group中的所有user的name的列表**/
選擇就是過(guò)濾滿足selection 條件的集合元素,類似于關(guān)系數(shù)據(jù)庫(kù)的紀(jì)錄操作。選擇操作的語(yǔ)法為:collection.{X YYY},其中X 是一個(gè)選擇操作符,后面則是選擇用的邏輯表達(dá)式。而選擇操作符有三種:
? 選擇滿足條件的所有元素
^ 選擇滿足條件的第一個(gè)元素
$ 選擇滿足條件的最后一個(gè)元素
/**group.userList.{? #txxx.xxx != null}將獲得某個(gè)group中user的name不為空的user的列表**/
i. OGNL是通常要結(jié)合Struts 2的標(biāo)志一起使用,主要是#、%和$這三個(gè)符號(hào)的使用。使用方法如下:
/**訪問(wèn)OGNL上下文和Action上下文,#相當(dāng)于ActionContext.getContext();下表有幾個(gè)ActionContext中有用的屬性:parameters 包含當(dāng)前HTTP請(qǐng)求參數(shù)的Map #parameters.id[0]作用相當(dāng)于request.getParameterValues("id").get(0);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順序訪問(wèn)其屬性(attribute) #attr.userName相當(dāng)于按順序在以上三個(gè)范圍(scope)內(nèi)讀取userName屬性,直到找到為止用于過(guò)濾和投影(projecting)集合,如books.{?#this.price<100};構(gòu)造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。%”符號(hào)的用途是在標(biāo)志的屬性為字符串類型時(shí),計(jì)算OGNL表達(dá)式的值。“$”有兩個(gè)主要的用途,用于在國(guó)際化資源文件中,引用OGNL表達(dá)式。在Struts 2和i18n中配置文件/**
j. OGNL 可以獲取后臺(tái) action get()set() 方法 傳送過(guò)來(lái)的數(shù)據(jù)靈活展示到前臺(tái)
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注