它仍是可以用于struts2的安插文件中,.struts2把ValueStack对象保存在名为

*
其中的root对象是CompoundRoot,CompoundRoot继承了ArrayList,提供了额外的主意:push(),和pop()方法,用来对root对象中所包蕴的数目举办存取.正是出于那三个方法,CompoundRoot变成了一个栈结构.

一、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内存结构图

图片 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是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.

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

  因为ValueStack被置于Request域中。

  2.ValueStack连贯整个action的生命周期,每一个action实例都有所一个ValueStack对象,其中保存了当前action对象和其余相关对象.

*
在OGNL表达式中,有可能要求拜访到多少个毫不相干的靶子,那时候,我们须求给OGNL传递一个Map类型的对象,把表明式中要求动用的目的放置Map中即可.而那些Map对象称为Context。

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

 

3.Context对象

  ServletActionContext继承了ActionContext,它与web容器耦合,可以博得web容器的局地信息.

8.用到OGNL说明式取ValueStack中的数据

  1.ValueStack是一个接口,在struts2中使用OGNL(Object-Graph Navigation
Language)表明式实际上是使用落成了ValueStack接口的类OgnlValueStack.它ValueStack的默许完成类.

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

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

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

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

上述三个类,描述了经过User对象可以导航到Group对象,进而导航到Organization对象。以User为根,通过着力的getters方法,可以访问到此根对象的其他关联对象.【对象图的导航,必须通过getters方法导航】。

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

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

一、OGNL表达式

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

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

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

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

  * 先得到root,再把数据压入到root中,那中艺术是放入到栈底

    通过request, session等向map中存储数据:

    ActionContext为Action的上下文,其中有紧要的6大目的valueStack,parameters,request,session,application,attr。而ognl表明式必须选拔AcitonContext中的一个目的作为根对象(root),默许为valueStack,因而访问valueStack中的数据不加#,而一旦要动用此外5个对象作为根对象,要求加#前缀。

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

*
其中的context对象是OgnlContext,它落成了map接口,在valuestack的默许完毕类中,即OgnlValueStack类中,调用ongl中的方法:Ognl.createDefaultContext(..)给context赋值,查看源代码可见,此措施再次回到的是一个OgnlContext对象.

  OGNL称为对象图导航语言,所谓目的图,即以随机一个目的为根,通过OGNL可以访问与那一个目标关联的其余对象,例如:

2. Root对象。

二、ValueStack

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

图片 2

1.ognl是struts2中利用的一种表达式语言,可用于jsp的标签库中,以造福访问各类对象的属性。它用于把界面的参数传递到Action中(并开展类型转换),它还足以用来struts2的配置文件中。

  * 要在表明式访问到context中的对象,需求利用”#目的名称”的语法规则

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

  

  6.ValueStack内存结构图

(1)

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

  *
存在context的最首要原因就是在OGNL中,不援救三个root对象,而尽管要求在表明式中走访几个无关的目的时,只能通过一个Map来把这个目的统一传递给OGNL。 

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

(1)<s:property />:取栈顶的元素.
(2)<s:iterator />:取栈顶的元素.
留意:此标签的value属性值无论来自目的栈仍然Map栈,都可以不加#前缀(<s:select/>标签也适用).
因为此标签在迭代的时候,总是把当下正在迭代的因素放入到栈顶.

* 存放一个map到目标栈中

(2)

   直接向Map栈中存放数据:

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

  *
OGNL表明式语言的的确目标,是为着在那个不能写java代码的地点执行java代码,或者是为了更有益于的进行java代码.

  原博文图提到底层完毕细节,该图是自我简化后,原博文图片(http://img.my.csdn.net/uploads/201212/04/1354620065_9013.png

  5.拿走ValueStack的三种方法

  7.常用的贮存数据的不二法门

  4.ValueStack中的数据分两部分存放:root(栈结构,CompoundRoot)和context(map情势,OgnlContext) 

 

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

valueStack.push(new Person());

*
struts2中,一个请求在最后到达Action的章程以前,Action对象自我会被压入ValueStack(实际上就是置于ValueStack
的CompoundRoot中),所以action对象是CompoundRoot中的一个元素.

* 先拿到root,利用add(index,Object)把一个对象压入到root中指定地方.

相关文章