(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. [django]用fastcgi部署

    django官方已经开始弃用fastcgi来部署django应用了,作为以前使用过的用户,还是贴一个配置,用来做纪念吧.. 项目下 #! /bin/sh case "$@" in ...

  2. 【Android 系统开发】使用 Source InSight 阅读 Android 源码

    1. 安装 Source Insight (1) Source Insight 相关资源 安装相关资源 : -- 下载地址 : http://www.sourceinsight.com/down35. ...

  3. Xcode中使用数据(硬件)断点调试

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Xcode的GUI界面中只能添加软断点,而无法增加硬断点.但 ...

  4. Quick-Cocos2d-X 捋一捋框架流程

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=535 一直比较关注Quick L ...

  5. iOS中 支付宝钱包详解/第三方支付 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! iOS开发者交流QQ群: 446310206 一.在app中成功完成支付宝支付的过程 1.申请支付宝钱包.参考网址 ...

  6. iOS中崩溃调试的使用和技巧总结 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博 在iOS开发调试过程中以及上线之后,程序经常会出现崩溃的问题.简单的崩溃还好说,复杂的崩溃就需要我们通过解析Cras ...

  7. 定制Maven原型生成项目

    1自定义原型 1.1创建原型项目 要定制自己的原型,首先就要创建原型项目来进行定制: mvnarchetype:create -DgroupId=com.cdai.arche -DartifactId ...

  8. UNIX环境高级编程——线程属性

    pthread_attr_t 的缺省属性值 属性 值 结果 scope PTHREAD_SCOPE_PROCESS 新线程与进程中的其他线程发生竞争. detachstate PTHREAD_CREA ...

  9. [sersync] github镜像 二进制包

    这几天在搞数据的本地备份和远程备份的事情,用到了sersync这个国产的同步工具,可是发现他托管在google code,需要fanqiang才能下载, 于是就弄了一个github的镜像,顺便把64位 ...

  10. Andriod的国际化-android学习之旅(五十八)

    android资源国际化