struts2中使用OGNL表達式

轉自:http://ll-feng.javaeye.com/blog/247036

一、什麼是OGNL,有什麼特點?
OGNL(Object-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屬性,直到找到爲止 

(2)、用於過濾和投影(projecting)集合,如:

books.{?#this.price>35}  

books.{?#this.price>35}


(3)、構造Map,如:

#{'foo1':'bar1''foo2':'bar2'}  

#{'foo1':'bar1', 'foo2':'bar2'}


這種方式常用在給radio或select、checkbox等標籤賦值上。如果要在頁面中取一個map的值可以這樣寫:

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

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

2、"%"符號的用途是在標籤的屬性值被理解爲字符串類型時,告訴執行環境%{}裏的是OGNL表達式。
這是一開始最讓我不能理解的符號,原因是一些相關資源在表述時不太準備,經過一翻痛苦的探索,終於明白了它的用途。實際上就是讓被理解爲字符串的表達式,被真正當成ognl來執行。很有點類似javascript裏面的eval()功能,例如

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

var oDiv = eval("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>  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章