大红鹰葡京会Struts2_ValueStack,OGNL详解(转)struts ValueStack 详解。

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

一致、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个目标作为根本对象,需要加以#前缀.
       

一、OGNL表达式

(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.

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对象好导航及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)

大红鹰葡京会 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)&lt大红鹰葡京会;s:iterator />:取栈顶的元素.
在意:此标签的value属性值无论来自目标栈还是Map栈,都得以无加以#前缀(<s:select/>标签呢适用).
坐是标签在迭代底上,总是把目前正在迭代的要素放入到栈顶.

  

相关文章

admin

网站地图xml地图