天天看點

OGNL表達式struts2标簽“%,#,$

[b] OGNL表達式struts2标簽“%,#,$”

一、什麼是OGNL,有什麼特點? [/b]

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

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

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

@[email protected]('foo %s', 'bar')或@[email protected]_NAME;

3、支援指派操作和表達式串聯,例如:

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

4、通路OGNL上下文(OGNL context)和ActionContext;

5、操作集合對象。

[b] 二、使用OGNL表達式 [/b]

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}

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 = 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>

ognl $ %