struts2 OGNL详细操作(#,%,$)
<?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配置文件
?
附件:尚学堂的例子
?
?