值栈(ValueStack)是ActionContext中的一个对象。存放的数据是Action对象。我们可以使用<s:debug/>
查看context对象中的值
OGNL表达式
- OGNL查询是在根对象(Struts2的跟对象是ValueStack)查询
- 由于Action对象存在ValueStack中,因此Action中的所有属性可以通过OGNL直接读取到
- 除了ValueStack中的值,其他ActionContext的内容需要增加#来标识,告诉OGNL不要在根对象中查找,而在其他上下文中寻找相关值
- attr对象,依次从pageContext,request,session,application中寻找属性
使用OGNL
public class Test {
public static void main(String[] args) throws OgnlException {
Map<String,Object> map=new HashMap<String,Object>();
map.put("name", "张三");
map.put("age", 125);
User user=new User();
user.setName("李四");
Object obj=Ognl.getValue("#name",map,user);
System.out.println(obj);//输出张三
Object obj1=Ognl.getValue("name",map,user);
System.out.println(obj1);//输出李四
}
}
看上述案例,跟博主讲的OGNL查询一样。首先,ognl方法是
这也是最常用的
Ognl.getValue(expression, context, root)
上述根对象我们取为user,所以当expression有#号取的是map里面的,即张三,没有说明取根对象里面,即李四
(一般把小数据作为常用的直接取,大数据作为不常用的用#取)
struts2使用ognl表达式是通过struts2的标签来取的
struts2把值栈作为根对象
在jsp中先导入struts2的标签库
<%@taglib prefix="s" uri="/struts-tags" %>
注意:使用标签是需要通过struts2的过滤器来启动的,如果过滤器配置为*.action,不能直接访问.jsp页面。需要.action跳转标签才能使用。(也就是说,jsp用到了标签取数据,按道理说取不到应该输出null,但是.过滤器这样配置直接访问.jsp没有通过过滤器会报错)
<%--不用表达式 <body>
用户名:${sessionScope.user }-----------------<a href="logout.action">退出</a>
</body> --%>
<!-- 用OGNL表达式 -->
<body>
用户名:<s:property value="name"/>action值栈的属性
用户名:<s:property value="#session.user"/>-----------------<a href="logout.action">退出</a>
</body>
结论:使用OGNL访问action中的属性时,可以直接访问,访问actionContext中的数据时,需要加#
其实我们也可以得到值栈,但是强烈不建议去动值栈
ValueStack vs=ActionContext.getContext().getValueStack(); System.out.println("name="+vs.findString("name"));
查找还好说,但是如果push进一个已经存在的键,那么后面键对应的值就会覆盖前面的,如果要取到前面的,那么就要在value里指定第几个(最上面也就是最后面的是0,就是栈的特性)
如:
ValueStack vs=ActionContext.getContext().getValueStack();
System.out.println("name="+vs.findString("name"));
User user=new User();
user.setName("s");
vs.push(user);
//第二个
用户名:<s:property value="[1].name"/>
标签
除了上述的,常用的还有两个
(1)Iterator
jstl的foreach
<c:foreach item=${list} var="bean">
<tr>
<td>${bean.id}</td>
利用Struts2的标签Iterator代替foreach
<s:iterator value="list">
<tr>
<td><s:property value="id"/></td>
或者
<s:iterator value="list" var="bean">
<tr>
<td><s:property value="#bean.id"/></td>
(2)if标签
<s:if test=""></s:if>
还有else和elseif标签,这是原来jstl没有的,jstl只有if
当然还有<s:debug/>
查看ActionContext的值