(1)ValueStack是一个借口,在Struts2中使用OGNL表达式实际上是使用实现了ValueStack接口类的OgnlValueStack,它是ValueStack的默认实现类。
(2)ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象。
(3)struts2把ValueStack对象保存在名为struts.valueStack的request域中,ValueStack作用域为request,当action创建的时候,ValueStack就创建了,action被销毁时,ValueSatck就销毁。当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action,然后把action压入到值栈中,所以action的实例变量可以被ognl访问
(4)ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext)
        1)、其中的root是CompoundRoot,继承了ArrayList,提供了push和pop方法。一个请求在最终到达Action的方法之前,Action对象本身会被压入到ValueStack(实际上放到CompoundRoot中),所以action对象是CompoundRoot中的一个元素。
        2)、其中的context对象是OGNLContext,它实现了map接口,在valueStack的默认实现类中,OgnlValueStack中调用OGNL方法,返回一个OgnlContext对象。
(5)获取ValueStack的三种方式:
        1)、ValueStack valuestack=ActionContext()。getValueStack(); ActionContext为action的上下文,其中有重要的6大对象(valuestack,request,session,application,parameter,attr),ognl表达式必须选择ActionContext中的一个对象作为跟对象(root),默认为ValueStack,因此访问ValueStack中数据不加#,而如果要使用另外5个对象作为根对象,需要加#前缀。
        2)、ValueStack valuestack=ServletActionContext.getValueSatck(ServletActionContext.getRequest());
                ServletActionContext继承了ActionContext,它与web容器耦合,可以获得web容器的一些信息。
        3)、ValueStack valuestack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");


OGNL的类图:



ValueStack内存结构图:


常用的存储数据的方法:
    向map栈中存数据,即ValueStack中的context(OgnlContext),通过request、session等向map中存储数据  ActionContext.getRequest().setAttribute("","")或者ActionContext。getSession().put("","");或者直接向map栈中存放数据 ActionContext.getContext().put("","");


OGNl中重要的3个符号:#、%、$
(1)# : 获得非根对象属性,例如通过#session.msg表达式,在struts中值栈被视为根对象,所以在访问其他非根对象时,需要加#前缀,#就相当于ActionContext.getContext;#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute("msg");

(2)%符号的用途实在标志的属性为字符串时,计算OGNL表达式的值。

(3)$符号主要有两个方面的用途,在国际化资源文件中,引用OGNL表达式;在Struts2框架的配置文件中引用OGNL表达式。

OGNL中#的使用

#可以取出堆栈上下文中的存放的对象.

名称

作用

例子

parameters

包含当前HTTP请求参数的Map

#parameters.id[0]作用相当于

request.getParameter("id")

request

包含当前HttpServletRequest的属性(attribute)的Map

#request.userName相当于

request.getAttribute("userName")

session

包含当前HttpSession的属性(attribute)的Map

#session.userName相当于

session.getAttribute("userName")

application

包含当前应用的ServletContext的属性(attribute)的Map

#application.userName相当于

application.getAttribute("userName")

attr

用于按request > session > application顺序访问其属性(attribute)


OGNL会设定一个对象(root对象),在struts中根对象就是CompoundRoot,或者OgnlValueStack中的root,通常被叫做ValueStack(值栈或者对象栈),如果要访问根对象的属性,则可以省略去#,直接访问对象的属性即可。
public String testObjectValue(){

    ValueStack valuestack=ActionContext.getContext().getValueStack();
    valuestack.set("msg","valuestack");

    return "ognlObjectStack";
}

在页面中:<s:property value="msg" />




(1)ValueStack是一个借口,在Struts2中使用OGNL表达式实际上是使用实现了ValueStack接口类的OgnlValueStack,它是ValueStack的默认实现类。
(2)ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象。
(3)struts2把ValueStack对象保存在名为struts.valueStack的request域中,ValueStack作用域为request,当action创建的时候,ValueStack就创建了,action被销毁时,ValueSatck就销毁。当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action,然后把action压入到值栈中,所以action的实例变量可以被ognl访问
(4)ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext)
        1)、其中的root是CompoundRoot,继承了ArrayList,提供了push和pop方法。一个请求在最终到达Action的方法之前,Action对象本身会被压入到ValueStack(实际上放到CompoundRoot中),所以action对象是CompoundRoot中的一个元素。
        2)、其中的context对象是OGNLContext,它实现了map接口,在valueStack的默认实现类中,OgnlValueStack中调用OGNL方法,返回一个OgnlContext对象。
(5)获取ValueStack的三种方式:
        1)、ValueStack valuestack=ActionContext()。getValueStack(); ActionContext为action的上下文,其中有重要的6大对象(valuestack,request,session,application,parameter,attr),ognl表达式必须选择ActionContext中的一个对象作为跟对象(root),默认为ValueStack,因此访问ValueStack中数据不加#,而如果要使用另外5个对象作为根对象,需要加#前缀。
        2)、ValueStack valuestack=ServletActionContext.getValueSatck(ServletActionContext.getRequest());
                ServletActionContext继承了ActionContext,它与web容器耦合,可以获得web容器的一些信息。
        3)、ValueStack valuestack=(ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");


OGNL的类图:



ValueStack内存结构图:


常用的存储数据的方法:
    向map栈中存数据,即ValueStack中的context(OgnlContext),通过request、session等向map中存储数据  ActionContext.getRequest().setAttribute("","")或者ActionContext。getSession().put("","");或者直接向map栈中存放数据 ActionContext.getContext().put("","");


OGNl中重要的3个符号:#、%、$
(1)# : 获得非根对象属性,例如通过#session.msg表达式,在struts中值栈被视为根对象,所以在访问其他非根对象时,需要加#前缀,#就相当于ActionContext.getContext;#session.msg表达式相当于ActionContext.getContext().getSession().getAttribute("msg");

(2)%符号的用途实在标志的属性为字符串时,计算OGNL表达式的值。

(3)$符号主要有两个方面的用途,在国际化资源文件中,引用OGNL表达式;在Struts2框架的配置文件中引用OGNL表达式。

OGNL中#的使用

#可以取出堆栈上下文中的存放的对象.

名称

作用

例子

parameters

包含当前HTTP请求参数的Map

#parameters.id[0]作用相当于

request.getParameter("id")

request

包含当前HttpServletRequest的属性(attribute)的Map

#request.userName相当于

request.getAttribute("userName")

session

包含当前HttpSession的属性(attribute)的Map

#session.userName相当于

session.getAttribute("userName")

application

包含当前应用的ServletContext的属性(attribute)的Map

#application.userName相当于

application.getAttribute("userName")

attr

用于按request > session > application顺序访问其属性(attribute)


OGNL会设定一个对象(root对象),在struts中根对象就是CompoundRoot,或者OgnlValueStack中的root,通常被叫做ValueStack(值栈或者对象栈),如果要访问根对象的属性,则可以省略去#,直接访问对象的属性即可。
public String testObjectValue(){

    ValueStack valuestack=ActionContext.getContext().getValueStack();
    valuestack.set("msg","valuestack");

    return "ognlObjectStack";
}

在页面中:<s:property value="msg" />



Struts-ValueStack和OGNL总结的更多相关文章

  1. 4. ValueStack 和 OGNL

    1. 属性哪来的 当我们通过Action处理完用户请求以后,可以直接在页面中获取到 action 的属性值. 如果我们在页面中尝试遍历四个域中的属性,会发现域中并没有username之类的Action ...

  2. struts2重点——ValueStack和OGNL

    一.值栈(ValueStack) 1.实现类:OGNLValueStack 2.对象栈:CompoundRoot(针对的是类级别的) (1)继承自 ArrayList —— 先进后出 (2)提供了栈的 ...

  3. 在Apache Struts中利用OGNL注入

    前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...

  4. struts ValueStack 详解

    一.ValueStack     1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用        ...

  5. ValueStack和OGNL达到Struts2形式的数据存储原理

    (1)最近学习struts相框,我们在快乐struts强大.为了便于使用转发,但不了解详细的内部数据存储: (2)网上找了很多关于struts数据存储的原理,但我还没有找到一个具体的解释,本书上找到了 ...

  6. Struts中的OGNL和EL表达式笔记

    Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ...

  7. 关于struts2.x中(警告: Could not find property [struts.valueStack])的解决方法

    出现“警告: Could not find property [struts.valueStack]”这样的问题,是由于少引用了log4j.jar包,不过,不引用也不影响使用.看个人的爱好了.

  8. Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用

    我之前虽然会用,但是一直分不清彼此之间有什么区别,所以查找资料,将它们进行整合区分,加深了解, 一 介绍 1.Struts2的作用   Struts2标签库提供了主题.模板支持,极大地简化了视图页面的 ...

  9. Struts(五)之OGNL、contextMap

    一.OGNL 1.1.定义 OGNL是Object-Graph Navigation Language的缩写,它是一个单独的开源项目. Struts2框架使用OGNL作为默认的表达式语言.它是一种功能 ...

  10. Struts(十一):OGNL表达式(二)

    Map栈 :request,session,application的一个属性值或一个请求参数的值. 若想访问ContextMap里的某个对象的属性,可以使用以下几种之一: #object.proper ...

随机推荐

  1. SpriteKit游戏开发 Challenge 2: An invincible zombie 问题的另一种解决方法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 该挑战的目的是僵尸碰到敌人时,将其设置为无敌模式,具体要求如下 ...

  2. Java多线程的调度策略

    在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权. ...

  3. Apache Beam—透视Google统一流式计算的野心

    Google是最早实践大数据的公司,目前大数据繁荣的生态很大一部分都要归功于Google最早的几篇论文,这几篇论文早就了以Hadoop为开端的整个开源大数据生态,但是很可惜的是Google内部的这些系 ...

  4. 大页内存(HugePages)在通用程序优化中的应用

    今天给大家介绍一种比较新奇的程序性能优化方法-大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失.这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在O ...

  5. Dynamics CRM 非声明验证方式下连接组织服务的两种方式的性能测试

    今天看了勇哥的博文"http://luoyong0201.blog.163.com/blog/static/1129305201510153391392/",又认识到了一种新的连接 ...

  6. [cacti]nginx+php+cacti+mysql+php-fpm 安装小记

    网上教程很多,但是nginx不太多,下面安装时候主要参考的篇文章: http://54im.com/linux/linux-cacti-cn-install.html http://www.tecmi ...

  7. Android的oom详解

    Android的oom原因 1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM.资源性对象比如: 1-1,Cursor 1-2,调 ...

  8. Java-IO之FilterInputStream和FilterOuptStream

    FilterInputStream的作用是用来封装其他的输入流,并为它们提供了额外的功能,它的常用的子类有BufferedInputStream和DataInputStream.FilterOutpu ...

  9. C#之FileInfo的简单操作

    和DirectoryInfo一样,FileInfo类同样是很方便的就能实现复杂的功能. 如下,我们一起来看一下一个简单的小例子吧. using System; using System.Collect ...

  10. pig加载两个不同字段个数的文件?load file with different items(f1有42列,f2有43列读到一个对象中)

    我文章提到,加载一个文件的部分列是可行.两列,你只读一列,没问题. 但是,两个文件,f1和f2,f1有42列,f2有43列,同时加载到一个流对象,如何? 答:成功加载.但是无结构(schema unk ...