• 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> 

  • 相关阅读:
    日志文件压缩
    Exchange2010 部署
    预读取页面 Prefetching pages
    利用Response的WriteFile方法输出一些文件
    事务记录工作中遇到的问题
    Orchard源码分析(7.1):Routing(路由)相关
    关于挑库规则的问题
    Oracle认证考试:EBS模块中文名称及英文缩写
    Oracle EBS 实施方法论扫盲:都有哪些实施方法论
    [二次开发] EBS R12 探索之路【EBS 经典SQL分享】
  • 原文地址:https://www.cnblogs.com/elikew/p/3424308.html
Copyright © 2020-2023  润新知