1关于值栈
1)在项目时,我们用${productName}来读取ProductName的值,实际上该属性并不是在request等域对象中,而是从值栈中获取到的
2.valueStack
1)可以在ActionContext中获取值栈对象
2)值栈可以分为两个逻辑部分
>Map栈:实际上就是OGNLContext类型,也就是一个Map,也是对ActonContext的一个引用里边保存着各种Map对象;
例如requestMap,sessionMap,applicationMap,parameterMap,attr等对象,这些跟Servlet对象差不多,
>对象栈:就是真正存好信息的对象栈,实际上就是CompoundRoot类型,是一个使用ArrayList定义的栈,里边保存着各种和当前Action实例相关的对象
是一个真正意义上的栈,保存的信息:action 中的属性
2.....Struts2利用s:property标签和OGNL表达式来读取值栈中的属性值
1)...值栈中的属性值
>对于对象栈:对象栈中某一个对象的属性值
>Map栈:request,Session,application,attr的一个属性值或一个请求参数的值,attr可以引用访问其他各种对象,例如list,Map
2)..读取对象栈中的对象属性:
>若想访问 Object Stack 里的某个对象的属性. 可以使用以下几种形式之一:
Object.PropertyName,Object[‘propertyName‘] ,object["propertyName"]
>ObjectStack 里的对象可以通过一个从零开始的下标来引用. ObjectStack 里的栈顶对象可以用 [0] 来引用,
它下面的那个对象可以用 [1] 引用. 若希望返回栈顶对象的 message 属性值:
[0].message 或 [0][“message”] 或 [0][‘message’]
>若在指定的对象里没有找到指定的属性, 则到指定对象的下一个对象里继续搜索. 即 [n] 的含义是从第 n 个开始搜索,
而不是只搜索第 n 个对象
>若从栈顶对象开始搜索, 则可以省略下标部分
例如打印productName的属性值:${productName}
>结合s:property标签(可以打印对应属性的值):<s:property value="productName"/>等同于<s:property value="[0].productName"/>
3)默认的情况下,Action对象会被Struts2自动的放到值栈的栈顶
2读取Map栈的属性的值
在属性名称面前添加#号就可以访问:例如 访问ProductName > <s:property value=" #session.Product.ProductName"/>
2 Struts2会自动的把Action对象放入值栈中
1)放入的时间为:当Action终将调用Action类的Action方法之前,具体的实现过程如下;
>先创建一个Struts2 Actionproxy对象
>在创建StrutsActionproxy之后,对其进行初始化时,把Action对象放入值栈中
2)个人理解:
【每次发生一个Action请求时,并不是把立刻跳到相应的Action中,而是先生成一Action实例,把Action实例的属性都放入值栈中,
此时放入值栈的Action对象的属性还是没有赋值的只是默认值,然后当执行到Action相对应的方法时,会自动的把属性和Action请求信息中的属性一一匹配】
(可以在值栈放入Action之前进行调试,了解全过程CompoundRoot的add()方法设置断点)
就是存放action的堆栈,当我们提交一个请求道服务器端 action时,就有个堆栈,如果action在服务器端进行跳转,所有action共用一个堆栈,当需要保存在action中的数据时,首先从栈顶开始 搜索,若找到相同的属性名(与要获得的数据的属性名相同)时,即将值取出,但这种情况可能出现找到的值不是我们想要的值,那么解决此问题需要用TOP语法 和N语法来进行解决。
当在客服端进行跳转时,当有请求提交到服务器的action时,只有一个堆栈存在,堆栈中存放的是当前的请求的action,而原来那么则销毁了
当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据。
正是因为值栈和请求的对应关系,因此值栈能保证线程安全的为每个请求提供公共的数据存取服务。
而值栈是怎样产生的呢??伴随Action请求而产生
值栈怎样获得呢?ValueStack valueStack=ActionContext.getContext().getValueStack();
原文地址:http://www.cnblogs.com/jeremy-blog/p/3990120.html