浅谈Struts2中的ValueStack、StackContext、request

来源:互联网 发布:知乎 蓝洞 韩国 编辑:程序博客网 时间:2024/05/18 00:18

提出问题:
当我们使用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:

<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”);


结果:
访问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里的截图。

这里写图片描述

阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果6手机死机了怎么办 苹果x耗电太快怎么办 苹果6升级11.3卡怎么办 苹果6splus耗电快怎么办 苹果手机系统升级后反应慢怎么办 苹果8听筒声音小怎么办 苹果6s通话声音小怎么办 苹果手机通讯录丢失了怎么办 苹果换id通讯录没有了怎么办 华为p7 更新重启怎么办 打电话的图标没了怎么办 苹果手机wifi信号弱怎么办 没电脑想装wifi怎么办 阿巴町手表二维码丢了怎么办 儿童手表二维码丢了怎么办 电话手表二维码丢了怎么办 360儿童手表二维码丢了怎么办 喜书郎电话手表二维码丢了怎么办 微信充话费充错号码怎么办 话费冲到了副卡怎么办 冲话费冲错了怎么办 微信支付未到账怎么办 速卖通修补配件到国外怎么办 速卖通流量低怎么办 速卖通被判定重复铺货怎么办 拼多多商品降权怎么办 运满满有了差评怎么办 房贷款还清后该怎么办 身份证被偷了怎么办啊 苹果手机wifi速度慢怎么办 电脑桌面上的图标不见了怎么办 夏天手机没地方放怎么办 上班手机没地方放怎么办 京东退款未到账怎么办 京东退款失败后怎么办 在京东申请退款怎么办 微信退款没收到钱怎么办 在拼多多不发货怎么办 扫二维码群发微信骗局怎么办 电脑高清晰音频管理器打不开怎么办 吃鸡耳机有杂音怎么办