【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 。


 

posted @ 2012-02-23 17:41  濤叔  阅读(1034)  评论(0编辑  收藏  举报