OGNL及相關操作

wangjianme 12年前發布 | 21K 次閱讀 OGNL Struts2 Web框架 Java Struts

一、什么是OGNL,有什么特點?   

OGNLObject-Graph Navigation Language),大概可以理解為:對象圖形化導航語言。是一種可以方便地操作對象屬性的開源表達式語言。OGNL有如下特點:    

1、支持對象方法調用,形式如:objName.methodName()   

2、支持類靜態的方法調用和值訪問,表達式的格式為@[類全名(包括包路)]@[方法名 |  值名],例如:   

@java.lang.String@format('foo %s', 'bar')@tutorial.MyConstant@APP_NAME   

3、支持賦值操作和表達式串聯,例如:   

price=100, discount=0.8, calculatePrice(),這個表達式會返回80   

4、訪問OGNL上下文(OGNL context)和ActionContext   

5、操作集合對象。   

二、使用OGNL表達式   

OGNL要結合struts標簽來使用。由于比較靈活,也容易把人給弄暈,尤其是“%”“#”“$”這三個符號的使用。由于$廣泛應用于EL中,這里重點寫%#符號的用法。   

1“#”符號有三種用途:   

  

(1)、訪問非根對象(struts中值棧為根對象)如OGNL上下文和Action上下文,#相當于ActionContext.getContext();下表有幾個ActionContext中有用的屬性:  

parameters   

 包含當前HTTP請求參數的Map   

 #parameters.id[0]作用相當于request.getParameter("id")    

    

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<100};構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}   

(2)、用于過濾和投影(projecting)集合,如: books.{?#this.price>35}     

  

1.集合的投影(過濾)有以下三種方式:
a.“?#”
:投影(過濾)所有符合條件的集合,如:users.{?#this.age > 19}
b.“^#”
:投影(過濾)第一個符合條件的元素,如:users.{^#this.age > 19}
c.“$#”
:投影(過濾)最后一個符合條件的元素,如:users.{$#this.age > 19}
2.“this”
表示集合中的元素;
3.
投影(過濾)操作返回的是一個集合,可以使用索引取得集合中指定的元素,如:users.{?#this.age > 19}[0]

books.{?#this.price>35}   

(3)、構造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}     

#{'foo1':'bar1', 'foo2':'bar2'}這種方式常用在給radioselectcheckbox等標簽賦值上。如果要在頁面中取一個map的值可以這樣寫:      

<s:property value="#myMap['foo1']"/>     

<s:property value="#myMap['foo1']"/>   

2“%”符號的用途是在標簽的屬性值被理解為字符串類型時,告訴執行環境%{}里的是OGNL表達式。     

這是一開始最讓我不能理解的符號,原因是一些相關資源在表述時不太準備,經過一翻痛苦的探索,終于明白了它的用途。實際上就是讓被理解為字符串的表達式,被真正當成ognl來執行。很有點類似javascript里面的eval_r()功能,例如    

var oDiv = eval_r("document.all.div"+index)     

var oDiv = eval_r("document.all.div"+index)   

index變量為1時,語句就會被當作var oDiv = document.all.div1  var oDiv = document.all.div1來執行。%{}就是起這個作用。舉例:    

<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      

<s:property value="#myMap['key1']"/>      

<s:url value="#myMap['key1']" />    

<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>   

<s:property value="#myMap['key1']"/>   

<s:url value="#myMap['key1']"/>   

上面的代碼第2行會在頁面上輸出“value1”,而第3行則會輸出"#myMap['key1']"這么一個字符串。 如果將第3行改寫成這樣:  

<s:url value="%{#myMap['key1']}"/>       

<s:url value="%{#myMap['key1']}"/>   

則輸出為“value1”   

這說明struts2里不同的標簽對ognl的表達式的理解是不一樣的。如果當有的標簽看不懂類似“#myMap['key1']”的語句時,就要用%{}來把這括進去,翻譯一下了。  

3“$”有兩種用途   

(1)、在國際化資源文件中,引用OGNL表達式。   

(2)、在Struts 2配置文件中,引用OGNL表達式:    

<action name="saveUser" class="userAction" method="save">   

<result type="redirect">listUser.action?msg=${msg}</result>   

</action>   

<action name="saveUser" class="userAction" method="save">       

<result type="redirect">listUser.action?msg=${msg}</result>   

</action> 

 本文由用戶 wangjianme 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!