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里的截图。
- Struts2——ActionContext的put方法和request的setAttribute方法
- Struts2里ActionContext的put方法和request的setAttribute方法
- struts2中关于ActionContext.put()方法
- JSP中request.setAttribute()和session.setAttribute()两个方法的区别
- ActionContext.getContext().getSession().put("user", getUsername()); request.setAttribute("username
- request.setAttribute()和request.getAttribute()方法
- Java中Integer类的方法和request的setAttribute方法的使用与理解
- request.setAttribute()和request.getSession().setAttribute()的区别
- request.getSession().setAttribute 和request.setAttribute的区别
- request.getSession().setAttribute("",..)和request.setAttribute("",...)的区别
- struts2 获取request和response的方法
- setAttribute和setParameter方法的区别
- setAttribute和setParameter方法的区别
- setAttribute和setParameter方法的区别
- setAttribute和setParameter方法的区别
- setAttribute和setParameter方法的区别
- setAttribute和setParameter方法的区别 (2)
- setAttribute和setParameter方法的区别
- Java 包(package)
- 设计模式1——简单工厂
- SharedPreferences
- log4j使用
- DataInputStream 和 DataOutputStream 数据的字节输入流和字节输出流
- Struts2——ActionContext的put方法和request的setAttribute方法
- 内存管理第一篇--HotSpotVM-内存管理介绍
- leetcode 651. 4 Keys Keyboard
- laravel5.4开启sql调试
- HDU6058Kanade's sum(思维+链表模拟)
- easyui Datebox日期框组件的使用
- 如何写好一份技术应聘简历
- MySQL [Err] 1093
- javaseday11(包,多线程)