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集合相同,不再重复演示。
运行结果:
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视频教程