`

struts2中的ValueStack学习

阅读更多
在 JSP 中,使用 struts2 的 <s:debug/> 标签,可以将 Value Stack 中的内容打印在 JSP 页面上展现出来。


理解ValueStack的基本机制


ValueStack基础:OGNL(Object Graphic Navigation Language)

OGNL是Struts2中使用的一种表达式语言。它可以用于:
  · 在JSP页面,使用标签方便的访问各种对象的属性;
  · 在Action中获取传递过来的页面中的参数(并进行类型转换);
  · 可以用在struts2的配置文件中!
所以,非常有必要理解OGNL的基本机制。


Root对象

OGNL称为对象图导航语言。
所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其它对象。
OGNL不支持多个root对象。

如:

package cn.com.leadfar.struts2.actions;
public class User {

    private String username;
    private Group group;

    public String getUsername() {
       return username;
    }
    public void setUsername(String username) {
       this.username = username;
    }
    public Group getGroup() {
       return group;
    }
    public void setGroup(Group group) {
       this.group = group;
    }

}

package cn.com.leadfar.struts2.actions;
public class Group {

    private String name;
    private Organization org;

    public String getName() {
       return name;
    }
    public void setName(String name) {
       this.name = name;
    }
    public Organization getOrg() {
       return org;
    }
    public void setOrg(Organization org) {
       this.org = org;
    }
}

 
package cn.com.leadfar.struts2.actions;
public class Organization {

    private String orgId; 

    public String getOrgId() {
       return orgId;
    }
    public void setOrgId(String orgId) {
       this.orgId = orgId;
    }
}


上面三个类,描述了通过一个User对象,可以导航到Group对象,
进而导航到Organization对象。
以User对象为根,一个对象图如下所示:

User(root)

   -- username
   -- group
      -- name
      -- org
         -- orgId



在真实的环境下,这个对象图可能会极其复杂,但是通过基本的getters方法,都应该能够访问到某个对象的其它关联对象。
【对象图的导航,必须通过getters方法进行导航】
下述代码将创建一个User对象,及其相关的一系列对象:

       User user = new User();
       Group g = new Group();
       Organization o = new Organization();
       
       o.setOrgId("ORGID");
       g.setOrg(o);
       user.setGroup(g);


如果通过JAVA代码来进行导航(依赖于getters方法),导航到Organization的orgId属性,如下所示:

//用JAVA来导航访问
user.getGroup().getOrg().getOrgId();


【注意:导航的目的,是为了获取某个对象的值或设置某个对象的值或调用某个对象的方法!】
【注意:OGNL表达式语言的真正目的,是为了在那些不能写JAVA代码的地方执行JAVA代码,或者是为了更方便地执行JAVA代码】
利用OGNL进行导航的代码如下:

       //利用OGNL表达式访问
       String value = (String)Ognl.getValue("group.org.orgId", user); 


Ognl.getValue()方法的第一个参数,就是一条OGNL表达式,第二个参数是指定在表达式中需要用到的root对象!



详细请参考官方的文档
https://struts.apache.org/docs/ognl.html

__________________________________

言归正传
__________________________________


ValueStack

Struts2是通过ValueStack来进行赋值与取值的。
ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值。

ValueStack中的数据,分两个部分存放:root和context
同时ValueStack暴露相关的接口(赋值和取值):
void setValue(String expr, Object value);
Object findValue(String expr);
通过OGNL表达式对ValueStack中的数据进行操作。

root

ValueStack中的root对象是CompoundRoot。
CompoundRoot继承了ArraryList,提供了额外的方法:push()和pop()方法,
用来对root对象中所包含的数据进行存取。
正是通过这两个方法,CompoundRoot变成了一个栈结构.
压栈操作,将导致对象被放到CompoundRoot的第0个元素上(第0个元素是栈顶),其它对象被依次往后移动;
出栈操作,将导致CompoundRoot的第0个元素被移除(即栈顶元素被弹出),其它对象被依次往前移动

OGNL只能访问被压入堆栈(CompoundRoot)中的元素。
在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入
ValueStack的CompoundRoot对象中。
所以Action对象是CompoundRoot对象中的一个元素,可以使用OGNL表达式直接访问。

在jSP页面中,使用<s:property value=”ognl表达式”/>标签,将CompoundRoot栈中的值取出。
在<s:property>标签中的OGNL表达式,最终会交给ValueStack来解释。
比如:"username"就是一个OGNL表达式,意思是调用root对象的getUsername()方法。



Context


由于在OGNL中,不支持多个root对象,但在struts2的OGNL的表达式中,
有可能需要访问到多个毫不相干的对象。这时候,我们把表达式中需要用到的对象放到Map中,
传递给OGNL,进行访问。这个Map对象,称为context。

可见valueStack对OGNL进行了扩展,使OGNL表达式可以访问到多个root对象。

要在表达式中访问到context中的对象,需要使用“#对象名称”的语法规则。
#表示将context对象的元素放入到CompoundRoot对象的栈顶。访问完后,
context对象的元素会从栈顶移出,自动释放。

当CompoundRoot栈中存在多个不相干的root对象时,使用 #root[n]. 进行访问,
n是root对象当前在栈中的顺序。从0开始。

请看下面的例子:

public class UserAction {

    private String username;

    //查看用户的详细信息
    public String detail(){

       username = "张三";      

       List list = new ArrayList();
       for(int i=0; i<10; i++){
           User user = new User();
           user.setUsername("User"+i);
           list.add(user);
       }

       ActionContext.getContext().put("users", list);      

       User u = new User();
       u.setUsername("赵毅");
       ActionContext.getContext().getValueStack().push(u);      

       return "detail";
    }
 


对应的JSP如下:

行1:  <s:property value="username"/> <br/>
行2:  <s:iterator value="#users">
行3:     <s:property value="username"/>
行4:     <s:property value="#root[2].username"/><br/>
行5:  </s:iterator>
行6:  <s:property value="username"/>
行7:  <s:property value="#root[1].username"/> <!-- 张三 -->


根据刚才的示例,我们知道,第1行的username是“赵毅”(因为JSP在执行这行代码的时候,CompoundRoot中有两个元素:第0个是“user对象赵毅”,第1个是“userAction对象张三”),因此第1行的username将取出CompoundRoot中第0个元素的username属性:赵毅

第2行代码是iterator标签,只定义了一个value属性,iterator标签将循环访问users这个List中的User对象,并把当前循环的user对象压入到CompoundRoot中!所以,在第3行和第4行代码被执行的时候,CompoundRoot中总共有3个元素:第0个元素是被iterator标签压入的当前循环的user对象;第1个元素是“user对象赵毅”;第2个元素是“userAction对象张三”,因此第3行代码的执行结果就是输出“UserX”,即当前循环的user对象的username属性!iterator标签将会依次取出List中的user对象,并不断压入/弹出user对象(每次循环,都将执行一遍压入/弹出)。而第4行代码取第2个元素的username属性,即userAction对象的username属性:张三。

第5行代码执行完成之后,在CompoundRoot中将剩下2个元素,与第2行代码被执行之前一样。所以,第6行代码的输出和第1行代码的输出结果是一样的,而第7行代码将取出userAction对象的username属性:张三


本文参考:

http://blog.sina.com.cn/s/blog_566be38401016jfp.html



-引用请注明
原文出处:http://lixh1986.iteye.com/blog/1739254











-
分享到:
评论
1 楼 kangwen23 2013-07-23  
谢谢了,顶顶

相关推荐

    struts2 学习资料

    这个压缩包中包含的资源是学习Struts2的关键资料,帮助开发者深入理解和掌握这个框架。 首先,"struts2权威指南"是学习Struts2的核心参考资料,通常会涵盖框架的基本概念、核心组件、配置细节、MVC设计模式的应用...

    struts2学习笔记(完美总结)——转自OPEN经验库

    OGNL是Struts2中用于对象属性访问和表达式语言,它允许在Action、ValueStack和视图层之间传递数据。ValueStack是一个对象栈,它持有ActionContext上下文中的所有对象,包括Action实例、ActionForm、Session、Request...

    java Struts2中文学习文档

    Struts2是Java Web开发中的一个强大框架,它在MVC(Model-View-Controller)设计模式的基础上,为开发者提供了一种高效、灵活且可扩展的解决方案。本篇文档将深入探讨Struts2的核心概念、架构以及实际应用,旨在帮助...

    Struts2学习文档

    OGNL(Object-Graph Navigation Language)是Struts2中用于表达式语言,它用于在Action、ValueStack和视图之间传递数据。OGNL允许在JSP或其他视图技术中动态访问Action的属性,进行条件判断和控制流程。 Struts2的...

    Struts2——教程

    在Struts2中,Model代表业务逻辑,View负责展示数据,Controller则协调Model和View之间的交互。Struts2使用ValueStack来存储和传递数据,使得数据可以在Action和JSP之间无缝流动。 四、配置与注解 Struts2支持XML...

    struts2学习struts2API库

    2. **Interceptor(拦截器)**: 拦截器是Struts2中的一大特色,它允许在Action执行前后插入自定义逻辑。例如,我们可以创建登录验证、日志记录或性能监控等拦截器。拦截器链的配置在struts.xml文件中完成,通过和...

    基于Struts2的个人信息管理系统

    在用户管理模块中,Struts2提供了丰富的动作类(Action)和结果(Result)配置,使得开发者可以轻松处理用户的登录、注册、权限验证等操作。通过ActionSupport基类和Interceptor拦截器,我们可以实现诸如验证码校验...

    struts2 接收参数

    在Struts2中,Action类是业务逻辑的载体,每个Action类对应一个或多个用户操作。当用户提交表单或者触发某个URL时,相关的Action会被调用。 Struts2提供了多种方式来接收参数: 1. **使用setter方法**:这是最基础...

    Struts2学习日志(一)

    XWork的核心概念包括Action、ActionContext和ValueStack,它们在Struts2中仍然扮演重要角色。 `ognl-2.6.11.jar`是Object-Graph Navigation Language的库,它是Struts2中表达式语言的实现。OGNL允许开发者在Action...

    struts2入门例子

    在Struts2中,`struts.xml`是核心配置文件,它是整个应用的入口点,负责定义动作(Actions)、结果(Results)、拦截器(Interceptors)等关键元素。让我们深入探讨一下`struts.xml`的基本配置: 1. **Action配置**...

    struts2-blank

    6. **ActionForm/POJOs**:在Struts2中,Action通常与简单的Java Bean或ActionForm对象交互,用来接收和封装HTTP请求中的参数。 7. **依赖注入**:Struts2支持依赖注入(DI),可以通过注解或XML配置将服务注入到...

    struts2测试案例

    6. **ValueStack**:ValueStack是Struts2中存储Action属性和请求参数的对象栈,使得在Action和JSP之间传递数据变得简单。 7. **Tiles框架集成**:Struts2可以与Tiles框架集成,方便地进行页面布局和组合。Tiles定义...

    struts2中常用jar包

    综上所述,这个压缩包中的源码和jar包对于学习和使用Struts2框架至关重要。它们不仅提供了一个完整的运行环境,还允许开发者深入理解框架内部机制,从而更好地利用Struts2构建高效、安全的Web应用程序。

    学习OGNL在Struts2中工作原理

    ### 学习OGNL在Struts2中的工作原理 #### OGNL简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架的一个核心特性之一,被广泛应用于框架的...

    Struts2基础教程.docx

    在Struts2中,可以使用ActionContext来获取请求参数和Session信息,使用ValueStack来存储和获取数据。Struts2也支持使用OGNL表达式来访问和操作数据。 Struts2提供了强大的标签库,包括s标签、sx标签、ui标签等,...

    struts2解析文件

    - **ValueStack**: Struts2中的ValueStack是一个对象栈,用于存储ActionContext中的数据。它可以简化视图层的数据访问,只需通过OGNL表达式即可访问栈中的对象。 - **OGNL(Object-Graph Navigation Language)**: ...

    struts2 2.09 java doc

    在Struts2中,Action是处理用户请求的核心对象,它可以定义一系列的执行方法,每个方法对应一个HTTP请求。Interceptor(拦截器)是Struts2的一大特色,它允许在Action执行前后插入自定义的处理逻辑,如权限检查、...

    Struts2中xwork源码

    通过深入学习XWork的源码,开发者能够理解Struts2框架的工作原理,优化性能,解决实际开发中的问题,同时也能为自定义插件和扩展提供基础。理解XWork的设计模式和核心机制,将有助于提升开发效率和代码质量,使项目...

    struts2学习笔记和源码

    在Struts2中,Action类充当Controller的角色,ActionForm或者ValueStack中的对象作为Model,JSP页面作为View。 三、Struts2的配置 Struts2的配置主要分为两部分:struts.xml和web.xml。struts.xml是核心配置文件,...

    struts2帮助手册(英文chm)

    在Struts2中,模型负责处理业务逻辑,视图负责展示数据,而控制器则协调这两个部分的工作。 **核心概念与组件** 1. **Action类**:这是业务逻辑的核心,处理HTTP请求,并通过调用服务层方法来执行业务逻辑。Action...

Global site tag (gtag.js) - Google Analytics