OGNL表達式struts2標籤「%,#,$」

  1. 1、什麼是OGNL,有什麼特色? 
  2. OGNL(Object-GraphNavigationLanguage),大概能夠理解爲:對象圖形化導航語言。是一種能夠方便地操做對象屬性的開源表達式語言。OGNL有以下特色: 
  3. 1、支持對象方法調用,形式如:objName.methodName(); 
  4. 2、支持類靜態的方法調用和值訪問,表達式的格式爲@[類全名(包括包路)]@[方法名|值名],例如: 
  5. @java .lang.String@format ('foo%s','bar')或@tutorial.MyConstant@APP_NAME; 
  6. 3、支持賦值操做和表達式串聯,例如: 
  7. price=100,discount=0.8,calculatePrice(),這個表達式會返回80; 
  8. 4、訪問OGNL上下文(OGNLcontext)和ActionContext; 
  9. 5、操做集合對象。 
  10.  
  11. 2、使用OGNL表達式 
  12. OGNL要結合struts標籤來使用。因爲比較靈活,也容易把人給弄暈,尤爲是「%」、「#」、「$」這三個符號的使用。因爲$普遍應用於EL中,這裏重點寫%和#符號的用法。 
  13. 1、「#」符號有三種用途: 
  14. (1)、訪問非根對象(struts中值棧爲根對象)如OGNL上下文和Action上下文,#至關於ActionContext.getContext();下表有幾個ActionContext中有用的屬性: 
  15.  
  16. 名稱 
  17. 做用 
  18. 例子 
  19.  
  20. parameters 
  21. 包含當前HTTP請求參數的Map 
  22. #parameters.id[0]做用至關於request.getParameter("id"
  23.  
  24. request 
  25. 包含當前HttpServletRequest的屬性(attribute)的Map 
  26. #request.userName至關於request.getAttribute("userName"
  27.  
  28. session 
  29. 包含當前HttpSession的屬性(attribute)的Map 
  30. #session.userName至關於session.getAttribute("userName"
  31.  
  32. application 
  33. 包含當前應用的ServletContext的屬性(attribute)的Map 
  34. #application.userName至關於application.getAttribute("userName"
  35.  
  36. 注:attr用於按request>session>application順序訪問其屬性(attribute),#attr.userName至關於按順序在以上三個範圍(scope)內讀取userName屬性,直到找到爲止。用於過濾和投影(projecting)集合,如books.{?#this.price<100};構造Map,如#{'foo1':'bar1','foo2':'bar2'}。 
  37.  
  38. (2)、用於過濾和投影(projecting)集合,如:books.{?#this.price>35
  39. books.{?#this.price>35
  40. (3)、構造Map,如:#{'foo1':'bar1','foo2':'bar2'
  41. #{'foo1':'bar1','foo2':'bar2'}這種方式經常使用在給radio或select、checkbox等標籤賦值上。若是要在頁面中取一個map的值能夠這樣寫: 
  42. <s:propertyvalue="#myMap['foo1']"/> 
  43. <s:propertyvalue="#myMap['foo1']"/> 
  44. 2、「%」符號的用途是在標籤的屬性值被理解爲字符串類型時,告訴執行環境%{}裏的是OGNL表達式。 
  45. 這是一開始最讓我不能理解的符號,緣由是一些相關資源在表述時不太準備,通過一翻痛苦的探索,終於明白了它的用途。實際上就是讓被理解爲字符串的表達式,被真正當成ognl來執行。頗有點相似javascript裏面的eval_r()功能,例如: 
  46. varoDiv=eval_r("document.all.div"+index) 
  47. varoDiv=eval_r("document.all.div"+index) 
  48. 當index變量爲1時,語句就會被看成varoDiv=document.all.div1varoDiv=document.all.div1來執行。%{}就是起這個做用。舉例: 
  49. <s:setname="myMap" value="#{'key1':'value1','key2':'value2'}"/> 
  50. <s:propertyvalue="#myMap['key1']"/> 
  51. <s:urlvalue="#myMap['key1']" /> 
  52. <s:setname="myMap" value="#{'key1':'value1','key2':'value2'}"/> 
  53. <s:propertyvalue="#myMap['key1']"/> 
  54. <s:urlvalue="#myMap['key1']"/> 
  55. 上面的代碼第2行會在頁面上輸出「value1」,而第3行則會輸出"#myMap['key1']"這麼一個字符串。若是將第3行改寫成這樣: 
  56. <s:urlvalue="%{#myMap['key1']}"/> 
  57. <s:urlvalue="%{#myMap['key1']}"/> 
  58. 則輸出爲「value1」。 
  59.  
  60.  
  61. 這說明struts2裏不一樣的標籤對ognl的表達式的理解是不同的。若是當有的標籤「看不懂」相似「#myMap['key1']」的語句時,就要用%{}來把這括進去,「翻譯」一下了。 
  62. 3、「$」有兩種用途 
  63. (1)、在國際化資源文件中,引用OGNL表達式。 
  64. (2)、在Struts2配置文件中,引用OGNL表達式: 
  65. <actionname="saveUser" class="userAction" method="save"
  66. <resulttype="redirect">listUser.action?msg=${msg}</result> 
  67. </action> 
  68. <actionname="saveUser" class="userAction" method="save"
  69. <resulttype="redirect">listUser.action?msg=${msg}</result> 
  70. </action>
  1. 1、什麼是OGNL,有什麼特色? 
  2. OGNL(Object-GraphNavigationLanguage),大概能夠理解爲:對象圖形化導航語言。是一種能夠方便地操做對象屬性的開源表達式語言。OGNL有以下特色: 
  3. 1、支持對象方法調用,形式如:objName.methodName(); 
  4. 2、支持類靜態的方法調用和值訪問,表達式的格式爲@[類全名(包括包路)]@[方法名|值名],例如: 
  5. @java .lang.String@format ('foo%s','bar')或@tutorial.MyConstant@APP_NAME; 
  6. 3、支持賦值操做和表達式串聯,例如: 
  7. price=100,discount=0.8,calculatePrice(),這個表達式會返回80; 
  8. 4、訪問OGNL上下文(OGNLcontext)和ActionContext; 
  9. 5、操做集合對象。 
  10.  
  11. 2、使用OGNL表達式 
  12. OGNL要結合struts標籤來使用。因爲比較靈活,也容易把人給弄暈,尤爲是「%」、「#」、「$」這三個符號的使用。因爲$普遍應用於EL中,這裏重點寫%和#符號的用法。 
  13. 1、「#」符號有三種用途: 
  14. (1)、訪問非根對象(struts中值棧爲根對象)如OGNL上下文和Action上下文,#至關於ActionContext.getContext();下表有幾個ActionContext中有用的屬性: 
  15.  
  16. 名稱 
  17. 做用 
  18. 例子 
  19.  
  20. parameters 
  21. 包含當前HTTP請求參數的Map 
  22. #parameters.id[0]做用至關於request.getParameter("id"
  23.  
  24. request 
  25. 包含當前HttpServletRequest的屬性(attribute)的Map 
  26. #request.userName至關於request.getAttribute("userName"
  27.  
  28. session 
  29. 包含當前HttpSession的屬性(attribute)的Map 
  30. #session.userName至關於session.getAttribute("userName"
  31.  
  32. application 
  33. 包含當前應用的ServletContext的屬性(attribute)的Map 
  34. #application.userName至關於application.getAttribute("userName"
  35.  
  36. 注:attr用於按request>session>application順序訪問其屬性(attribute),#attr.userName至關於按順序在以上三個範圍(scope)內讀取userName屬性,直到找到爲止。用於過濾和投影(projecting)集合,如books.{?#this.price<100};構造Map,如#{'foo1':'bar1','foo2':'bar2'}。 
  37.  
  38. (2)、用於過濾和投影(projecting)集合,如:books.{?#this.price>35
  39. books.{?#this.price>35
  40. (3)、構造Map,如:#{'foo1':'bar1','foo2':'bar2'
  41. #{'foo1':'bar1','foo2':'bar2'}這種方式經常使用在給radio或select、checkbox等標籤賦值上。若是要在頁面中取一個map的值能夠這樣寫: 
  42. <s:propertyvalue="#myMap['foo1']"/> 
  43. <s:propertyvalue="#myMap['foo1']"/> 
  44. 2、「%」符號的用途是在標籤的屬性值被理解爲字符串類型時,告訴執行環境%{}裏的是OGNL表達式。 
  45. 這是一開始最讓我不能理解的符號,緣由是一些相關資源在表述時不太準備,通過一翻痛苦的探索,終於明白了它的用途。實際上就是讓被理解爲字符串的表達式,被真正當成ognl來執行。頗有點相似javascript裏面的eval_r()功能,例如: 
  46. varoDiv=eval_r("document.all.div"+index) 
  47. varoDiv=eval_r("document.all.div"+index) 
  48. 當index變量爲1時,語句就會被看成varoDiv=document.all.div1varoDiv=document.all.div1來執行。%{}就是起這個做用。舉例: 
  49. <s:setname="myMap" value="#{'key1':'value1','key2':'value2'}"/> 
  50. <s:propertyvalue="#myMap['key1']"/> 
  51. <s:urlvalue="#myMap['key1']" /> 
  52. <s:setname="myMap" value="#{'key1':'value1','key2':'value2'}"/> 
  53. <s:propertyvalue="#myMap['key1']"/> 
  54. <s:urlvalue="#myMap['key1']"/> 
  55. 上面的代碼第2行會在頁面上輸出「value1」,而第3行則會輸出"#myMap['key1']"這麼一個字符串。若是將第3行改寫成這樣: 
  56. <s:urlvalue="%{#myMap['key1']}"/> 
  57. <s:urlvalue="%{#myMap['key1']}"/> 
  58. 則輸出爲「value1」。 
  59.  
  60.  
  61. 這說明struts2裏不一樣的標籤對ognl的表達式的理解是不同的。若是當有的標籤「看不懂」相似「#myMap['key1']」的語句時,就要用%{}來把這括進去,「翻譯」一下了。 
  62. 3、「$」有兩種用途 
  63. (1)、在國際化資源文件中,引用OGNL表達式。 
  64. (2)、在Struts2配置文件中,引用OGNL表達式: 
  65. <actionname="saveUser" class="userAction" method="save"
  66. <resulttype="redirect">listUser.action?msg=${msg}</result> 
  67. </action> 
  68. <actionname="saveUser" class="userAction" method="save"
  69. <resulttype="redirect">listUser.action?msg=${msg}</result> 
  70. </action>
相關文章
相關標籤/搜索