struts2中 # % $ 的區別和用法
struts2 OGNL,struts2 表示式語言,Struts2 中OGNL表示式的用法,Struts2 #,表示式語言的好處,Struts2 $,struts2 井號,星號,百分號
表示式語言主要有以下幾大好處:
1. 避免(MyType) request.getAttribute()和myBean.getMyProperty()之類的語句,使頁面更簡潔;
2. 支援運算子(如+-*/),比普通的標誌具有更高的自由度和更強的功能;
3. 簡單明瞭地表達程式碼邏輯,使用程式碼更可讀與便於維護。
Struts2 中OGNL表示式的用法:
OGNL(Object-Graph Navigation Language),可以方便地操作物件屬性的開源表示式語言;
“#”主要有三種用途:
1. 訪問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<100};
3. 構造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。
“%”符號的用途是在標籤的屬性值被理解為字串型別時,告訴執行環境%{}裡的是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']" />
上面的程式碼第2行會在頁面上輸出“value1”,而第3行則會輸出"#myMap['key1']"這麼一個字串。 如果將第3行改寫成這樣:
<s:url value="%{#myMap['key1']}"/>
則輸出為“value1”。
這說明struts2裡不同的標籤對ognl的表示式的理解是不一樣的。如果當有的標籤“看不懂”類似“#myMap['key1']”的語句時,就要用%{}來把這括進去,“翻譯”一下了。
“$”有兩個主要的用途 :
1. 用於在國際化資原始檔中,引用OGNL表示式,例子請參考《在Struts 2.0中國際化(i18n)您的應用程式》
2. 在Struts 2配置檔案中,引用OGNL表示式,如
<action name="AddPhoto" class="addPhoto">
<interceptor-ref name="fileUploadStack" />
<result type="redirect">ListPhotos.action?albumId=${albumId}</result>
</action>