zoukankan      html  css  js  c++  java
  • 【Struts2复习知识点十九】 OGNL

    一、使用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"/>

    View Code
    访问值栈中的action的普通属性: username = <s:property value="username"/> 
    访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%>
    访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/>
    访问值栈中对象的普通方法:<s:property value="password.length()"/>
    访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" />
    访问值栈中action的普通方法:<s:property value="m()" />
    <hr />
    访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>
    访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>
    访问Math类的静态方法:<s:property value="@@max(2,3)" />
    <hr />
    访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/>
    <hr />
    访问List:<s:property value="users"/>
    访问List中某个元素:<s:property value="users[1]"/>
    访问List中元素某个属性的集合:<s:property value="users.{age}"/>
    访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/>
    访问Set:<s:property value="dogs"/>
    访问Set中某个元素:<s:property value="dogs[1]"/>
    访问Map:<s:property value="dogMap"/>
    访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/>
    访问Map中所有的key:<s:property value="dogMap.keys"/>
    访问Map中所有的value:<s:property value="dogMap.values"/>
    访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>
    <hr />
    投影(过滤):<s:property value="users.{?#this.age==1}[0]"/>
    投影:<s:property value="users.{^#this.age>1}.{age}"/>
    投影:<s:property value="users.{$#this.age>1}.{age}"/>
    投影:<s:property value="users.{$#this.age>1}.{age} == null"/>

    <s:property value="[0].username"/> 可以访问<s:debug>ValueStack中第一个action 。


     

  • 相关阅读:
    Leetcode: Rotate Image
    Leetcode: Longest Palindromic Substring && Summary: Palindrome
    Leetcode: Reverse Nodes in k-Group
    Leetcode: Substring with Concatenation of All Words
    Leetcode: Merge k Sorted List
    Summary: Java中函数参数的传递
    Leetcode: Generate Parentheses
    超级wifi
    路由器中继(repeater)模式 和 AP+WDS模式区别?
    route 的标志位
  • 原文地址:https://www.cnblogs.com/surge/p/2365230.html
Copyright © 2011-2022 走看看