Struts2_ValueStack,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");

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.

参考文章:http://blog.csdn.net/wyply115/article/details/8257140

时间: 2025-01-07 21:29:31

Struts2_ValueStack,OGNL详解的相关文章

Struts2_ValueStack,OGNL详解(转)

原文地址:http://blog.csdn.net/wyply115/article/details/8257140 一.OGNL表达式 1.ognl是struts2中使用的一种表达式语言,可用于jsp的标签库中,以方便访问各种对象的属性.它用于把界面的参数传递到Action中(并进行类型转换),它还可以用于struts2的配置文件中. 2. Root对象. OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象,例如: public clas

【转】Struts2中的OGNL详解 (1)

 转载声明:菰☆淚 - Struts2中的OGNL详解 首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlCont

【转】Struts2中的OGNL详解 (2)

转载声明:菰☆淚 -Struts2中的OGNL详解 总结OGNL的使用方法: 访问属性 名字属性获取:<s:property value="user.username"/><br> 地址属性获取:<s:property value="user.address.addr"/><br> 访问方法 调用值栈中对象的普通方法:<s:property value="user.get()"/><

Struts2中的OGNL详解

首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个JavaBean对象.

Struts2中的OGNL详解 《转》

首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. 此外,还得先需弄懂OGNL的一些知识: 1.OGNL表达式的计算是围绕OGNL上下文进行的. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个JavaBean对象.

Struts2之Ognl详解

一.学习案例:通过程序理解OGNL. 二.案例分析:OGNL(对象图导航语言)是通过struts2的标签进行调用的.对于OGNL的学习,我们用程序在控制台输出的形式让大家进行了解. 在我们正式学习OGNL之前,我们要知道两个对象:根对象和上下文对象.比如一个双层饭盒,上面一层就是根对象,下面一层就是上下文对象. 根对象中的元素我们可以直接在el表达式和struts2标签中直接使用. 上下文对象中的元素我们在使用时要在元素前面加上#. 在页面中以图形的形式查看OGNL就要使用struts2的标签<

struts2中ognl标签详解

<body> <s:set name="age" value="61" /> <!-- if elseif else 参数test:决定标志里的内容是否显示的表达式,类型boolean 注:else标志没有这个参数 --> <h3>if语句</h3> <s:if test="{age>60}"> 老年人 </s:if> <s:elseif test=&

Struts2中 Result类型配置详解(转)

一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwork2.Action接口中定义了一组标准的结果代码,可供开发人员使用,当然了只有我们的action继承ActionSupport 这个类才可以使用下面的结果代码,如下所示:public interface Action{    public static final String SUCCESS =

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种