文档章节

Struts2_ValueStack,OGNL详解

chaun
 chaun
发布于 2015/06/05 10:05
字数 1267
阅读 154
收藏 7
点赞 0
评论 0
一、ValueStack
    1
.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation Language)表达式实际上是使用
        实现了ValueStack接口的类OgnlValueStack.它是ValueStack的默认实现类.
    2.ValueStack贯穿整个action的生命周期,每一个action实例都拥有一个ValueStack对象,其中保存了当前action对象和其他相关对象.

    3.struts2把ValueStack对象保存在名为:struts.valueStack的request域中.即ValueStack作用域为request.当action创建的时候,ValueStack就创建了,action被销毁的时候,ValueStack就销毁了

     4.ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map形式,OgnlContext)
         (1)    * 其中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的方法:push(),和pop()方法,
                 用来对root对象中所包含的数据进行存取.正是由于这两个方法,CompoundRoot变成了一个栈结构.
            * struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack
                的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.
        (2)* 其中的context对象是OgnlContext,它实现了map接口,在valuestack的默认实现类中,即OgnlValueStack类中,
                调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可知,
                此方法返回的是一个OgnlContext对象.
     5.获取ValueStack的三种方式
        (1)ValueStack valueStack = ActionContext.getContext().getValueStack();    
                ActionContext为Action的上下文,其中有重要的6大对象
                    * valueStack,parameters,request,session,application,attr
                    * 而ognl表达式必须选择AcitonContext中的一个对象作为根对象(root),默认为valueStack,因此访问valueStack中的数据不加#
                        而如果要使用另外5个对象作为根对象,需要加#前缀.
        (2)ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());        
                ServletActionContext继承了ActionContext,它与web容器耦合,可以获取web容器的一些信息.

        (3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");

    6.ValueStack内存结构图

    7.常用的存储数据的方法
        (1)向map栈中存数据,即ValueStack中的context(OgnlContext)
            * 通过request,session等向map中存储数据
                ServletActionContext.getRequest().setAttribute("username","joey");
                ServletActionContext.getSession().put("pwd","123");
            * 直接向map栈中放数据
                ActionContext.getContext().put("msg","how you doing");    
        (2)向对象栈中存数据,即ValueStack中的root(CompoundRoot)对象
            * 先得到root,再把数据压入到root中,这中方式是放入到栈底.
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.getRoot().add(new Person());
            * 先得到root,利用add(index,Object)把一个对象压入到root中指定位置.
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.
            * 存放一个map到对象栈中
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.
            * 利用valueStack的push方法把一个对象直接压入栈顶
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.push(new Person());

    8.利用OGNL表达式取ValueStack中的数据
        (1)<s:property />:取栈顶的元素.
        (2)<s:iterator />:取栈顶的元素.
            注意:此标签的value属性值无论来自对象栈还是Map栈,都可以不加#前缀(<s:select/>标签也适用).
                因为此标签在迭代的时候,总是把当前正在迭代的元素放入到栈顶.

二、ognl
    1
.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性.
        它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中.
    2.Root对象
        OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象.
        例如:

public class User{
		private String username;
		private Group group;
		//省略setter,getter方法
	}
	public class Group{
		private String name;
		private Organization org;
		//省略setter,getter方法
	}
	public class Organization{
		private String orgId;
		//省略setter,getter方法
	}

        以上三个类,描述了通过一个User对象,同过User对象可以导航到Group对象,进而导航到Organization对象.
            以User为根,通过基本的getters方法,可以访问到此根对象的其它关联对象.【对象图的导航,必须通过getters方法导航】
        注意:    * 导航的目的,就是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法.
            * OGNL表达式语言的真正目的,是为了在那些不能写java代码的地方执行java代码,或者是为了更方便的执行java代码.
     3.Context对象
        * 在OGNL表达式中,有可能需要访问到多个毫不相干的对象,这时候,我们需要给OGNL传递一个Map类型的对象,把表达式中需要用到的对象放到
            Map中即可.而这个Map对象称为Context
        * 要在表达式访问到context中的对象,需要使用"#对象名称"的语法规则.
        * 存在context的主要原因就是在OGNL中,不支持多个root对象,而如果需要在表达式中访问多个毫不相关的对象时,
            只能通过一个Map来把这些对象统一传递给OGNL.

© 著作权归作者所有

共有 人打赏支持
chaun
粉丝 85
博文 262
码字总数 96237
作品 0
深圳
高级程序员
struts2实战教程

Struts2.0已经成为了一个高度成熟的框架,不管是稳定性还是可靠性都得到了广泛的证明。 拥有丰富的开发人群,几乎已经成为了事实上的工业标准。因此,学习MVC框架,struts2.0几乎是必须熟悉的...

2846613430 ⋅ 2016/04/25 ⋅ 0

struts2之ognl表达式

OGNL表达式语言介绍; OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写, 它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。 OGNL相对其它表达式语言具有下面...

长平狐 ⋅ 2012/09/03 ⋅ 0

SSH框架中不为人知的细节(二)

Struts2之ValueStack 上一节在将阐述ModelDriven的机制时,常常提到一个名词ValueStack。也许你会毫不犹豫脱口而出,不就是值栈吗?对,就是它,那你知道Struts为什么需要引入它?它是如何工...

蔡佳娃 ⋅ 2014/03/02 ⋅ 7

Struts2 的ModelDriven 二——ModelDrive

继上篇博客介绍了值传递的几种形式,这篇博客,来说说struts2是如何实现的? 有这么两个概念和modelDriven实现有关:ValueStack,ModelDrivenInterceptor。 一、ModelDrivenInterceptor 首先...

一零贰IV ⋅ 05/12 ⋅ 0

使用Struts2标签时的一些问题

问题一:#,%{},$符号   在Struts2标签属性中经常会出现"#"或者"%{}"的符号出现,通过上面OGNL表达式基础的介绍,知道了OGNL上下文中有且仅有一个根对象。Struts2为我们定义了许多明明对象,...

mr桀骜不驯 ⋅ 2013/03/13 ⋅ 0

Struts2中OGNL,valueStack,stackContext的学习

[/color]学习Struts2,一直不明白表单中的值是怎么传给Action的,上网查了些资料,基本了解了!下面基本是从几个人的BOLG转载过来,以后记不清了再来看~ [color=red]先看看我做的实验jsp页面...

杨松坤 ⋅ 2012/07/19 ⋅ 0

Java程序员从笨鸟到菜鸟之(四十八)细谈struts2(十)ognl概念和原理详解

引言:众所周知,在mvc中,数据是在各个层次之间进行流转是一个不争的事实。而这种流转,也就会面临一些困境,这些困境,是由于数据在不同世界中的表现形式不同而造成的: 1. 数据在页面上是...

长平狐 ⋅ 2012/11/12 ⋅ 0

【学习笔记21】OGNL

一、OGNL表达式语言 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts 2框架使用OGNL作为默认的表达式语言。 相对EL表达式,它提供了平时我们...

张超 ⋅ 2013/07/09 ⋅ 0

Sturts2中的OGNL

参考http://struts.apache.org/2.x/docs/ognl-basics.html 和 http://struts.apache.org/2.x/docs/ognl.html OGNL——Object Graph Navigation Language,参考 http://www.ognl.org/ 一.Xwo......

yonge ⋅ 2009/03/11 ⋅ 3

新书预告 :《Struts2技术内幕》 —— Struts2源码研究和Web开发研究

http://www.iteye.com/topic/1117044 简单做一个新书预告,我写的《Struts2技术内幕》将在下个月问世。 这本书应该是国内比较少见的以研究Struts2的源码为主要目标的技术书籍。源码研究类的书...

ddatsh ⋅ 2011/10/26 ⋅ 8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

UI ,前端框架选型

Flat-UI

miaojiangmin ⋅ 4分钟前 ⋅ 0

Istio Service Mesh 教程

Istio Service Mesh 教程 作者 宋净超 | 5400字 | 阅读大约需要11分钟 | 归档于istio | 发表于 2018-05-22 标签 #Istio #教程,来自 https://servicemesher.github.io/blog/istio-service-m...

openthings ⋅ 9分钟前 ⋅ 0

scala swing

scala swing组件的库 https://github.com/scala/scala-swing scala swing的API文档 https://www.scala-lang.org/api/2.9.1/scala/swing/package.html...

whoisliang ⋅ 14分钟前 ⋅ 0

CentOS安装配置Nginx

安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-deve......

临江仙卜算子 ⋅ 20分钟前 ⋅ 0

开源 java CMS - FreeCMS2.8 依申请公开

项目地址:http://www.freeteam.cn/ 依申请公开 1. 转交申请公开 用户可以把申请公开转交给其他人办理,系统会记录此申请公开的转交记录。 注意:同时只能转交一个申请公开。 选择需要转交的...

freeteam ⋅ 25分钟前 ⋅ 0

以太坊 web3.py 签名转账

以太坊 web3.py 签名转账 本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86...

netkiller- ⋅ 30分钟前 ⋅ 0

年薪40W的程序员必会的技术有哪些?

很多人在问我,程序员如何拿高薪,如何做到年薪40W+,其实总结出来还是一句话,你的技术决定你的能力已经薪资。 那么什么样的技术人才才能拿到一份Java行业里面的高薪呢? 下面是我的一个总结...

码代码的小司机 ⋅ 30分钟前 ⋅ 0

jesque-spring使用及源码分析

1.使用 jesque结合spring使用,步骤如下: 1.1 在项目中添加maven依赖 <dependency> <groupId>net.lariverosc</groupId> <artifactId>jesque-spring</artifactId> <version>1.0.0</ve......

Funcy1122 ⋅ 32分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 58分钟前 ⋅ 16

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部