- 一、什么是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 this.price<100};構造Map,如#{'foo1':'bar1',> session > application順序訪問其屬性(attribute),#attr.userName相當于按順序在以上三個范圍(scope)內讀取userName屬性,直到找到為止。用于過濾和投影(projecting)集合,如books.{?# 'foo2':'bar2'}。 -
-
-
- (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_r()功能,例如
: -
-
var
oDiv "document.all.div"+index)= eval_r( -
-
var
oDiv "document.all.div"+index)= eval_r( -
- 當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>