`
softlife
  • 浏览: 109218 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于ValueStack

阅读更多
关于ValueStack的描述:

1、  ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。

2、  EL,全称Express Language,即表达式语言。不要被语言吓倒,它是简单的对象导航语言。有字符串(例如:方法名)和特殊字符组成(例如用.表示调用对应的属性方法)。通过EL,我们可以存、取对象数据,而且还可以直接访问类的静态数据,调用静态方法。

3、  WebWork的ValueStack底层有第三方开源项目OGNL实现。所以EL也都遵循OGNL的规范。我们在开发中,几乎不需要知道OGNL的细节。

4、  WebWork为每一次请求构建一个ValueStack,并将所有相关的数据对象(例如:Action对象、Model对象等)放到ValueStack中。再将ValueStack暴露给视图页面,这样页面就可以直接访问后台处理生成的数据。

下面我们用一个雇员类为例,使用Junit框架(单元测试框架)来展示ValueStack的功能。

我们有一个Employee类,它有两个属性:姓名,地址。姓名是一个字符串,地址是一个对象,地址类有国家、城市、街道三个属性。代码如下:


Employee.java代码如下:

public class Employee { 

      private String name;     

      private Address address; 

      

      public Employee() { 

      }      

      public String getName() { 

            return name; 

      }  

      public void setName(String name) { 

            this.name = name; 

      }  

      public Address getAddress() { 

            if(address == null) 

                  address = new Address(); 

            return address; 

      }      

      public void setAddress(Address address) { 

            this.address = address; 

      } 

} 

 

Address.java代码如下:

public class Address {

            private String country;

            private String city;

            private String street;

            

            ……

            //默认的Get和Set方法,省略

            

}


下面出场的是OgnlValueStackTest,它有两个测试方法。分别测试使用EL从ValueStack中取值和存值。代码如下:

import com.opensymphony.xwork.util.OgnlValueStack;

import junit.framework.TestCase;

  

public class OgnlValueStackTest extends TestCase {

            private OgnlValueStack valueStack;

            private Employee employee;

            

            @Override

            protected void setUp() throws Exception {

                        valueStack = new OgnlValueStack();

                        employee = new Employee();

                        valueStack.push(employee);

            }

  

            public void testCouldGetDataFromObjectInOgnlValueStackByEL() throws Exception{

                        employee.setName("Moxie");

                        Address address = new Address();

                        address.setCountry("China");

                        employee.setAddress(address);

                        

                        assertEquals("Moxie",valueStack.findValue("name"));

                        assertEquals("China",valueStack.findValue("address.country"));

            }

            

            public void testCouldSetDataForObjectInOgnlValueStackByEL() throws Exception{

                        valueStack.setValue("name","Moxie");

                        valueStack.setValue("address.country","China");

                        

                        assertEquals("Moxie",employee.getName());

                        assertEquals("China",employee.getAddress().getCountry());

            }

}

这是一个Junit Test,关于Junit的使用不是本篇文章的范畴。作为一个Java开发者,熟悉这样的测试框架是最基本的要求。setUp方法在每个测试方法调用之前都会执行,它用来初始化每个测试方法都需要的对象和数据。我们的setUp方法首先创建两个对象:valueStack对象和employee对象,然后将employee对象入栈。这样,emloyee对象就在值堆栈的最上端。

第一个测试方法testCouldGetDataFromObjectInOgnlValueStackByEL测试可以用表达式语言取得值堆栈里的对象数据。我们首先为值堆栈里的employee对象设置数据,设置了用户名和用户地址所在的国家。

第一个验证断言             assertEquals("Moxie",valueStack.findValue("name"))解释为:我们期望使用表达式语言“name”去ValueStack中查找得到的对象是”Moxie”。即期望valueStack.findValue("name")语句执行返回的数据是”Moxie”对象。再深入下去,这条语句会调用ValueStack里对象的getName方法(即employee对象的getName方法),并返回这个方法返回的数据。

第二个断言assertEquals("China",valueStack.findValue("address.country"))。它期望表达式语言“address.country”取得的数据是对象的address属性对象的country属性,即取得雇员对象的地址所在的国家。深入下去,它也就是调用对象employee的getAddress().getCountry()方法。  第二个测试方法testCouldSetDataForObjectInOgnlValueStackByEL测试通过表达式语言为ValueStack中的对象设置数据。

第一个设值语句valueStack.setValue("name","Moxie"),它通过表达式语言“name”将“”Moxie””赋值给ValueStack里的对象,即调用值堆栈中的对象的setName方法,并把后面的值作为方法的参数。同理,第二个设置语句会调用值堆栈中的对象的getAddress().setCountry()方法,把后面的数据作为setCountry方法的参数。

 

看了这个例子,我们就会知道如何通过ValueStack进行数据的存取。在我们使用ValueStack时需要注意:

1、  所有存取操作的目标对象都是已放入ValueStack中的对象。所以在使用之前,必须要先将对象入栈。例如我们在setup方法中的语句:valueStack.push(employee)。

2、  每一次WebWork请求,在创建Action对象之前都会先生成一个ValueStack对象,再将Action对象入栈。这样我们就可以通过表达式语言来直接存取action对象的数据,所以在WebWork中,action具有数据模型的功能。

3、  在对ValueStack进行存取操作时,我们的操作指令(表达式语言)并不知道它是对哪个对象进行操作。例如,我们在获取员工姓名时,我们给的操作指令是”name”,这时,并不知道ValueStack里面的对象一定就是employee。ValueStack会从上而下,遍历栈里面的对象,并试图调用当前遍历对象的getName方法,当它找到了这个方法,并执行之后,就会将执行得到的数据返回。这就是那神秘的ValueStack。

4、  关于值堆栈的context map,它是一个放置值堆栈上下文数据的对象。通过符号“#“再加上对象的名称,可以访问这些数据(只可以访问)。一些JavaServlet相关的数据都放在这个容器中。这个对webwork的标签库特别有用,这样我们可以直接通过表达式语言去访问request、attribute、session、application里的数据。例如:用property标签库打印出所有请求参数的数据,代码如下:<ww:property value="%{#request}"/>。

5、  其它。“top”是ValueStack里面的关键字,通过它可以找到ValueStack中最上面的那个对象。可以试着打印一下valueStack.findValue("top"))看看。表达式语言除了可以调用基于JavaBean规范的get和set方法之外,还可以调用一般的Java方法(这是需要使用方法的全名,并传入需要的参数),也可以直接访问Java类的静态字段和静态方法。具体的使用,可以查看WebWork的官方文档。

 

分享到:
评论

相关推荐

    Struts2中关于ValueStack的一些操作

    关于ValueStack的描述: 1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式...

    ValueStack使用参考

    **ValueStack使用参考** ValueStack是Struts2框架中的核心组件之一,它是ActionContext和...在线培训资料中可能包含了更多关于ValueStack的实际操作示例和深入讲解,建议仔细学习,以提升对Struts2的理解和应用能力。

    在线培训:ValueStack

    在【在线培训学习资料】的压缩包中,你将找到关于这些知识点的详细PPT教程,涵盖了理论讲解、实例演示和可能遇到的问题及解决方案。通过深入学习,开发者将能够熟练掌握栈数据结构的运用,理解Struts2框架中的...

    Struts中的ognl和valueStack

    深入讲解Struts中的ognl和valueStack

    s20505_valueStack_OGNL

    在给定的压缩包文件“s20505_valueStack_OGNL”中,我们关注的核心知识点是Struts2中的OGNL(Object-Graph Navigation Language)和相关标签的使用。OGNL是Struts2默认的表达式语言,用于在视图层和控制器层之间传递...

    Struts用的ognl和valueStack(vs)实例

    Struts是Java Web开发中的一个开源框架,它主要用于构建基于MVC(Model-View-Controller)模式的应用程序。在Struts中,OGNL(Object-Graph Navigation Language)和Value Stack(VS)是两个核心概念,它们对于理解...

    很全面的struts2_ognl总结

    OGNL(Object-Graph Navigation Language)是一种基于 Java 的表达式语言,Struts2 框架中使用 OGNL 来访问和操作 ValueStack 中的对象。在 Struts2 中,OGNL 是一个强大的工具,允许开发者访问和操作 ValueStack 中...

    linjin101#javaStudy#Struts2中的OGNL和值栈ValueStack1

    1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据

    struts2框架面试题及答案02

    根据给定的信息,我们将深入探讨Struts2框架中的一些核心概念,包括OGNL表达式的使用、ValueStack的理解及其数据存取方法,以及拦截器的生命周期等。 ### OGNL表达式及其三要素 #### OGNL简介 OGNL(Object-Graph ...

    struts学习笔记(3)

    - **`ValueStack`**:每当一个新的请求被处理时,Struts2都会为该请求创建一个`ValueStack`实例。`ValueStack`的主要职责是存储请求过程中的数据,并且它支持通过属性名的方式来访问这些数据。当一个Action执行完毕...

    Struts2值栈的理解

    ValueStack 对象在 Struts2 中扮演着非常重要的角色,它将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到 Action 对象,并将 ValueStack 对象中的属性的值终值赋给 Action 类...

    浅谈Strut2如何对请求参数的封装

    这是通过Struts2的内建机制实现的,其中ValueStack对象起着至关重要的作用。ValueStack是一个数据结构,它像一个栈一样,用于存储Action类的属性和它们的值。当一个HTTP请求到达时,Struts2会创建Action类的一个实例...

    JavaEE ActionContext存取数据示例

    ActionContext提供了在Action、Servlet、ValueStack以及其他的Struts2组件之间传递数据的桥梁。在这个“JavaEE ActionContext存取数据示例”中,我们将深入探讨ActionContext的使用方法及其与OGNL(Object-Graph ...

    xwork-sources

    struts2.0 ValueStack 相关源码

    传智168期JavaEE struts2杜宏 day32~day33笔记

    - **ValueStack的实现**:ValueStack有一个实现类叫做OgnlValueStack。 - **ValueStack的生命周期**:与HTTP请求的生命周期一致,每个请求对应一个ValueStack实例。 - **ValueStack的内容**:除了包含当前Action对象...

    Struts2访问request,session,application的四种方式

    同样,`ValueStack.push()`和`ValueStack.pop()`可以将对象压入和弹出栈,从而实现数据在不同范围间的传递。 3. **OGNL (Object-Graph Navigation Language)**: OGNL是Struts2中强大的表达式语言,它允许开发者...

    第一个struts2

    5. **理解ValueStack的工作原理**:了解如何通过ValueStack将Action类的属性暴露给视图,以及如何使用OGNL表达式来访问复杂的属性路径。 6. **运行和测试**:启动服务器,访问应用,提交表单,观察Struts2如何处理...

    中缀转后缀计算表达式的值

    std::cout 表达式的值为:" &lt;&lt; valueStack.top() ; return 0; } ``` 这个C++程序演示了如何处理一个后缀表达式并计算其值。当然,实际应用中,我们需要对输入的中缀表达式进行转换,这通常涉及到更复杂的逻辑,...

    赵栋struts2 笔记

    - 第三种:直接从HttpServletRequest对象的属性中获取,`ValueStack valueStack3 = ServletActionContext.getRequest().getAttribute("struts.valueStack");` 4. **值栈的结构**: 值栈实际上是一个OgnlContext的...

Global site tag (gtag.js) - Google Analytics