- 一、什么是OGNL,,有什么特點,?
-
- OGNL(Object-Graph Navigation Language),大概可以理解為:對象圖形化導(dǎo)航語言。是一種可以方便地操作對象屬性的開源表達式語言,。OGNL有如下特點:
-
- 1,、支持對象方法調(diào)用,形式如:objName.methodName(),;
-
- 2,、支持類靜態(tài)的方法調(diào)用和值訪問,表達式的格式為@[類全名(包括包路)]@[方法名 | 值名],,例如:
-
- @java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME,;
-
- 3、支持賦值操作和表達式串聯(lián),,例如:
-
- price=100, discount=0.8, calculatePrice(),,這個表達式會返回80;
-
- 4,、訪問OGNL上下文(OGNL context)和ActionContext,;
-
- 5、操作集合對象,。
-
-
-
- 二,、使用OGNL表達式
-
- OGNL要結(jié)合struts標簽來使用。由于比較靈活,,也容易把人給弄暈,,尤其是“%”、“#”,、“$”這三個符號的使用,。由于$廣泛應(yīng)用于EL中,這里重點寫%和#符號的用法,。
-
- 1,、“#”符號有三種用途:
-
- (1)、訪問非根對象(struts中值棧為根對象)如OGNL上下文和Action上下文,,#相當于ActionContext.getContext(),;下表有幾個ActionContext中有用的屬性:
-
-
-
- 名稱
- 作用
- 例子
-
- parameters
- 包含當前HTTP請求參數(shù)的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
- 包含當前應(yīng)用的ServletContext的屬性(attribute)的Map
- #application.userName相當于application.getAttribute("userName")
-
-
- 注:attr 用于按request > session > application順序訪問其屬性(attribute),#attr.userName相當于按順序在以上三個范圍(scope)內(nèi)讀取userName屬性,,直到找到為止。用于過濾和投影(projecting)集合,,如books.{?#this.price<100},;構(gòu)造Map,如#{'foo1':'bar1', 'foo2':'bar2'},。
-
-
-
- (2),、用于過濾和投影(projecting)集合,如: books.{?#this.price>35}
-
- books.{?#this.price>35}
-
- (3)、構(gòu)造Map,,如: #{'foo1':'bar1', 'foo2':'bar2'}
-
- #{'foo1':'bar1', 'foo2':'bar2'}這種方式常用在給radio或select,、checkbox等標簽賦值上。如果要在頁面中取一個map的值可以這樣寫:
-
- <s:property value="#myMap['foo1']"/>
-
- <s:property value="#myMap['foo1']"/>
-
- 2,、“%”符號的用途是在標簽的屬性值被理解為字符串類型時,,告訴執(zhí)行環(huán)境%{}里的是OGNL表達式。
-
- 這是一開始最讓我不能理解的符號,,原因是一些相關(guān)資源在表述時不太準備,,經(jīng)過一翻痛苦的探索,終于明白了它的用途,。實際上就是讓被理解為字符串的表達式,,被真正當成ognl來執(zhí)行。很有點類似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來執(zhí)行。%{}就是起這個作用,。舉例:
-
- <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>
|