一、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.

Struts2:ValueStack的更多相关文章

  1. [转]Struts2数据传输的背后机制:ValueStack(值栈)

    1. 数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! 2. ValueStack基础:OGNL 要了解ValueStack,必须先理解OGNL ...

  2. Struts2数据传输的背后机制:ValueStack(值栈)

    1.     数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL 要了解ValueStack,必须先理解OGN ...

  3. Struts 中 ActionContext ctx.put()把数据放到ValueStack里之数据传输背后机制:ValueStack(值栈)

    1.     数据传输背后机制:ValueStack(值栈) 在这一切的背后,是因为有了ValueStack(值栈)! ValueStack基础:OGNL要了解ValueStack,必须先理解OGNL ...

  4. 浅析=======Struts2之==========valueStack

    今天刚学习了struts2的valueStack,在这里把自己学到的做个分享,说道valueStack就不得不提OGNL表达式=== struts2工作流程 1.OGNL(Object Graph N ...

  5. Struts2之ValueStack、ActionContext

    今天在看Action获取Resquest.Response时,发现了一个词:值栈.于是今天一天都在看,了解了值栈不仅能知道Action怎么获取request.response等这些,还会了解OGNL语 ...

  6. struts2:数据标签

    目录 数据标签1. a标签2. set标签3. push标签4. bean/param标签5. date标签6. include标签7. url标签8. property标签9. debug标签10. ...

  7. struts2 OGNL ValueStack概念理解 # % $ 的区别

    http://blog.csdn.net/tjujacob/article/details/8117659 —————————————————————————————————————————————— ...

  8. Struts2中ValueStack结构和总结

    [ValueStack和ActionContext的关系] 首先,从结构上来看ValueStack是ActionContext的一个组成部分,是对ActionContext功能的扩展.ActionCo ...

  9. (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

    转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml)   根据输入 ...

随机推荐

  1. memcache memcached 区别

    .目前大多数php环境里使用的都是不带d的memcache版本,这个版本出的比较早,是一个原生版本,完全在php框架内开发的.与之对应的带d的memcached是建立在libmemcached的基础上 ...

  2. LRU缓存算法 - C++版

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法. 实现思路: hashtable + 双向链表 时间复杂度: 插入,查找,删除:O(1) 空间使用 ...

  3. 数值统计 AC 杭电

    数值统计 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  4. Cocos2d粒子系统二

    粒子系统的属性: 粒子的发射速度 重力模式(模式A): 重力 方向 速度 +- 变动 切向加速度 +- 变动 径向加速度 +- 变动 半径模式(模式B): 开始半径 +- 变动 结束半径 +- 变动 ...

  5. Oracle基本分组查询group by的使用

    (1)查询各个工作岗位的总人数 (2)查询各个工作岗位的总工资 (3)查询各个工作岗位的平均工资

  6. mono环境变量

    mono环境变量 2013-05-11 01:14:33|  分类: mono|举报|字号 订阅     下载LOFTER我的照片书  |     Name mono - Mono's ECMA-CL ...

  7. xcode安装

    Xcode5.1默认不支持iOS5版本的模拟器开发调试,在OS X Mavericks(10.9.x)下默认只能支持iOS6.1及以上版本的模拟器,在OS X Mountain Lion(10.8.x ...

  8. Qt入门(1)——初识Qt

    Qt是一个跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器.Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta ...

  9. 2014-08-05 再次接触VBA

    今天是在吾索实习的第20天.本来今天的计划是完成BBS的界面的设计的,但是中途发生了一些小插曲,经理要求我帮忙用VBA实现EXCEL中表与表之间的动态联编,而且答应了客户明天就要看到成品了.所以只好放 ...

  10. HDU_2014——计算平均分

    Problem Description 青年歌手大奖赛中,评委会给参赛选手打分.选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分.   Input 输入数据有多组,每 ...