<?xml version="1.0" encoding="GB18030" ?> <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030" /> <title>OGNL表达式语言学习</title> </head> <body> <ol> <li> 访问值栈中action的普通属性: username = <s:property value="username"/> </li> <li> 访问值栈中普能对象的(get/set):<s:property value="user.age"/> | <s:property value="user['age']"/> || <s:property value="user[\"age\"]"/> <!-- 对于user对象是否由struts创建,只要你有传参给它(&user.age=10)就会自动创建,也可以在action 手动new --> <li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li> <li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li> <li>访问值栈中action的普通方法:<s:property value="m()" /></li> <li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li> <!-- 类名方法名前加@, 2.1版本的要加 constant name="struts.ognl.allowStaticMethodAccess" value="true" --> <li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li> <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li> <hr /> <li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li> <hr /> <li>访问List:<s:property value="users"/></li> <li>访问List中某个元素:<s:property value="users[1]"/></li> <li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li> <li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li> <li>访问Set:<s:property value="dogs"/></li> <li>访问Set中某个元素:<s:property value="dogs[1]"/></li> <li>访问Map:<s:property value="dogMap"/></li> <li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li> <li>访问Map中所有的key:<s:property value="dogMap.keys"/></li> <li>访问Map中所有的value:<s:property value="dogMap.values"/></li> <li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li> <hr /> <li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li> <li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li> <li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li> <li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li> <hr /> <li>[]:<s:property value="[0].username"/></li> </ol> <s:debug></s:debug> </body> </html>
下面说明一下几个关键点:"{}"符节可以看做是一个集合;?#表示过滤users.{?#this.age==1}取出来是一个集合.
^#表示第一个,$#表示最后一个,这有点像正则表达式.
<s:property value="[0].username"/>这个有点意思,在值栈中在栈顶永远是action,栈底是com.opensymphony.xwork2.DefaultTextProvider,这
样好像对我们没有多大多处啊?其实我们有时值栈可能会有多个action,这样就对我们有用了,可以起来精确定位.(在我们使用chain时存在多
个action).
使用一项技术首先要了解它的基本功能与操作: 有时我们会用到 # % $ '',下面说明一下它们各自的使用方法;
1.<s:property value="users"/> 像这个表过式value="users" 其实它已经使用了OGNL,你也可以这样写
value="%{users}",( %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用),一般可以不用就
不要用等到要用时再用,像include标签的value为string类型,这时我们就要用%强制转换成OGNL.
2."#"其实是OGNL操作actioncontext的符号,可以用这个标签<s:debug></s:debug>来查看哪些是ValueStack哪些是actionContext.
3.有时你不想用到OGNL,你可以有''来操作,例:<s:property value="'name'"/> 这样就不会使用到OGNL,只会输出name;
4.$符号用于i18n和struts配置文件
附件:尚学堂的例子