Struts2_ValueStack,OGNL详解(转)

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

一、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个目的作为根对象,需求加#前缀.
       

一、OGNL表达式

(2)ValueStack valueStack

ServletActionContext.getValueStack(ServletActionContext.getRequest());       
               

ServletActionContext承继了ActionContext,它与web容器耦合,能够赢得web容器的一部分新闻.

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

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

lovebet爱博体育 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.

1.ognl是struts第22中学央银行使的一种表明式语言,可用以jsp的标签库中,以福利访问各类对象的品质。它用来把分界面包车型地铁参数字传送递到Action中(并拓展类型调换),它还能用于struts2的布署文件中。

2. Root对象。

lovebet爱博体育,  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对象能够导航到Group对象,进而导航到Organization对象。以User为根,通过骨干的getters方法,能够访问到此根对象的任何关联对象.【对象图的导航,必须通过getters方法导航】。

注意:    

  *
导航的目标,正是为着获取有些对象的值或安装有些对象的值或调用某些对象的方法.

  *
OGNL表明式语言的确实目标,是为了在那多少个不能写java代码的地点实行java代码,可能是为着更方便人民群众的进行java代码.

3.Context对象

*
在OGNL表达式中,有望必要拜会到多个毫不相干的目的,那时候,我们须要给OGNL传递叁个Map类型的靶子,把表达式中需求选拔的对象放置Map中就可以.而这一个Map对象称为Context。

 

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

 

  *
存在context的基本点缘由就是在OGNL中,不支持三个root对象,而要是供给在表明式中访谈七个毫无干系的指标时,只可以通过八个Map来把那个指标统一传递给OGNL。 

二、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”);

  因为ValueStack被置于Request域中。

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

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

lovebet爱博体育 2

  7.常用的蕴藏数据的格局

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

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

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

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

   直接向Map栈中寄存数据:

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

  (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/>标签也适用).
因为此标签在迭代的时候,总是把前段时间正值迭代的因素放入到栈顶.

  

相关文章