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视频教程