1.OGNL 出現的意義
在mvc中,資料是在各個層次之間進行流轉是一個不爭的事實。而這種流轉,也會面臨一些困境,這些困境,是由於數據在不同世界中的表現形式不同而造成的:
a. 數據在頁面上是一個扁平的,不帶數據類型的字符串,無論你的資料結構有多複雜,資料類型有多豐富,到了展示的時候,全都一視同仁的成為字串在頁面上展現出來。
b. 資料在java世界中可以表現為豐富的資料結構和資料類型,你可以自行定義你喜歡的類,在類別與類別之間進行繼承、嵌套。我們通常會把這種模型稱之為複雜的物件樹。此時,如果資料在頁面和Java世界中互相流轉傳遞,就會顯得不符。所以也引出了幾個需要解決的問題;
c. 當資料從View層傳遞到Controller層時,我們應該保證一個扁平而分散在各處的資料集合能以一定的規則設定到Java世界中的對象樹中去。同時,能夠聰明的進行由字串類型到Java中各個類型的轉換;
d. 當資料從Controller層傳遞到View層時,我們應該保證在View層能夠以某些簡易的規則對物件樹進行訪問。同時,在一定程度上控制物件樹中的資料的顯示格式。
如果我們稍微深入一些來思考這個問題,我們就會發現,解決數據由於表現形式的不同而發生流轉不匹配的問題對我們來說其實並不陌生。同樣的問題會發生在Java世界與資料庫世界中,面對這種物件與關係模型的不匹配,我們採用的 解決方法是使用ORM框架,例如Hibernate,iBatis等等。那麼現在,在Web層同樣也發生了不匹配,所以我們也需要使用一些工具來幫助我們解決問題。為了解決資料從View層傳遞到Controller層時的不匹配性,Struts2採納XWork 的一套完美方案。並且在此的基礎上,建構了一個完美的機制,從而比較完美的解決了資料流轉中的不匹配性。 OGNL方案就應運而生
2.OGNL專案實戰
OGNL是Object-Graph Navigation Language的縮寫,它是一種強大的表達式語言,透過它簡單一致的表達式語法,可以存取物件的任意屬性,呼叫物件的方法,
遍歷整個物件的結構圖,實現欄位類型轉換等功能。
a. OGNL可以讓我們用非常簡單的表達式存取物件層【OGNL支援對Map的按鍵值查找】
如user 屬性是list,
如user 屬性是一個map
b. 支援運算子(如+-*/),比普通的標誌具有更高的自由度和更強的功能
c. 支援物件方法調用,如xxx.doSomeSpecial()
d. 支援類別靜態的方法調用和值訪問,表達式的格式為@[類別全名(包括套件路徑)]@[方法名稱| 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME
e. 支援賦值運算和表達式串聯,如price=100, discount=0.8, calculatePrice(price*discount),這個表達式會回傳80
f .存取OGNL上下文(OGNL context)和ActionContext
g.你也可以透過任意類別物件的建構函式進行物件新
/**新的 Java.net.URL("xxxxxx/")
**/
h.OGNL
/**group.userList.{username}將獲得某個group中的所有user的name的清單
h.OGNL資料庫中的投影(projection) 和選擇(selection)。
/**&*/
/**group.userList.{? #txxx.xxx != null}將獲得某個group中user的name不為空的user的列表
**/
i. OGNL是通常要結合Struts 2的標誌一起使用,主要是#、%和$這三個符號的使用。使用方法如下:
/**存取OGNL上下文和Action上下文,#相當於ActionContext.getContext();下表有幾個ActionContext中有用的屬性:
parameters 包含目前HTTP請求參數的Map #parameters. id[0]作用相當於request.getParameterValues("id").get(0);
request 包含目前HttpServletRequest的屬性(attribute)的Map #request.userName相當於request.getAttribute("userName")session 包含目前HttpSession的屬性(attribute)的Map #session.userName相當於session.getAttribute("userName")application 包含目前應用的ServletContext的屬性(attribute)的Map #application.userName相當於application.getAttribute("userName")
attr 用於按request > session > application順序存取其屬性(attribute) #attr.userName相當於按順序在以上三個範圍(scope)內讀取userName屬性,直到找到為止
用於過濾和投影( projecting)集合,
如books.{?#this.price構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
%」符號的用途是在標誌的屬性為字串類型時,計算OGNL表達式的值。
「$」有兩個主要的用途,用於在國際化資源檔案中,引用OGNL表達式。前端OGNL試練的內容,更多相關內容請追蹤PHP中文網(www.php.cn)!