获取 ValueStack中的数据
值栈中都有什么
首先我们要明确,值栈中存的都是对象。
因为它本质就是一个List,List中只能存对象。
- 值栈中包含了我们通过调用 push 方法压栈的对象,当前执行的动作了和一个名称为
DefaultTextProvider 的类,是获取struts2的默认资源。
默认值栈中的内容如下图:
在我们不操作值栈时,默认的栈顶对象是当前执行的动作类 action
往ValueStack中压栈数据
Action类
/**
* 往 ValueStack 中压栈
* @return
*/
public String demo3(){
ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
//往ValueStack中压栈数据
valueStack.push(new User("Kato","20"));
return"demo3";
}
User类
public class User {
private String name;
private String age;
get/set()...
jsp
<body>
demo3:<a href="${pageContext.request.contextPath}/customer/demo3.action">click</a>
<hr>
取值:<s:property value="name"/>
<hr>
<s:debug></s:debug>
</body>
struts.xml
<package name="customer" extends="myDefault" namespace="/customer">
<action name="demo3" class="com.action.demoAction" method="demo3">
<result name="demo3">/demo1.jsp</result>
</action>
</package>
一般情况下,我们都是根据 debug标签中显示的Property Name 来获取Property Value。
当然我们也可以获取栈顶对象
获取数据
使用Struts2标签,根据Property Name获取Property Value
使用OGNL的表达式
<%--
取出值栈中的值需要用到Struts2的标签,value中写的是ognl表达式,表达式前面不需要加#号
--%>
<s:property value="name"/><br>
<%--
获取指定索引的数据
--%>
<s:property value="[1].name"/><br>
<%--取到的是栈顶的数据 --%>
<s:property/>
<hr>
- 如果是获取ContextMap的集合数据,表达式前面就要加#号,获取ValueStack的数据不需要加#号
- 如果获取的Property Name同名,可以通过索引获取
- 直接使用获取的是栈顶的数据
在Action类中的方法名尽量不要有get/set
struts2框架会自动加载Action类中含有get/set名字的方法到ValueStack中