zoukankan      html  css  js  c++  java
  • OGNL表达式struts2标签“%,#,$”

    1. 一、什么是OGNL,有什么特点?   
    2.   
    3. OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。OGNL有如下特点:    
    4.   
    5. 1、支持对象方法调用,形式如:objName.methodName();   
    6.   
    7. 2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路)]@[方法名 |  值名],例如:   
    8.   
    9. @java.lang.String@format('foo %s''bar')或@tutorial.MyConstant@APP_NAME;   
    10.   
    11. 3、支持赋值操作和表达式串联,例如:   
    12.   
    13. price=100, discount=0.8, calculatePrice(),这个表达式会返回80;   
    14.   
    15. 4、访问OGNL上下文(OGNL context)和ActionContext;   
    16.   
    17. 5、操作集合对象。   
    18.   
    19.     
    20.   
    21. 二、使用OGNL表达式   
    22.   
    23. OGNL要结合struts标签来使用。由于比较灵活,也容易把人给弄晕,尤其是“%”、“#”、“$”这三个符号的使用。由于$广泛应用于EL中,这里重点写%和#符号的用法。   
    24.   
    25. 1、“#”符号有三种用途:   
    26.   
    27. (1)、访问非根对象(struts中值栈为根对象)如OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:   
    28.   
    29.     
    30.   
    31. 名称   
    32.  作用   
    33.  例子   
    34.     
    35. parameters   
    36.  包含当前HTTP请求参数的Map   
    37.  #parameters.id[0]作用相当于request.getParameter("id")    
    38.     
    39. request   
    40.  包含当前HttpServletRequest的属性(attribute)的Map   
    41.  #request.userName相当于request.getAttribute("userName")    
    42.     
    43. session   
    44.  包含当前HttpSession的属性(attribute)的Map   
    45.  #session.userName相当于session.getAttribute("userName")    
    46.     
    47. application   
    48.  包含当前应用的ServletContext的属性(attribute)的Map   
    49.  #application.userName相当于application.getAttribute("userName")    
    50.     
    51.   
    52. 注:attr 用于按request > session > application顺序访问其属性(attribute),#attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止。用于过滤和投影(projecting)集合,如books.{?#this.price<100};构造Map,如#{'foo1':'bar1''foo2':'bar2'}。   
    53.   
    54.     
    55.   
    56. (2)、用于过滤和投影(projecting)集合,如: books.{?#this.price>35}     
    57.   
    58. books.{?#this.price>35}   
    59.   
    60. (3)、构造Map,如: #{'foo1':'bar1''foo2':'bar2'}     
    61.   
    62. #{'foo1':'bar1''foo2':'bar2'}这种方式常用在给radio或select、checkbox等标签赋值上。如果要在页面中取一个map的值可以这样写:    
    63.   
    64. <s:property value="#myMap['foo1']"/>     
    65.   
    66. <s:property value="#myMap['foo1']"/>   
    67.   
    68. 2、“%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。   
    69.   
    70. 这是一开始最让我不能理解的符号,原因是一些相关资源在表述时不太准备,经过一翻痛苦的探索,终于明白了它的用途。实际上就是让被理解为字符串的表达式,被真正当成ognl来执行。很有点类似javascript里面的eval_r()功能,例如 :   
    71.   
    72. var oDiv = eval_r("document.all.div"+index)     
    73.   
    74. var oDiv = eval_r("document.all.div"+index)   
    75.   
    76. 当index变量为1时,语句就会被当作var oDiv = document.all.div1  var oDiv = document.all.div1来执行。%{}就是起这个作用。举例:    
    77.   
    78. <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>      
    79.   
    80. <s:property value="#myMap['key1']"/>      
    81.   
    82. <s:url value="#myMap['key1']" />    
    83.   
    84. <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>   
    85.   
    86. <s:property value="#myMap['key1']"/>   
    87.   
    88. <s:url value="#myMap['key1']"/>   
    89.   
    90. 上面的代码第2行会在页面上输出“value1”,而第3行则会输出"#myMap['key1']"这么一个字符串。 如果将第3行改写成这样:    
    91.   
    92. <s:url value="%{#myMap['key1']}"/>     
    93.   
    94. <s:url value="%{#myMap['key1']}"/>   
    95.   
    96. 则输出为“value1”。   
    97.   
    98.     
    99.   
    100.     
    101.   
    102. 这说明struts2里不同的标签对ognl的表达式的理解是不一样的。如果当有的标签“看不懂”类似“#myMap['key1']”的语句时,就要用%{}来把这括进去,“翻译”一下了。   
    103.   
    104. 3、“$”有两种用途   
    105.   
    106. (1)、在国际化资源文件中,引用OGNL表达式。   
    107.   
    108. (2)、在Struts 2配置文件中,引用OGNL表达式:    
    109.   
    110. <action name="saveUser" class="userAction" method="save">   
    111.   
    112. <result type="redirect">listUser.action?msg=${msg}</result>   
    113.   
    114. </action>   
    115.   
    116. <action name="saveUser" class="userAction" method="save">       
    117.   
    118. <result type="redirect">listUser.action?msg=${msg}</result>   
    119.   
    120. </action>  
  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/nucdy/p/5084892.html
Copyright © 2011-2022 走看看