ActionContext.getContext().put("test1", "abcValue");
为什么 s:property value="#request.test1" 也能获取到值
我一直以为只能这样 s:property value="#test1"
s:property value="#request.test1"
这个test1存在的地方有三个
1、request域里 变量名为 test1
2、valueStack里,属性名为 test1
3、StackContext里。 key=test1
如果 2中为空, 3中不为空 ,则取 3
等价于((Map)ActionContext.getContext().get("request")).get("test1")
之所以test1这个变量可以存在于三地方,是由于:
由于struts拦截了request.getAttribute()方法并重新实现了它,如果HttpServletRequest没有我们要的属性,
就从valuestack中找,还没有最后从StackContext中找我们Put的对象 .
ValueStack 值栈
StackContext 栈上下文
StackContext里也有ValueStack把valueStack设为了根对象,放到值栈。
-----------------------------------------------------------------------------------------
StackContext里的request里也存放了ValueStack.
所以,如果我往值栈里放一个东西,那么它发挥作用的范围应该与request里的一样。
所以用户登入的信息不能放到action里。放到action里跟放到request里一样。
action里的属性能放入值栈中,一定要保证该属性有setXX()方法。
-----------------------------------------------------------------------------------------
ActionContext.getContext().get("request") 得到的是一个Object
ActionContext.getContext().getSession() 得到的是一个Map()
所以
ActionContext.getContext().get("request").get("test1")要强制转化一下
((Map)ActionContext.getContext().get("request")).get("test1")
而
ActionContext.getContext().getSession().get("test2")不用。