2. 问题二 : 值栈的内部结构 ?
* 值栈由两部分组成
> root -- Struts把动作和相关对象压入 ObjectStack 中--List
> context -- Struts把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中
* Struts会默认把下面这些映射压入ContextMap(context)中
* 注意:request代表的是Map集合的key值,value的值其实也是一个Map集合。
> parameters: 该 Map 中包含当前请求的请求参数 ?name=xxx&password=123
> request: 该 Map 中包含当前 request 对象中的所有属性
> session: 该 Map 中包含当前 session 对象中的所有属性
> application:该 Map 中包含当前 application 对象中的所有属性
> attr: 该 Map 按如下顺序来检索某个属性: request, session, application
![](https://img2018.cnblogs.com/blog/1559799/201812/1559799-20181215195043362-1963335751.png)
值栈一创建里面就有很多值,但是这些值不是我们需要使用的。
* ValueStack中 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )
> CompoundRoot 就是ArrayList
> OgnlContext 就是 Map
* context 对应Map 引入 root对象
> context中还存在 request、 session、application、 attr、 parameters 对象引用
> OGNL表达式访问值栈中的数据
* 访问root中数据时 不需要 #
* 访问 request、 session、application、 attr、 parameters 对象数据 必须写 #
> 操作值栈 默认指 操作 root 元素