`

Struts2中的valueStack

 
阅读更多



 Struts2中的ValueStack 

一、值栈 

 

值栈(ValueStack)是Struts 2  的一个核心概念,类似于正常的栈,符合后进先出的栈特点,可以在值栈中放入、删除和查询对象。Struts  2对OGNL进行了扩充,将值栈作为OGNL的根对象。  ValueStack实际上就是对OGNL的封装,OGNL主要的功能就是赋值与取值,Struts2正是通过ValueStack来进行赋值与取值的!

 


ValueStack是一个接口,而OgnlValueStack是strtus2中的缺省实现。ValueStack中的数据,分两个部分存放:root和context(这与OGNL中的概念一致),同时ValueStack暴露相关的接口:

void setValue(String expr, Object value);

Object findValue(String expr);

用来通过OGNL表达式对ValueStack中的数据进行操作!


二、栈的基本操作 

 

ValueStack中的root对象是CompoundRoot,CompoundRoot继承了ArraryList,提供了额外的方法:push()和pop()方法,用来对root对象中所包含的数据进行存取!

public class CompoundRoot extends ArrayList {

 

    public CompoundRoot() {

    }

 

    public CompoundRoot(List list) {

        super(list);

    }

 

 

    public CompoundRoot cutStack(int index) {

        return new CompoundRoot(subList(index, size()));

    }

 

    public Object peek() {

        return get(0);

    }

 

    public Object pop() {

        return remove(0);

    }

 

    public void push(Object o) {

        add(0, o);

    }

}
 

 

正是通过这两个方法,CompoundRoot变成了一个栈结构!压栈操作,将导致对象被放到CompoundRoot的第0个元素上(第0个元素 是栈顶),其它对象被依次往后移动;出栈操作,将导致CompoundRoot的第0个元素被移除(即栈顶元素被弹出),其它对象被依次往前移动!

 

OGNL不支持多个root对象,而struts2能够支持多个root对象,它对OGNL做了扩展。

如果某个OGNL表达式被传递给ValueStack(即调用ValueStack的setValue或findValue方法),而表达式中包含 有对root对象的访问操作,ValueStack将依次从栈顶往栈底搜索CompoundRoot对象中所包含的对象,看哪个对象具有相应的属性,找到 之后,立刻返回。

 

在Struts2中,一个请求在最终到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是CompoundRoot中的一个元素。看下面的代码:

public class UserAction {

    private String username;

    private Integer age;

    private boolean valid;

    

    //查看用户的详细信息

    public String detail(){

       

       username = "张三";

       age = 18;

       valid = true;

       

       return "detail";

    }
 

在Action中,给Action的username/age/valid赋值。Detail页面如下:

username:<s:property value="username"/> <br/>

valid:<s:property value="valid"/> <br/>

age:<s:property value="age"/> <br/>
 

上述JSP页面将能正确将它们的值取出。<s:property  value=”ognl表达式”/>。在s:property标签中的OGNL表达式,最终会交给ValueStack来解释。username就 是一个OGNL表达式,意思是调用root对象的getUsername()方法。Struts2将自动搜索CompoundRoot中有哪些元素(从第 0个元素开始搜索),检测这些元素是否有getUsername()方法,如果第0个元素没有getUsername()方法,将继续搜索第1、2、 3……个元素是否有getUsername()方法。

 

在上面的例子中,CompoundRoot中只有一个对象,就是userAction对象,而这个对象中正好有getUsername()方法,所以,上述JSP代码将能够将值正确取出。

再看下面的例子:

public class UserAction {

    private String username;

    private String name;

    

    //查看用户的详细信息

    public String detail(){

       username = "张三";

       name = "王五";

       

       User u = new User();

       u.setUsername("赵毅");

       ActionContext.getContext().getValueStack().push(u);

       

       return "detail";

    }
 

在上面这个UserAction的代码中,我们直接调用 ActionContext.getContext().getValueStack().push()方法,把一个User对象(这个对象拥有 getUsername()和setUsername()方法)直接压入到ValueStack中,这时候,在ValueStack的 CompoundRoot中将有两个元素:第0个元素是刚刚压入的user对象[赵毅],而第1个元素是userAction对象[张三],如果在JSP 中使用下面的表达式来取值:

<s:property value=”username”/> ,那么输出的值将是“赵毅”!道理上面已经讲过了,struts2将会从第0个元素开始搜索CompoundRoot中的对象,第0个元素正是刚刚压入的那个user对象!

如果在JSP中使用<s:property value=”name”/>来取值,将取出“王五”,因为第0个元素user对象没有name属性,所以,会继续搜索第1个元素userAction对象,在这个对象中就有name属性了!

 

三、值栈中的Action对象 

Struts 2总是把Action实例放置在栈顶。因为Action在值栈中,而值栈又是OGNL的根,所有引用Action的属性可以省略 “#”标记,这就是可以在结果页面中直接访问Action的原因

   <s:property value="username"/>

如果访问ActionContext中的其他对象,则必须使用“#”标记,以便让OGNL知道不要在根对象中查找,而是查看其他非根对象

  • 大小: 29.6 KB
分享到:
评论

相关推荐

    Struts2中关于ValueStack的一些操作

    1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是...

    Struts中的ognl和valueStack

    深入讲解Struts中的ognl和valueStack

    struts2jar包

    在Struts2中,OGNL用于传递Action与视图之间的数据,以及在拦截器中进行表达式计算。 4. **struts2-convention-plugin.jar**:这是Struts2的约定优于配置插件,它简化了Action类和结果配置,使得开发者可以按照一定...

    马士兵Struts2笔记2013

    在Struts2中,你可以创建领域对象,通过setter和getter方法来接收和设置请求参数,这些对象可以在多个Action之间共享,提高了代码的复用性。 4. **Struts2_2.1.6版本的中文问题** 在某些版本的Struts2中,可能出现...

    struts1和struts2的区别

    - **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...

    Struts2——教程

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

    Struts1和Struts2的区别和对比

    页面绑定方面,Struts1依赖JSP标准机制,而Struts2采用ValueStack技术,允许taglib直接访问值栈中的对象,无需在视图和对象之间建立直接绑定,提高了重用性。 在类型转换上,Struts1的ActionForm属性通常是String...

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

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

    struts2 接收参数

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

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

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

    struts2中获得request对象

    在Struts2中,`ValueStack`提供了一组隐含对象,其中包括`request`。我们可以直接在Action类中通过`@Inject`注解或OGNL表达式来访问: ```java // 使用注解 @Inject private HttpServletRequest request; //...

    struts2中的ActionContext与ognl

    ActionContext是Struts2框架中一个关键的组件,它提供了当前请求上下文的信息,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于在模型和视图之间进行数据传递。下面将详细探讨这两个...

    struts2实现文件下载功能

    在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...

    Struts2中访问web元素的例子

    Struts2中的ValueStack是模型部分的重要组成部分,它可以方便地处理Action对象与页面之间的数据传递。我们可以在Action中直接通过栈顶对象(通常是Action实例)的属性来获取和设置请求参数。例如: ```java ...

    Struts2值栈的理解

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

    - **Action类**:在Struts2中,Action类是业务逻辑的载体,它处理用户请求并返回结果。 - **Result类型**:Struts2支持多种Result类型,如`dispatcher`(默认),`stream`,`freemarker`等,JSON结果类型允许将...

Global site tag (gtag.js) - Google Analytics