频道栏目
首页 > 资讯 > 其他综合 > 正文

在Struts2中的ValueStack、StackContext、request之间的关系

17-10-20        来源:[db:作者]  
收藏   我要投稿

提出问题:
当我们使用ActionContext.getContext.put( , )方法时,把值放到了哪里,使用request.setAttribute( , )把值又放到了哪里。StackContext和ValueStack、request都有什么区别。

StackContext、ValueStack和request:
先看结论吧:
action的实例保存在ValueStack中。
ActionContext.getContext.put(String,Object)是把对象放到了StackContext中,这个对象跟request,session等一样,它们平起平坐,但这些都不是根对象,所以要通过#访问。
request.setAttribute(String,Object)就是把值放到request范围,而StackConext里含有request对象,所以可以通过#request.*来访问。

然后看以下Action的代码:

public class TestAction extends ActionSupport implements ServletRequestAware{  

        private String tip;  
        private HttpServletRequest request;  

        public String execute()throws Exception{  
                setTip("tip来源ValueStack");  
                ActionContext.getContext().put("tip", "tip来源StackContext");  
                request.setAttribute("tip", "tip来源Request");  

                return SUCCESS;  
        }  
        @Override  
        public void setServletRequest(HttpServletRequest request) {  
                this.request = request;  
        }  

        public String getTip() {  
                return tip;  
        }  
        public void setTip(String tip) {  
                this.tip = tip;  
        }  
} 

分别往ValueStack,StackContext和request这3个范围里放入了key一样,值不一样的数据。
然后在jsp中访问3个范围的tip:



访问ValueStack
访问StackContext
访问Request

第一行访问ValueStack里的tip
第二行访问StackContext里的tip,相当于ActionContext.getContext.get(“tip”);
第三行访问request范围的tip,相当于request.getAttribute(“tip”);


结果:
访问ValueStack tip来源ValueStack
访问StackContext tip来源StackContext
访问Request tip来源Request


在Debug中也确实可以找到ValueStack,StackContext,request里分别对应的tip,就是开头的结论。
ValueStack可以看做StackContext的根对象,那接下来讨论一下StackContext和Request。

request获取StackContext里的值:
request通过request.getAttribute()是否可以获取到StackContext里的数据呢。
答案是可以。
把刚才action里的request.setAttribute(“tip”, “tip来源Request”);这句代码注释掉,也就是说不往request范围放数据。其他代码不变


然后执行结果为:
访问ValueStack tip来源ValueStack
访问StackContext tip来源StackContext
访问Request tip来源ValueStack


在request范围没有值时,获取到了ValueStack的数据。那把ValueStack里的数据也删除掉看看结果。
注释掉tip属性和方法,


执行结果为:
访问ValueStack tip来源StackContext
访问StackContext tip来源StackContext
访问Request tip来源StackContext


所以就能看出结果了。
当调用request.getAttribute()时,首先会从request范围的数据里找,然后从ValueStack里找,最后到StackContext里找。
而使用《s:property value=”tip”/》时,ValueStack里没有,会继续往StackContext里找,而不是为null.

结论 :
StackContext含有request对象。执行request的getAttribute时,首先会从曾经request范围的数据里找,然后从ValueStack里找,最后到StackContext里找。最后附上一张Debug里的截图。

这里写图片描述

相关TAG标签
上一篇:TCP滑动窗口控制流量
下一篇:Mac系统下Python开发环境搭建教程
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站