Struts2里ActionContext的put方法和request的setAttribute方法

在Servlet和jsp的交互中,使用ActionContext.getContext.put(,)方法把值放到了哪里,使用request.setAttribute(,)把值又放到了哪里。StackContext和ValueStack,request都有什么区别。对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:

<body>
        <s:debug/>
        <table>
                <tr>
                        <td>访问ValueStack</td>
                        <td><s:property value="tip"/></td>
                </tr>
                <tr>
                        <td>访问StackContext</td>
                        <td><s:property value="#tip"/></td>
                </tr>
                <tr>
                        <td>访问Request</td>
                        <td><s:property value="#request.tip"/></td>
                </tr>
        </table>
</body>
第一行访问ValueStack里的tip

第二行访问StackContext里的tip,相当于ActionContext.getContext.get("tip");

第三行访问request范围的tip,相当于request.getAttribute("tip");

结果:

访问ValueStacktip来源ValueStack
访问StackContexttip来源StackContext
访问Requesttip来源Request

在Debug中也确实可以找到ValueStack,StackContext,request里分别对应的tip,就是开头的结论。

ValueStack可以看做StackContext的根对象,那接下来讨论一下StackContext和Request。

二、request获取StackContext里的值

request通过request.getAttribute()是否可以获取到StackContext里的数据呢。

答案是可以。

把刚才action里的request.setAttribute("tip", "tip来源Request");这句代码注释掉,也就是说不往request范围放数据。其他代码不变

然后执行结果为:

访问ValueStacktip来源ValueStack
访问StackContexttip来源StackContext
访问Requesttip来源ValueStack

在request范围没有值时,获取到了ValueStack的数据。那把ValueStack里的数据也删除掉看看结果。

注释掉tip属性和方法,执行结果为:

访问ValueStacktip来源StackContext
访问StackContexttip来源StackContext
访问Requesttip来源StackContext

所以就能看出结果了。

当调用request.getAttribute()时,首先会从request范围的数据里找,然后从ValueStack里找,最后到StackContext里找。

而使用<s:property value="tip"/>时,ValueStack里没有,会继续往StackContext里找,而不是为null

三、结论

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



  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值