struts-值栈
1. 关于值栈:
- helloworld时, ${productName} 读取productName 的值,实际上该属性并不在request 等域对象中,而是从值栈中获取的
- ValueStack:
- 可以从ActionContext 中获取值栈对象
- 值栈分为两个逻辑部分
- Map栈: 实际上OgnlContext 类型,是个Map,也是对ActionContext 的一个引用,里面存放着各种Map:
- requestMap
- sessionMap
- applicationMap
- parametersMap
- attr
- 对象栈:实际上是CompindRoot 类型,是一个使用ArrayList 定义的栈。里边保存各种和当前Action 实例相关的对象,是一个数据结构意义的栈
- Map栈: 实际上OgnlContext 类型,是个Map,也是对ActionContext 的一个引用,里面存放着各种Map:
2. Struts2 利用s:property 标签和OGNL 表达式来读取值栈中的属性值
- 值栈中的属性值:
- 对于对象栈: 对象中某一个对象的属性值
- Map 栈: request, session, application 的一个属性值 货 一个请求参数的属性值
- 读取对象栈中对象的属性
- 若想访问Object Stack 里面的某一个属性,可以使用如下几种形式之一:
- object.propertyName
- object['propertyName']
- object["propertyName"]
- ObjectStack 里面的对象可以通过一个从零开始的下标来引用。ObjectStack 里面的栈顶对象可以用[0] 来引用,它下面的的那个对象可以用[1] 引用
- 若想访问Object Stack 里面的某一个属性,可以使用如下几种形式之一:
[0].message
-
- [n] 的含义是从第n 个开始搜索,而不是只搜索n个对象
- 若从栈顶对象开始搜索,则可以省略下标部分:message
- 结合s:property 标签:<s:property value="[0].message" /> <s:property value="message" />(通常情况下采用这种方式)
3. 默认情况下, Action 对象会被Struts2 自动的放到值栈的栈顶
4. Struts2 自动把Action 对象放入到值栈中
放入的时间点为:struts2 终将调用Action 类的Action 方法。但在调用该方法之前:
- 先创建一个StrutsActionProxy 对象
- 在创建StrutsActionProxy 之后,对其进行初始化时,把Action对象放入了值栈中。