一、ValueStack
1.ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个 ValueStack对象). 相当于一个数据的中转站.
在其中保存当前Action 对象和其他相关对象.
2.Struts 框架把 ValueStack对象保存在名为“struts.valueStack” 的请求属性中
3.在 ValueStack 对象的内部有两个逻辑部分:
- ObjectStack:实际上是CompoundRoot类型,是一个使用ArrayList定义的栈。Struts 把 Action 和相关对象压入 ObjectStack 中。是一个数据结构意义的栈。
- ContextMap:实际上是OgnlContext类型,是个Map,也是对 ActionContext 的一个引用。Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中。。
Struts 会把下面这些映射压入 ContextMap中
- parameters: 该 Map 中包含当前请求的请求参数
- request: 该 Map 中包含当前 request对象中的所有属性
- session: 该 Map 中包含当前 session 对象中的所有属性
- application:该 Map 中包含当前 application 对象中的所有属性
- attr: 该 Map 按如下顺序来检索某个属性: request, session, application
默认情况下,Action对象会被struts2 自动的放到值栈的顶端
二、OGNL
在 JSP 页面上可以可以利用OGNL(Object-Graph Navigation Language: 对象-图导航语言) 访问到值栈(ValueStack)里的对象属性.
若希望访问值栈中ContextMap 中的数据, 需要给 OGNL 表达式加上一个前缀字符#.
例如<s:property value="#session.user.username">
如果没有前缀字符 #, 搜索将在 ObjectStack 里进行.
例如<s:property value="username">