OGNL - Object graph Navigation Language(对象图导航语言)
OGNL表达式:
<s:property value="userName"/>
ONGL表达式指的是 value="userName"部分,外部是S标签
1.访问值栈中的普通属性和对象型属性
action中定义成员变量或对象
JSP页面取值
<s:propertyvalue="userName" />成员变量
<s:propertyvalue="use.age" />对象
action中的对象只有在url传值了才会被实例化,否则为null。
bean没有构造方法,会调用默认构造方法,如果有多个构造方法,至少有一个无参空构造方法,否则action会实例化异常,因为它不知道该调用哪个构造方法
2.访问值栈中对象中的对象属性
在一个bean中用另一个bean作为成员变量,在JSP中用OGNL调用这个bean成员变量
<s:propertyvalue="cat.firend.name" />firend是cat对象中的对象,name是firend中的属性
3.访问值栈属性的普通方法
比如一个string类型有length方法获取长度,那么就可以通过
<s:propertyvalue="userName.length()" />来在JSP页面显示这个属性的长度
4.访问值栈对象的普通方法
<s:property value="cat.miaomiao()"/>
5.访问值栈Action普通方法
action中的方法,有返回值显示,没有什么不显示
<s:propertyvalue="actionMethod()" />直接写action中的方法名字加括号即可
6.访问静态方法
Struts2 2.0版本可以直接使用,2.1以后要在struts.xml中配置开启允许访问静态方法
<constantname="struts.ognl.allowStaticMethodAccess" value="true">
可以在WEB-INF\lib\struts2-core-2.3.4.jar\org.apache.struts2\default.properties
198行看到是false(strtus2 2.3.4)
<s:property value="@strtus2.ognl_2000.DTO.StaticDTO@staticMethod()"/>
6.访问静态属性
配置同上,写法:
<s:property value="@strtus2.ognl_2000.DTO.StaticDTO@STR" />
7.访问Math类静态方法
不常用
<s:propertyvalue="@@max(2, 3)" /> 求最大值
8.访问普通类构造方法
<s:property value="newstrtus2.ognl_2000.DTO.User(8)" />
9.访问List
<s:property value="userList" />
10.访问List中某个元素(例如访问第二个)
<s:propertyvalue="userList[1]" /> 数组和list访问方式一样
11.访问List中某个元素属性的集合(例如userList的age属性)
<s:property value="userList.{age}" />
12.访问List中指定属性的属性(例如userList[0]中的age属性)
<s:propertyvalue="userList[0].age" /> 常用写法
或:
<s:propertyvalue="userList.{age}[0]" /> 不常用写法
13.访问Set(和访问list一样)
<s:propertyvalue="dogSet" /> dogSet是action中定义的Set
14.访问Set中某个元素
set是没有顺序的所以使用访问list的方法是取不到值的
这种写法没有意义也取不到值<s:propertyvalue="dogSet[1]" />
OGNL表达式,取不到值或没有值在页面是不显示的
15.访问Map
<s:propertyvalue="dogMap" /> dogMap是action中定义的Map
16.访问Map中某个元素
三种写法:
<s:propertyvalue="dogMap.dog1" /> | 直接.key(常用) |
<s:propertyvalue="dogMap['dog1']" /> | 中括号单引号key |
<s:propertyvalue="dogMap[/"dog1/"]" /> | 中括号转义字符使用双引号key |
17.访问Map中所有KEY
<s:property value="dogMap.keys" />
18.访问Map中所有value
<s:property value="dogMap.values" />
19.访问容器的大小
<s:property value="dogMap.size" />
<s:property value="dogSet.size" />
<s:property value="userList.size" />
注意.size可以写成.size()或直接.size都可以
20.投影(过滤)
过滤条件使用的是正则表达式
只有?# ^# $#三种
正则表达式补充: ^代表开头 $代表结尾 ?代表过滤条件
例如:
<s:property value="users.{?#this.age==1}.{age}" /> | 找到list中age=1的所有属性显示在页面 |
<s:property value="users.{^#this.age>1}.{age}" /> | 找到list中age>1的集合中第一个元素(因为>1的元素可能有很多个) |
<s:property value="users.{$#this.age>1}.{age}" /> | 找到list中age>1的集合中最后一个元素(因为>1的元素可能有很多个) |
<s:property value="users.{$#this.age>1}.{age}==null" /> | 判断过滤出来的元素是否为空返回false或true |
20.[]访问对象
<s:property value="[0].userName" />
直接使用[]访问的是value stack内容,可以今页面debug查看,[0]是从valueStack中的第一个对象循环到最后一个对象,如果.元素,那么会
找到第一个符合条件的元素显示
21.iteator迭代器
假定实体Student有属性 主键:id,姓名:name;后台action中有类型为List<Student>的多个学生集合属性 list; 现在要在前台列表页中循环输出后台这个学生list.
代码如下:
<s:iterator var="student" value="list" status="i" id="model">
<!-- 序号 从1开始 -->
<td><s:property value="#i.index+1" /></td>
<!-- id编号 -->
<td><s:property value="id" /></td>
<!-- id姓名 -->
<td><s:property value="name" /></td>
</s:iterator>
或
<s:iterator var="student" value="list" status="i" id="model">
<!-- 序号 从1开始 -->
<td><s:property value="#i.index+1" /></td>
<!-- id编号 -->
<td>${model.id}</td>
<!-- id姓名 -->
<td>${model.nea}</td>
</s:iterator>
或
<s:iterator var="student" value="list" status="i">
<!-- 序号 从1开始 -->
<td><s:property value="#i.index+1" /></td>
<!-- id编号 -->
<td><s:property value="#sutdent.id" /></td>
<!-- id姓名 -->
<td><s:property value="#student.name" /></td>
</s:iterator>
补充:
关于什么时候value stack中有两个action
在使用chain方式(服务器端跳转)的时候,会出现两个action。