OGNL表达式总结

        OGNL全称是"Object-Graph Navigation Language" ,意思是图对象导航语言,它是一个功能强大的表达式语言。它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,并能够遍历整个对象的结构图,实现对象属性字段的类型转化。

       struts2默认的表达式语言是OGNL。

一、访问普通方法、属性、构造方法

<!-- 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. 访问静态属性

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

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

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

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

三、访问集合元素

1. 访问List对象

<s:property value="userlist"/>

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

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

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

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

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

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

<!-- 第二种方法 -->
<s:property value="userlist[0].age"/>

5. 访问Set对象

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

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

6. 访问Map对象

<s:property value="userMap"/>

7. 访问Map中某个元素

<!-- 第一种方式 -->
<s:property value="userMap.user1"/> 

<!-- 第二种方式 -->
<s:property value="userMap['user1']"/> |  <s:property value="userMap[\"user1\"]"/>

8. 访问Map中所有的key

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

10. 访问容器的大小

<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. 过滤集合

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

    2. 投影集合

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


    附注:

    %{ }的用法:

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

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

    ${ }的用法:

    ${ }主要用于两方面:

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

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

    <action name="save" class="userAction" method="save">       
        <result type="redirect">listUser.action?msg=${msg}</result>   
    </action> 

    本文参考自:马士兵Struts2-OGNL视频教程

  • 你可能感兴趣的:(OGNL表达式总结)