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

来源:互联网 发布:windows vnc客户端 编辑:程序博客网 时间:2024/05/29 13:19

  在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里的截图。



阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电压低风扇转不动怎么办 小孩不配合康复锻炼怎么办 跑步机安全开关脱落怎么办 办健身卡贵了怎么办 跑步机安全锁丢了怎么办 老公的腿老是疼怎么办 跑步机钥匙丢了怎么办 跑步机磁铁丢了怎么办 瑜伽拉筋拉伤了怎么办康复 大腿拉筋拉伤了怎么办 肚子饿的咕咕叫怎么办 手表折叠扣松了怎么办? 手表链扣松了怎么办? 原车挡泥板碎了怎么办 车检通不过的车怎么办 车子被轻微刮了怎么办 车龙门架弯了怎么办 材料合格工地非说不合格怎么办 汽车翼子板撞过弄好缝隙大怎么办 手表秒针摔掉了怎么办 元征升降机泄压怎么办 自拍杆的杆子往下下滑怎么办 小狗被车压了一下拉血怎么办 有鬼给你磕头让你不好怎么办 腿又粗又短怎么办 腿又短又粗怎么办 因跑步小腿变粗怎么办 健身后小腿变粗怎么办 打非洲鼓打的手疼怎么办 无塔供水压力小怎么办 家用增压水塔压力不稳定怎么办 蝴蝶耳堵比较紧怎么办 跑步机踏板坏了怎么办 遥控器电池没电了怎么办 空调遥控器电池没电了怎么办 想要自慰家里没有情趣用品怎么办 对政协提案的答复有意见怎么办 邻居在自建房养殖鳖怎么办 江桥全民健身卡怎么办 南翔全民健身卡怎么办 椭圆机皮带断了怎么办