ValueStack就销毁了,  OGNL称为对象图导航语言

  因为ValueStack被置于Request域中。

一、ValueStack     1.ValueStack是三个接口,在struts第22中学动用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产生了七个栈结构. struts第22中学,四个乞求在最终达到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个对象作为根对象,必要加#前缀.
       

  6.ValueStack内部存款和储蓄器结构图

(2)ValueStack valueStack

ServletActionContext.getValueStack(ServletActionContext.getRequest());       
               

ServletActionContext承袭了ActionContext,它与web容器耦合,能够收获web容器的一对新闻.

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

    6.ValueStack内部存款和储蓄器结构图

图片 1

 

    一个是ArrayList,一个是Map

    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是struts第22中学使用的一种表达式语言,可用以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.

  (2)ValueStack valueStack =
ServletActionContext.getValueStack(ServletActionContext.getRequest());

(1)

  1.ValueStack是四个接口,在struts第22中学利用OGNL(Object-Graph Navigation
Language)表达式实际上是选取完结了ValueStack接口的类OgnlValueStack.它ValueStack的暗中认可完结类.

  7.常用的囤积数据的办法

图片 2

  原博文图涉及底层实现细节,该图是自己简化后,原博文图片(http://img.my.csdn.net/uploads/201212/04/1354620065_9013.png

  *
导航的指标,就是为着赢得某些对象的值或设置有些对象的值或调用某些对象的方法.

*
在OGNL表明式中,有相当大可能率须求拜会到多少个毫不相干的指标,那时候,大家要求给OGNL传递一个Map类型的对象,把表明式中要求使用的对象放置Map中就可以.而那几个Map对象称为Context。

*
在那之中的context对象是OgnlContext,它完成了map接口,在valuestack的暗中同意完结类中,即OgnlValueStack类中,调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可见,此格局重返的是三个OgnlContext对象.

以上多少个类,描述了经过User对象能够导航到Group对象,进而导航到Organization对象。以User为根,通过着力的getters方法,能够访谈到此根对象的别的关联对象.【对象图的导航,必须经过getters方法导航】。

ValueStack valueStack =ActionContext.getContext().getValueStack();
 valueStack.getRoot().add(new Person());

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

(1)ValueStack valueStack =
ActionContext.getContext().getValueStack(); 

  ServletActionContext.getRuquest().setAttribute(“username”,”xxx”) ;

*
struts2中,三个呼吁在最终达到Action的主意在此以前,Action对象自己会被压入ValueStack(实际上就是放到ValueStack
的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.

  *
存在context的最首要缘由正是在OGNL中,不补助八个root对象,而一旦供给在表明式中做客三个无关的靶猪时,只可以通过贰个Map来把这么些指标统一传递给OGNL。 

(2)

* 寄存一个map到对象栈中

1.ognl是struts第22中学使用的一种表达式语言,可用于jsp的标签库中,以有助于访谈各个对象的本性。它用于把分界面包车型地铁参数字传送递到Action中(并拓展类型转变),它还足以用来struts2的安插文件中。

  ServletActionContext.getSession().put(“pwd”,”123″);

  * 要在表达式访谈到context中的对象,须要动用”#对象名称”的语法则则

   直接向Map栈中存放数据:

 

    ActionContext为Action的上下文,个中有非常重要的6大目的valueStack,parameters,request,session,application,attr。而ognl表明式必须挑选AcitonContext中的一个目的作为根对象(root),默以为valueStack,因而访谈valueStack中的数据不加#,而一旦要利用另外5个对象作为根对象,供给加#前缀。

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方法  
}  

注意:    

  (2)向目的栈中存数据,即ValueStack中的root(CompoundRoot)对象

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

  

8.利用OGNL表达式取ValueStack中的数据

ValueStack valueStack =ActionContext.getContext().getValueStack(); 

valueStack.set("msg","dude"); //先封装成Map,在把Map放入到对象栈中,且放入栈顶.

(1)<s:property />:取栈顶的成分.
(2)<s:iterator />:取栈顶的成分.
专注:此标签的value属性值无论来自指标栈依然Map栈,都能够不加#前缀(<s:select/>标签也适用).
因为此标签在迭代的时候,总是把近来正在迭代的要素归入到栈顶.

2. Root对象。

一、OGNL表达式

  ActionContext.getContext().put(“msg”,”hello”) ;

 

ValueStack valueStack =ActionContext.getContext().getValueStack();

valueStack.push(new Person());

  * 先获得root,再把多少压入到root中,这中方法是归入到栈底

初稿地址:http://blog.csdn.net/wyply115/article/details/8257140

    通过request, session等向map中蕴藏数据:

  OGNL称为对象图导航语言,所谓指标图,即以随机八个指标为根,通过OGNL能够访谈与这几个指标关系的别样对象,比如:

  4.ValueStack中的数据分两片段寄存:root(栈结构,CompoundRoot)和context(map格局,OgnlContext) 

*
在那之中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了附加的章程:push(),和pop()方法,用来对root对象中所富含的数目开展存取.正是出于那七个法子,CompoundRoot产生了贰个栈结构.

ValueStack valueStack =ActionContext.getContext().getValueStack();

 valueStack.getRoot().add(0,new Person());//这里0,表示压入栈顶.

* 先获得root,利用add(index,Object)把一个对象压入到root中内定地点.

* 利用valueStack的push方法把贰个对象直接压入栈顶

  ServletActionContext承接了ActionContext,它与web容器耦合,能够获取web容器的一部分新闻.

  5.猎取ValueStack的三种方法

  *
OGNL表明式语言的真正目标,是为着在这三个不可能写java代码的地点试行java代码,恐怕是为了更方便的执行java代码.

二、ValueStack

  2.ValueStack贯通整个action的生命周期,每一个action实例都存有四个ValueStack对象,当中保存了现阶段action对象和任何相关对象.

  (1)向Map栈中存数据,即ValueStack中的context中蕴藏数据。

3.Context对象