OGNL的4种符号用法
(1)# (表示总的数据中心,用来获取域对象的值 如:request域对象:<s:properties value="#.request.username")/> ;
>>访问ActionContext数据中心和值栈
Action与ValueStack是一一对应的,当Action创建后,会创建对应的ValueStack,然后将该ValueStack
绑定到request域对象中,因此,可能在转发的情况下,才能取得ValueStack中的数据。
ValueStack的内部结构图,参见<<>>
访问获取值栈的代码如下:
//获取值栈
ValueStack vs=ActionContext.getContext().getValueStack();
//向值栈中绑定值
vs.set("role","管理员");
struts2的数据中心-----ActionContext/ServletActionContext
Action的数据中心------ValueStack,因为Action中的所有数据都位于值栈中
attr.username按如下顺序查询:(attr作用是查询对象的)
page->request->valuestack(默认)->session->application,找到即止,找不到返回空串,面不是null
>>访问集合List
A)集合的投影:userList.{username}
<%
List<User> list=new ArrayList<User>();
list.add(new User("张三","123456",23));
list.add(new User("王五","124456",24));
list.add(new User("李四","123455",25));
list.add(new User("小六","153456",26));
pageContext.setAttribute("list",list);
%>
<table align="center" border="2">
<caption><h4>用户列表1</h4></caption>
<s:iterator var="username" value="#attr.list.{?#this.age>=25}">
<tr>
<td>
<s:property value="username" /> <br/>
</td>
</tr>
</s:iterator>
</table>
B)集合的过滤:userList.{?#this.age>22}或userList.{^#this.age>22}或
userList.{$#this.age>22}.{?#this.gender=="男"}
?#表示所有对象
^#表示第一个对象
$#表示最后一个对象
this表示当前迭代的这个对象
C)集合的投影和过滤:userList.{?#this.age>22}[0]
[0]表示符合条件的第一个对象
[1]表示符合条件的第二个对象
>>访问集合Map:#{'male':'[男]','female':'[女]'}这种方式常用在给radio 或select,checkbox等标签赋值上
Action中的Map属性:
private Map map;
public Map getMap(){
return map;
}
public String excute(){
Map<String,String> map=new HashMap<String,String>();
map.put("male","男");
map.put("femal","女");
ActionContext.getContext().getValueStack().set("map",map);
return "success";
}
在jsp中的代码
//从值栈中到得map数据 这里是从键与值来取得相应的键值
<s:iterator value="map"> 或<s:iterator var="entry" value="map"/>
<s:property value="key"/> 或<s:property value="#entry.key/> //这里的#是因为需要把entry看作一个
javaBean来看
<s:property value="value"/> 或<s:property value="#entry.key"/>
</s:iterator>
#的作法
A)访问非ValueStack中的数据
B)访问JavaBean的某个属性
(2)% 符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
%{}:
>><s:textfield label="%{usernameTIP变量}" name="username"/>
>><s:textfield label="%{'usernameTIP'常量}" name="username"/>
(3)${}不是EL:
>><field-validator type="double">
<param name="minInclusive">4000</param>
<param name=" maxInclusive">6000</param>
<message>薪水必须介于${minInclusive}到${maxInclusive}之间</message>
</field-validator>
>><param name="contentDisposition">attachment;filename=${filename}</param>
(4) 访问集合List或{}
>>value='{"AbA","BbB","CbC","DbD"}'
>><s:property value="stringList.isEmpty"/>
>><s:property value="stringList.size"/>