Struts2 ValueStack中没有Action定义的属性
今天项目偶然间出现了一个问题,前端页面无法获取到Action传递过来的数值,经过再三确认
后台Action : ActionContext.getContext().put(“adminList”, list);
前端页面接收参数:<s:iterator value="#adminList" var="admin"> <tr><td><s:property value="#admin.user_name"/></td></tr> </s:iterator>
都是正确的,那为什么没有获取到值呢?
决定使用<s:debug></s:debug>在网页输出查看"值栈"的详细信息
找到问题所在了,Value Stack 中竟然没有action的定义属性,Stack Conetxt中也没有action传递过来的列表参数信息,当然也就无法让数据显示在网页中了。
那么Value Stack 是什么呢?
Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。
Value Stack即值栈空间
Struts2在启动时,会创建一个ValueStack对象 当用户发送请求到对应的Action时,Struts2会把当前被请求的Action01放入CompoundRoot 对象的“栈空间”栈顶,请求结束,Action01会被清除。 (当下一次另一个请求到来时,Struts2会把该请求对应的Action02放入“栈顶”) 所以,我们可以通过Ognl表达式访问CompoundRoot对象栈顶的Action。
Struts2在请求到来时,首先会创建一个ValueStack; 然后,把当前的Action对象放入栈顶(CompoundRoot); Struts2会把ValueStack存放在request中,属性为”struts.valueStack“, 所以,标记库可以访问到ValueStack Struts2的很多标记就是通过访问ValueStack获得数据的:
通过ognl从ValueStack取数据,并且显示
<s:property value=“ognl…”/>
省略value,取出ValueStack的栈顶
<s:property />
通过ognl从ValueStack取出集合,依次将集合中的对象置于栈顶,在循环中,ValueStack栈顶即为要显示的数据
我们知道从Action封装到ValueStack是由struts2框架进行的一般不会出现问题,那么问题很可能出现在请求中,于是去查看struts.xml配置文件
发现在action对结果的请求中采用 type="redirect"即重定向方法,重定向到jsp页面请求参数全部丢失,action处理结果也全部丢失。所以去掉type="redirect"即可,result默认使用type="dispatcher"跳转到jsp页面数据不会丢失。
再次查看前端页面的s:debug
action处理结果出现在值栈中,问题解决