`

从调试角度理解ActionContext、OgnlContext、OgnlValueStack的关系

 
阅读更多

从调试角度理解ActionContext、OgnlContext、OgnlValueStack的关系
被调试代码:


访问url地址:http://localhost:8080/strutsdemo/doLogin.action?userName=jiang
被观察的表达式:
ActionContext.getContext();
ActionContext.getContext().getValueStack();

观察结论:
1、从ActionContext对象中可以取得OgnlValueStack对象
2、ActionContext中持有的属性context和OgnlValueStack对象中持有的对象属性context的类型都是OgnlContext类型,其实是同一个对象
3、Ognl持有一个root属性,这个属性存放的是Struts Ognl的根对象
OGNL三要素:
  1.expression 求值表达式——首先会被解析成对象树
  2.root object 根对象——默认的操作对象
  3.context OGNL执行环境——OGNL执行的上下文环境
OGNL context是一个Map结构,ognl.OgnlContext类implements Map接口,root对象也在context里面,并且做这一个特殊的对象处理,具体表现为对root 对象的操作不需要加#指示符号(并且加上了#一定取不到root对象里面的值)。
继续展开root属性节点:

4、从root的对象名称我们都可以看出他表达的含义:CompoundRoot表示符合的根对象,根据原始的Ognl,根对象是单个对象。而Struts2扩展了这个概念,这个跟对象不在仅仅只代表单个对象而可以是多个对象,这里我们从调试中可以看出它包含当前Action对象和DefaultTextProvider对象。CommpoundRoot为何可以包含多个对象?

很简单,因为它集成自ArrayList集合,从下面扩展的方法中可以看出它实现了对集合栈数据结构方式的存取能力。我们看看另一段关于这个CompoundRoot的解释:
There can be many "root" objects. XWork中的表示根对象是CompoundRoot对象。CompoundRoot类extends ArrayList类。因为是一个List,里面可以放置多个对象,而这些对象经过XWork的改进对于OGNL表达式引擎来说都是root objects。XWork has a special OGNL PropertyAccessor that will automatically look at the all entries in the stack (in fact the CompoundRoot list) (from the top down) until it finds an object with the property you are looking for.


再来重点观察OgnlContext这个非常重要的容器:

5、OgnlContext实现了Map接口,这里_values私有属性存放的是Map的键值对信息,我们展开里面的table节点观察里面存放了什么秘密:

6、我只是展开了部分,从中我们可以看出Struts2放置请求表单参数、请求对象本身、session对象、application对象和application对象属性等等到OGNL栈(事实上放在OgnlContex).Struts 2 places request parameters and request, session, and application attributes on the OGNL stack (in fact the OGNL context).

小结:
1、Struts2数据传输DataTransfer的核心对象是OgnlValueStack、OgnlContext,OgnlValueStack持有OgnlContext和root对象,注意:OgnlContext和root对象是ognl的核心要素【参考我的转载http://blog.csdn.net/jiangtongcn/article/details/7669871】。
2、OgnlContext这个容器存放了所有本次Web请求响应的所有相关信息对象,root的存放的多个根对象。
3、Struts2 Ognl表达式的解析主要依赖OgnlValueStack去完成。表达式中如果没有带#,如:“emp.name”,那么OgnlValueStack将去根对象中去遍历每个对象看是否某个对象的方法是否匹配"emp.getName()",匹配则执行,否则跑出OgnlExcpetion异常。如果带有#,则去Ognl上下文中去寻找是否有满足emp.name属性的key,有责返回。
4、Struts2的ActionContext类只是为了访问ValueStack而提供的一个Facade【门面设计模式】,为程序员访问各种信息提供一个一致的界面。
5、使用Ognl表达式从OgnlValueStack中取出值:
代码:



分享到:
评论

相关推荐

    struts2_OGNL表达式ActionContext及valuesStack

    在Struts2中,OGNL上下文被扩展为一个更复杂的结构,包含request、session、application、context map、OgnlValueStack等层次。OgnlValueStack(或简称为value stack)是核心,它是一个栈结构,通常包含用户对象、...

    struts2中的ActionContext与ognl

    在视图层,开发者可以使用OGNL表达式从ActionContext的ValueStack中获取数据,从而动态地构建视图。而在控制器层,Action类的属性可以通过ActionContext的ValueStack与HTTP请求参数进行绑定,或者在Action的执行过程...

    ognl表达式 ognl表达式

    ### OGNL表达式的理解和应用 #### 一、OGNL简介与基本概念 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架中的默认表达式语言,同时也被广泛...

    ActionContext介绍(在Struts2中)

    ActionContext context = ActionContext.getContext(); ``` ActionContext中的`getParameters()`方法可以用来获取请求参数,如示例代码所示,获取请求参数"username"的值: ```java Map, Object> params = context...

    OGNL表达式struts2标签

    OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。... 4、访问OGNL上下文(OGNL context)和ActionContext; 5、操作集合对象。

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己... 4、访问OGNL上下文(OGNL context)和ActionContext 5、操作集合对象 用法:OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用;

    JavaEE ActionContext存取数据示例

    在这个“JavaEE ActionContext存取数据示例”中,我们将深入探讨ActionContext的使用方法及其与OGNL(Object-Graph Navigation Language)的关系。 首先,ActionContext是Struts2框架中Action执行时所处的环境,它...

    ognl英文帮助文档

    2. **OGNL的上下文(Context)**:OGNL表达式可以在一个上下文中执行,这个上下文包含了可以被表达式引用的对象。上下文通常包含ActionContext,它是Struts2中的一个关键组件,存储了请求、session和应用范围内的...

    ognl图形导航语言

    OGNL还能访问上下文(如OGNL context和ActionContext)。ActionContext提供了对HTTP请求参数、请求、session、application等范围内的属性的访问。例如,`#parameters`可以用来获取HTTP请求的参数,`#session`可以...

    OGNL百度百科OGNL百度百科

    其中 `root` 是整个 Context 的入口,通过 OGNL 表达式可以直接访问到这个 `root`,然后从 `root` 开始搜索需要的值。如果在当前层级没有找到所需的值,则会继续向上层搜索,直到找到为止或直到顶层停止搜索。 ####...

    struts2OGNL表达式ActionContext及valuesStack.pdf

    总的来说,Struts2的OGNL表达式和ActionContext以及ValuesStack的设计使得数据访问更加灵活和高效。开发者可以方便地在控制器、视图和模型之间穿梭,进行复杂的表达式计算和对象属性操作,同时保持代码的简洁和...

    ognl源码

    通过阅读和研究OGNL源码,开发者不仅能了解其内部工作流程,还能更好地应对实际开发中的问题,比如调试OGNL表达式、防止代码注入攻击、优化性能等。对于使用Struts2或其他依赖OGNL的框架的开发者来说,这是一项重要...

    Struts2通过使用ActionContext类获取request和response对象

    ActionContext类位于`org.apache.struts2.context`包中,它是Struts2上下文的核心,包含了当前请求的所有相关信息。在执行Action时,ActionContext会自动创建并填充与请求相关的数据,如session、parameters、...

    OGNL表达式

    4. **访问OGNL上下文(OGNL context)和ActionContext**:OGNL可以访问当前上下文中的对象,包括Struts2框架内部的对象。 5. **操作集合对象**:OGNL提供了强大的集合操作功能,使得处理列表、数组等数据结构变得...

    struts2 OGNL语言学习笔记

    4. 访问 OGNL 上下文(OGNL context)和 ActionContext:OGNL 允许用户访问 OGNL 上下文和 ActionContext。 5. 操作集合对象:OGNL 允许用户操作集合对象,例如:对 List 或者数组的操作。 在 Struts 2 中,OGNL ...

    struts2中的ognl.jar

    - 配置OGNL的安全策略:为了防止OGNL注入,开发者可以配置OGNL表达式上下文(OgnlContext),限制某些危险的操作。 - 使用OGNL表达式拦截器:Struts2提供了拦截器来预处理OGNL表达式,进行安全检查和转换。 5. ...

    `Strtus2 OGNL表达式的结合

    在OGNL表达式中,ActionContext作为Context,提供了访问这些环境信息的途径。例如,`#request`、`#session`、`#application`等都是ActionContext的一部分,可以通过它们来获取请求、session或应用级别的数据。 而...

    ActionContext在struts2.0中的详细应用

    在Struts2框架中,ActionContext扮演着至关重要的角色,它是Action执行时的上下文环境,可以理解为一个存储Action执行过程中所需对象的容器。实际上,这个容器是一个Map,用于保存Action执行期间需要的各种信息。 ...

    ognl的jar包

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,主要用在Java...下载“ognl-3.0.6-sources.jar”文件后,开发者可以阅读源码来了解其内部的工作机制,这对于调试、优化或者扩展OGNL的功能大有裨益。

    传智168期JavaEE struts2杜宏 day32~day33笔记

    3. **访问OGNL上下文和ActionContext**:特别是对ValueStack的操作; 4. **支持赋值操作和表达式串联**; 5. **操作集合对象**。 ##### OGNL与Struts2的关系 在Struts2中,OGNL被广泛应用于处理对象之间的导航和...

Global site tag (gtag.js) - Google Analytics