`

从调试角度理解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,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号

    struts2中的ActionContext与ognl

    NULL 博文链接:https://lijiejava.iteye.com/blog/628636

    struts2OGNL表达式ActionContext及valuesStack.pdf

    struts2OGNL表达式ActionContext及valuesStack.pdf

    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的标志一起使用。主要是#、%和$这三个符号的使用;

    使用Action访问ActionContext方式的网站计数器

    使用Action访问ActionContext方式的网站计数器,可直接运行

    Java开发技术

    struts2 中 OGNL表达式的使用 GNL是Object Graph Navigation Language的简称,详细相关的信息可以参考:http://www.ognl.org... 访问OGNL上下文(OGNL context)和ActionContext; 5. 操作集合对象。

    ActionContext介绍(在Struts2中)

    在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应...

    Struts2 s2-061 Poc分析1

    简介分析性。2. 已实例类的法调 (OgnlContext 中的对象),不允许调静态法idea 中可以通过 ActionContext.actionContex

    JavaEE ActionContext存取数据示例

    JavaEE ActionContext存取数据示例

    OGNL表达式语言.txt

    Ognl有一个上下文(Context)的概念,其实就是一个Map结构,它实现了java.utils.Map接口,Struts2中的上下文的实现为ActionContext。 结构图: 当Struts2接受一个请求时,会迅速创建ActionContext,ValueStack,...

    精讲Struts2

    精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) ...OGNL(ActionContext StackContext ValueStack区别)

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

    NULL 博文链接:https://zhouhaitao.iteye.com/blog/1126042

    基于struts2注册登录ActionContext.zip

    从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性(所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,标签库几乎可以完全替代JSTL的标签库,并且 struts2.x支持强大的ognl表达式。可用于软件...

    ActionContext在struts2.0中的详细应用

    ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象

    linjin101#javaStudy#Struts2中的OGNL和值栈ValueStack1

    1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据

    西安领航核心项目Struts2重点、难点总结

    对Struts2框架中的相关知识还有困惑的同学有福了,此次上传的是西安领航何足道老师的核心项目Struts2部分的重点难点的归纳总结,...主要包括的知识有Action的动态调用方法、值栈、拦截器、ActionContext、Ognl表达式等

    Struts2 ActionContext 中的数据详解

    主要介绍了Struts2 ActionContext 中的数据详解,需要的朋友可以参考下

    Struts2_TypeConvertion

    B.ActionContext ct= ActionContext.getContext() HttpServletRequest request= (HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST ); 获得session对象: 在Struts2中底层的session都被封装成了...

    mvc 的测试,请大家下载

    public class Test { public static void main(String arg[]){ ... ActionContext context=manager.findActionContext("/user/userDel.action"); System.out.println(context.getUri()); }

Global site tag (gtag.js) - Google Analytics