1、什麼是OGNL,有什麼特色? javascript
OGNL(Object-Graph Navigation Language),大概能夠理解爲:對象圖形化導航語言。是一種能夠方便地操做對象屬性的開源表達式語言。OGNL有以下特色:java
一、支持對象方法調用,形式如:objName.methodName();session
二、支持類靜態的方法調用和值訪問,表達式的格式爲@[類全名(包括包路)]@[方法名 | 值名],例如:app
@Java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;this
三、支持賦值操做和表達式串聯,例如:url
price=100, discount=0.8, calculatePrice(),這個表達式會返回80;spa
四、訪問OGNL上下文(OGNL context)和ActionContext;.net
五、操做集合對象。翻譯
2、使用OGNL表達式 orm
OGNL要結合struts標籤來使用。因爲比較靈活,也容易把人給弄暈,尤爲是「%」、「#」、「$」這三個符號的使用。因爲$普遍應用於EL中,這裏重點寫%和#符號的用法。
一、「#」符號有三種用途:
(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}
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']「/>
二、「%」符號的用途是在標籤的屬性值被理解爲字符串類型時,告訴執行環境%{}裏的是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」 method=」save」>
<result type=」redirect」>listUser.action?msg=${msg}</result>
</action>
<action name=」saveUser」 method=」save」>
<result type=」redirect」>listUser.action?msg=${msg}</result>
</action>
<s:iterator value="#map.entrySet()"> key: <s:property value="getkey()"/><br> value:<s:property value="getvalue()"/><br> </s:iterator>