1. 程式人生 > >struts2中 # % $ 的區別和用法

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>