(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. HDFS的读数据过程分析

    我们继续在 FileSystem 类分析,读数据使用的是 open(-)方法,我们可以看到源码 FSDataInputStream in = fileSystem.open(new Path(&quo ...

  2. Java基本语法-----java运算符的优先级与结合性

    这是本人以前的上学期间java 运算符这块知识的总结的,截图存到了word里,大家将就看下吧(不会用Markdown的表格 不然就在写一遍了 T T). [正在看本人博客的这位童鞋,我看你气度不凡,谈 ...

  3. Dynamics CRM2015 页面导航栏顶部全局快速查找功能配置

    在CRM2015中微软加入了新的快速查找功能,让你的数据查找更加方便,功能栏如下图所示,直接可以框中输入搜索项进行搜索. 但该功能是需要进行些配置,具体的配置在设置-管理-系统设置中,默认的就是红框中 ...

  4. Android简易实战教程--第二十一话《内容观察者监听数据库变化》

    当数据库的数据发生改变,我们又想知道具体改变的情况时,就需要对数据库的变化情况做一个监控.这个任务,就由内容观察者来完成.下面这个案例,为短信数据库注册内容观察者,来监控短信的变化情况,当短信数据库发 ...

  5. linux真正使用shell脚本做定时任务 关键的Nohup

    网上有很多的文章教大家使用定时任务,所以别的废话我就不多说了 我这里直接有SH来做定时,只是有一点大家不知道,一定要用Nohup,否则用户退出终端以后,SH任务会被自动终止掉 假设有一 tash.sh ...

  6. 【翻译】Ext JS 6.2 早期访问版本发布

    原文:Announcing Ext JS 6.2 Early Access 非常开心,Sencha Ext JS 6.2早期访问版本今天发布了.早期访问版本的主要目的是为了让大家进行测试并评估Ext ...

  7. Eclipse 主题

    Eclipse开发环境默认都是白底黑字的,看到同事的Xcode中设置的黑灰色背景挺好看的,就去网络上查了一下.发现Eclipse也可以设置主题. http://eclipsecolorthemes.o ...

  8. Cytoscape源码下载地址和编译办法

    开发环境:Windows2008 R2 64位+Jdk1.7+Maven3.2.3 前提条件:安装好JDK1.7到C:\Program Files\Java\jdk1.7.0_67,下载好Maven并 ...

  9. Arquillian Exception:java.lang.NoClassDefFoundError

    Issue: When you deploy and run Arquillian testcase, you may encountered java.lang.NoClassDefFoundErr ...

  10. Android初级教程理论知识(第五章页面跳转和数据传递)

    总体概述: Android四大组件 Activity BroadCastReceiver Service ContentProvider 创建第二个activity 新创建的activity,必须在清 ...