ognl表达式

来源:互联网 发布:windows激活期限已过 编辑:程序博客网 时间:2024/06/07 06:54

  OGNL全称是"Object-Graph Navigation Language" ,意思是图对象导航语言,它是一个功能强大的表达式语言。它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,并能够遍历整个对象的结构图,实现对象属性字段的类型转化。       struts2默认的表达式语言是OGNL。在web部分,我们学过jstl,el表达式,很简单,但是在Struts2中并不能完全使用,功能不够强大。

<!-- 1. 访问值栈中action的普通属性 -->
<s:property value="username"/>

<!-- 2. 访问值栈中对象的普通属性(要有get set方法) -->
<!-- 第一种方式 -->
<s:property value="user.age"/>

<!-- 第二种方式 -->
<s:property value="user['age']"/>

<!-- 错误方法 -->
<!-- <s:property value="user[age]"/> -->

<!-- 3.调用值栈中对象的普通方法 -->
<s:property value="user.setName('master')" /> | 结果显示: <s:property value="user.name"/>  //结果为master

<!-- 4.调用值栈中action属性的方法 -->
<s:property value="username.length()"/>

<!-- 5.调用值栈中action的普通方法 -->
<s:property value="add()" />

<!-- 6.调用普通类的构造方法 -->

<s:property value="new pojo.User()"/>  //实例化一个对象


二、访问静态方法、属性

注意:在访问静态方法、静态变量之前,要先在struts2.xml中配置<constant name="struts.ognl.allowStaticMethodAccess" value="true"/> ,否则访问不到数据。

1. 访问静态属性


  1. /* 访问静态属性表达式的格式为@[类全名(包括包路径)]@[值名] */  
  2. <s:property value="@action.UserAction@index"/>  
2. 调用静态方法

  1. /* 调用静态方法表达式的格式为@[类全名(包括包路径)]@[方法名] */  
  2. <s:property value="@action.UserAction@getInstance()"/> 

3. 调用Math类的静态方法(特殊)


  1. <s:property value="@@max(2,3)" /> 

三、访问集合元素

1. 访问List对象


  1. <s:property value="userlist"/>  

2. 访问List对象中某个元素


  1. <s:property value="userlist[1]"/>  

3. 访问List中元素某个属性的集合


  1. <s:property value="userlist.{age}"/>  

4. 访问List中元素某个属性的集合中的特定值


  1. <!-- 第一种方法( 不常用 ) -->  
  2. <s:property value="userlist.{age}[0]"/>  
  3.   
  4. <!-- 第二种方法 -->  
  5. <s:property value="userlist[0].age"/>  

5. 访问Set对象


  1. <s:property value="userSet"/>  
 Set集合的访问方式与List集合类似,这里不再重复演示,但要注意的是,Set是无序的集合,所以不能获取某个特定的元素值,如下所示:

  1. <!-- 错误方法 -->  
  2. <s:property value="userSet[0]"/>  

6. 访问Map对象


  1. <s:property value="userMap"/>  

7. 访问Map中某个元素


  1. <!-- 第一种方式 -->  
  2. <s:property value="userMap.user1"/>   
  3.   
  4. <!-- 第二种方式 -->  
  5. <s:property value="userMap['user1']"/> |  <s:property value="userMap[\"user1\"]"/>  

8. 访问Map中所有的key

[
  1. <s:property value="userMap.keys"/>  
9. 访问Map中所有的value

  1. <s:property value="userMap.values"/>  

10. 访问容器的大小


  1. <s:property value="userMap.size()"/> | <s:property value="userMap.size"/>  

11. 访问数组对象

数组的访问方式与List集合相同,不再重复演示。

运行结果:

  • 访问List:[pojo.User@32c9fc, pojo.User@6ad402, pojo.User@184dee7]
  • 访问List中某个元素:pojo.User@6ad402
  • 访问List中元素某个属性的集合:[23.0, 45.0, 67.0] 访问List中元素某个属性的集合中的特定值:23.0
  • 访问Set:[pojo.User@184dee7, pojo.User@6ad402, pojo.User@32c9fc]
  • 访问Map:{user2=pojo.User@6ad402, user1=pojo.User@32c9fc, user3=pojo.User@184dee7}
  • 访问Map中某个元素:pojo.User@32c9fc | pojo.User@32c9fc | pojo.User@32c9fc
  • 访问Map中所有的key:[user2, user1, user3]
  • 访问Map中所有的value:[pojo.User@6ad402, pojo.User@32c9fc, pojo.User@184dee7]
  • 访问容器的大小:3 | 3


  • 四、投影与过滤

    1. 过滤集合


    1. <!-- <span class="comment">OGNL过滤集合的语法为:collection.{? expression}</span> -->   //?表示的过滤  
    2. <s:property value="userlist.{?#this.age>1}"/>  //获取到的是age>1的对象集合  

    2. 投影集合


    1. <!-- OGNL投影集合的语法为:collection.{expression} -->  
    2. <s:property value="userlist.{^#this.age>1}.{age}"/>  //获取到满足age>1集合的第一个对象的age  
    3.   
    4. <s:property value="userlist.{$#this.age>1}.{age}"/>  //获取到满足age>1集合的最后一个对象的age   


    附注:

    %{ }的用法:

    %{ }的主要作用就是告诉标签的处理类将它包含的字符串按照OGNL表达式处理,这个类似js中的eval。举个例子:

    1. <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/>  
    2. <s:property value="#myMap['key1']"/>   //输出的是value1  
    3. <s:url value="#myMap['key1']" />      //输出的是#myMap['key1']  
    4. <s:url value="%{#myMap['key1']}"/>    //输出的是value1  

    ${ }的用法:

    ${ }主要用于两方面:

    (1)用于国际化资源文件中。

    (2)用于Struts 2配置文件中。

    [java] view plain copy
    1. <action name="save" class="userAction" method="save">         
    2.     <result type="redirect">listUser.action?msg=${msg}</result>     
    3. </action>  





    0 0