struts2中的ognl表达式

来源:互联网 发布:5g云网络wlxiu 编辑:程序博客网 时间:2024/05/23 13:07

1、图示


2、原理解析

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

 

OGNL的Lambda表达式如何工作呢?

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) 调用了这个表达式。



说明:由于struts2对request进行了再次封装,所以在变量集合的时候可以有如下两种方式

//第一种方式: 
<s:iterator value="#roleList">            <s:property value="id"/>            <s:property value="name"/></s:iterator>
//第二种方式 <s:iterator value="#roleList">            ${id}            ${name} </s:iterator>

原因:因为struts2对request再次封装中,当在request中找不到该参数时,struts2将到ValueStack中寻找




0 0