• Struts(21)OGNL具体解释


    Struts2 中内置了OGNL表达式的支持,使得Struts2的具有比Struts1更为强大的数据訪问的功能。本文主要解说OGNL的用法。并不会去解说一些原理性的东西。想要了解的朋友能够自己去查阅相关的资料

         在OGNL的使用主要分下面部分来解说:1.使用OGNL訪问对象(不同范围的取值)

                                           2.OGNL的集合操作(OGNL元素符,以及过滤和投影功能)

                                           3.OGNL訪问静态成员(怎么訪问静态成员)

                                           4. lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结(在总结之后会具体解释Struts2的标签的使用)

    一、使用OGNL訪问对象

       1 读取struts2中的ValueStack中的值

         struts2中引入了ValueStack的概念,在struts2中默认使用ValueStack作为OGNL的StackContext的根元素

       OGNL在读取根元素的时候能够直接进行读取

         如果action中有

         private Cat cat;  private Dog dog; 俩个对象。那么在jsp页面读取方法就是

        <s:property value="cat.name"/>  读取Cat的name属性的值

        <s:property value="dog.name"/>  读取Dog的name属性值

       2 使用#读取parameters  request  session  application 范围内的值()
         <s:property value="#request.id"/>  相当于 request.getAttribute("id")

         <s:property value="#parameters.id"/>  相当于 request.getParameter("id")

         <s:property value="#session.id"/>  相当于 session.getAttribute("id")

         <s:property value="#application.id"/>  相当于 application.getAttribute("id")

         <s:property value="#attr.id"/>   依次搜索PageContext HttpServletRequest   HttpSession  ServletContext 范围 ,查找属性。找到为止
    二、OGNL的集合操作

       1 创建一个集合

        {e1,e2,e3} 直接创建一个List类型的集合

        #{Key1:Value1,Key2:Value2} 构建一个Map类型的集合

        使用: <s:set name="sex" value="#{'1':'男'。'2':'女'}"/>

             <s:property value="#sex[id]"/>  在ValueStack范围内找到id的值。 并用它作为key去查找相应的

                                             value 并显示出来   

       2 OGNL元素符 

         对于集合。OGNL提供了两个元素符:in和not in。当中in推断某个元素是否在指定集合中。not in则用于

        推断某个元素是否不在指定集合中。

        推断一个对象是否在List内存在:

       <s:if test="'foo' in {'foo','bar'}">
    
          muhahaha
    
       </s:if>
    
       <s:else>
    
          boo
    
       </s:else>
    
     
    
       <s:if test="'foo' not in {'foo','bar'}">
    
          muhahaha
    
       </s:if>
    
       <s:else>
    
          boo
    
       </s:else>
    


     

     

       3 过滤与投影集合

         如果有一个books的List集合存在于ValueStack中。存放了多个Book类型的对象

          我们能够通过这样进行过滤取值

         <s:iterator value="books.{?#this.price>35}"> 这样仅仅会取到价格大于35的书籍,非常好的起到了过滤的

         作用,

         ?取出全部符合逻辑的元素

         ^ 取出符合逻辑的第一个元素

         $ 取出符合逻辑的最后一个元素

    三、OGNL訪问静态成员

        在实际的开发中像页面的參数传递是绝对拒绝使用硬编码的,最好的解决方案有2种:一种是写在国际化配置文件里。另外的一种就是建立一个类,专门维护静态成员。全部硬编码的地方都调用它就能够了。

        struts2 中默认提供了一些訪问静态成员的方式,可是默认是关闭的,所以应该在struts2的配置文件里先设置

       <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

       设置之后就能够用下面的表达式来訪问静态成员了。

      1 訪问静态方法

         <s:property value="@com.netsdar.song.manager.util.AppUtil@getName()"/>

      2 訪问静态常量

         <s:property value="@com.netsdar.song.manager.util.AppUtil@Index_Title"/>

    四、lambda表达式,在OGNL中使用一些简单的函数以及OGNL总结

       1 lambda表达式

         这个表达式,我事实上也非常少去用。这里给大家拿个样例解说一下吧

         <s:property value="#conv =:[#this==1?

    '男':#this==2?'女':''], #conv(1)" />

         这句的作用就是,value="#conv =:   定义一个函数 conv

         [#this==1?'男'       定义 conv(1)=男

         #this==2?

    '女'        定义 conv(2)=女

         当然这个仅仅是一个简单的样例,这里支持复杂的函数运算。对于一些简单的逻辑更推荐使用struts2的标签来处理。复杂点的不做具体解说。引用别人的一个样例

       

    比如:

    Fibonacci:

    if n==0 return 0;

    elseif n==1 return 1;

    else return fib(n-2)+fib(n-1);

    fib(0) = 0

    fib(1) = 1

    fib(11) = 89

     

    OGNLLambda表达式怎样工作呢?

    Lambda表达式必须放在方括号内部,#this表示表达式的參数。比如:

    <s:property value="#fib =:[#this==0 ?

    0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />

     

    #fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)]定义了一个Lambda表达式,

    #fib(11) 调用了这个表达式。

       2 总结

         这里主要解说一下使用注意事项

         <s:url value="#foobar['foo1']">   如果你这样使用标签 ,那么它绝对不会是你想要的,它会依照你的

                                           输入原样的输出的  #foobar['foo1']

        正确的使用:   <s:url value="%{#foobar['foo1']}">   %{} 用于对括号内用ognl求值

        struts2的action,大家都习惯了生成get与set方法,事实上新版的没有这俩个方法也能插值进去的。它採用了java的反射机制来实现,只是官方还是建议依照旧的方法用。

       这一节就先到这里,本人能力有限难免会有纰漏,欢迎不吝赐教,过几天放出本人总结的struts2标签的使用。

  • 相关阅读:
    多线程 thread和Task的用法以及注意事项
    Application.DoEvents()的使用
    测试
    python-包管理工具-pip
    压缩下载文件
    如何修改Django中的日期和时间格式 DateTimeField
    Django model数据 时间格式
    模板语法
    Django框架基础-MTV模型
    view架构
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7053644.html
Copyright © 2020-2023  润新知