OGNL表达式的使用


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" />firendcat对象中的对象,namefirend中的属性

 

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行看到是falsestrtus2 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中某个元素属性的集合(例如userListage属性)

<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" /> dogSetaction中定义的Set

 

14.访问Set中某个元素

set是没有顺序的所以使用访问list的方法是取不到值的

这种写法没有意义也取不到值<s:propertyvalue="dogSet[1]" />

OGNL表达式,取不到值或没有值在页面是不显示的

 

15.访问Map

<s:propertyvalue="dogMap" /> dogMapaction中定义的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}" />

找到listage=1的所有属性显示在页面

<s:property value="users.{^#this.age>1}.{age}" />

找到listage>1的集合中第一个元素(因为>1的元素可能有很多个)

<s:property value="users.{$#this.age>1}.{age}" />

找到listage>1的集合中最后一个元素(因为>1的元素可能有很多个)

<s:property value="users.{$#this.age>1}.{age}==null" />

判断过滤出来的元素是否为空返回falsetrue

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值