勿谓今日不学而有来日,勿谓今年不学而有来年。
日月逝矣,岁不我延。

浅析OGNL中的值栈

HelloWord再分析

在Struts2的HelloWorld项目中,我们通过 ${productName} 读取 productName 值,但 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的。如何得知?

当在 ProductDetails.jsp 页面中打印 request 隐含对象:可以看到如下显示:

所以使用debug跟踪SttrutsRequestWrapper对象的getAttribute方法。当传入参数为 “productName” 时, ActionContext 对象的即时状态如下:

展开上图的倒数第三项:table节点可以看到如下 value值是一个OgnlValueStack。

继续看value节点,其中有两个逻辑部分:context和root

Context节点: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中.  实际上就是对 ActionContext 的一个引用。Struts 会把下面这些映射压入 ContextMap 中

  • parameters: 该 Map 中包含当前请求的请求参数
  • request: 该 Map 中包含当前 request 对象中的所有属性
  • session: 该 Map 中包含当前 session 对象中的所有属性
  • application:该 Map 中包含当前 application  对象中的所有属性
  • 各个attribute: 该 Map 按如下顺序来检索某个属性: request, session, application

root节点:ObjectStack: Struts  把 Action 和相关对象压入 ObjectStack 中

context和root分别是

  1. Map 栈: 实际上是 OgnlContext 类型, 是个 Map, 也是对 ActionContext 的一个引用. 里边保存着各种 Map:
    requestMap, sessionMap, applicationMap, parametersMap, 各个attribute
  2. 对象栈: 实际上是 CompoundRoot 类型, 是一个使用 ArrayList 定义的栈. 里边保存各种和当前 Action 实例相关的对象.是一个数据结构意义的栈.

ValueStack简述

  • ValueStack(值栈): 贯穿整个 Action 的生命周期(每个 Action 类的对象实例都拥有一个 ValueStack 对象)。相当于一个数据的中转站. 在其中保存当前 Action 对象和其他相关对象.
  • Struts2 框架把 ValueStack 对象保存在名为 “struts.valueStack” 的请求属性中
  • 在 ValueStack 对象的内部有两个逻辑部分:
  1. ObjectStack: Struts  把 Action 和相关对象压入 ObjectStack 中
  2. ContextMap: Struts 把各种各样的映射关系(一些 Map 类型的对象) 压入 ContextMap 中.  实际上就是对 ActionContext 的一个引用
  • Struts 会把下面这些映射压入 ContextMap 中
  1. parameters: 该 Map 中包含当前请求的请求参数
  2. request: 该 Map 中包含当前 request 对象中的所有属性
  3. session: 该 Map 中包含当前 session 对象中的所有属性
  4. application:该 Map 中包含当前 application  对象中的所有属性
  5. 各个attribute: 该 Map 按如下顺序来检索某个属性: request, session, application
赞(0)
未经允许不得转载:喋喋不休 » 浅析OGNL中的值栈

评论 抢沙发

评论前必须登录!

 

精品网站

有券无忧电脑壁纸精选