Struts-ValueStack和OGNL总结

时间:2021-09-03 22:27:24

(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的类图:
Struts-ValueStack和OGNL总结

Struts-ValueStack和OGNL总结
ValueStack内存结构图:

Struts-ValueStack和OGNL总结
常用的存储数据的方法:
    向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的类图:
Struts-ValueStack和OGNL总结


ValueStack内存结构图:
Struts-ValueStack和OGNL总结

常用的存储数据的方法:
    向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&period; 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&period;x中(警告&colon; Could not find property &lbrack;struts&period;valueStack&rsqb;)的解决方法

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

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

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

  9. Struts&lpar;五&rpar;之OGNL、contextMap

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

  10. Struts&lpar;十一&rpar;:OGNL表达式(二)

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

随机推荐

  1. What is SPI&quest;

    原文地址:http://www.fpga4fun.com/SPI1.html SPI is a simple interface that allows one chip to communicate ...

  2. SQL初级第三课(上)

    先建立一个表 create table Student                 --学生(Sno          char(3) primary key ,  --学生学号Sname     ...

  3. 三维世界的Gizmos

    Unity和Maya 今天在美术同事那儿了解些Maya常识,加上自己在Unity3D中的一点儿小操作,记录一下Gizmos 之前就知道Maya和Unity3D的轴向是一致的,在同事那儿看他操作Maya ...

  4. Struts2 Annotation 注解配置

    也叫Zero Configuration(零配置),它省去了写xml文件的麻烦,可以直接在类叫进行配置,不用在java文件和xml文件中来回切换. 必须导入struts2-convention-plu ...

  5. ef6 dbfirst 实现同一套代码多个数据库访问

    codefirst可以通过DbConfiguration实现,但是dbfitst无法做到,弄了一天,搞定了,下面是步骤 1.将.edmx的 元数据处理项目改成 复制输出到目录 2.bs项目添加App_ ...

  6. 超好用文件对比工具 – Beyond Compare

    超好用文件对比工具 – Beyond Compare,开发中文件.目录对比神器,有了它,再也不用为找不到修改的内容而发愁了. 具备的丰富实用功能: 并列比较文件夹.FTP 网站或 Zip 文件: 为以 ...

  7. 在 Windows 下远程桌面连接 Linux - VNC 篇

    VNC是由AT&T试验室开发,是一款优秀的远程控制工具软件,后来以GPL授权的形式开源.经过几年的发展,现在的VNC已经不单指某个软件,而是一类软件的通称.下面介绍Linux下常用的两个VNC ...

  8. html5-表格的建立

    用表格显示信息调理清楚,使浏览者一目了然.表格在网页中还有协助布局的作用,可以把文字.图像等组织到表格的不同行列.那么,接下来我将讲解一下表格的常用属性. 首先,表格命令 表格的行:tr  每行中的列 ...

  9. JavaScript中调皮的undefined

    JavaScript中调皮的undefined 在JavaScript中undefined只是一个标识符,不是关键字,这个很不靠谱的标识符还不能像其他符号一样随意使用,一方面是需要它的原始值保持不变, ...

  10. 一道面试题 vuex缺点?

    最近去面试的时候,面试官有一道题是让我阐述用vuex的优缺点,优点倒还好说,这个缺点还真没有认识到,有道友可以帮忙解惑嘛? 2 回答 慕标5265247 这种问题一般都有通用回答套路.一件挺好的东西, ...