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知道不要在根对象中查找,而是查看其他非根对象
相关推荐
1、 ValueStack其实就是一个放置Java对象的堆栈而已,唯一特别的是可以使用EL来获得值堆栈中对象属性的数据,并可以为值堆栈的对象属性赋值。 2、 EL,全称Express Language,即表达式语言。不要被语言吓倒,它是...
深入讲解Struts中的ognl和valueStack
在Struts2中,OGNL用于传递Action与视图之间的数据,以及在拦截器中进行表达式计算。 4. **struts2-convention-plugin.jar**:这是Struts2的约定优于配置插件,它简化了Action类和结果配置,使得开发者可以按照一定...
在Struts2中,你可以创建领域对象,通过setter和getter方法来接收和设置请求参数,这些对象可以在多个Action之间共享,提高了代码的复用性。 4. **Struts2_2.1.6版本的中文问题** 在某些版本的Struts2中,可能出现...
- **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...
在Struts2中,Model代表业务逻辑,View负责展示数据,Controller则协调Model和View之间的交互。Struts2使用ValueStack来存储和传递数据,使得数据可以在Action和JSP之间无缝流动。 四、配置与注解 Struts2支持XML...
页面绑定方面,Struts1依赖JSP标准机制,而Struts2采用ValueStack技术,允许taglib直接访问值栈中的对象,无需在视图和对象之间建立直接绑定,提高了重用性。 在类型转换上,Struts1的ActionForm属性通常是String...
在用户管理模块中,Struts2提供了丰富的动作类(Action)和结果(Result)配置,使得开发者可以轻松处理用户的登录、注册、权限验证等操作。通过ActionSupport基类和Interceptor拦截器,我们可以实现诸如验证码校验...
在Struts2中,Action类是业务逻辑的载体,每个Action类对应一个或多个用户操作。当用户提交表单或者触发某个URL时,相关的Action会被调用。 Struts2提供了多种方式来接收参数: 1. **使用setter方法**:这是最基础...
OGNL是Struts2中用于对象属性访问和表达式语言,它允许在Action、ValueStack和视图层之间传递数据。ValueStack是一个对象栈,它持有ActionContext上下文中的所有对象,包括Action实例、ActionForm、Session、Request...
在Struts2中,`ValueStack`提供了一组隐含对象,其中包括`request`。我们可以直接在Action类中通过`@Inject`注解或OGNL表达式来访问: ```java // 使用注解 @Inject private HttpServletRequest request; //...
ActionContext是Struts2框架中一个关键的组件,它提供了当前请求上下文的信息,而OGNL(Object-Graph Navigation Language)则是Struts2中的表达式语言,用于在模型和视图之间进行数据传递。下面将详细探讨这两个...
在这个“Struts2实现文件下载功能”的示例中,我们将深入探讨如何利用Struts2框架来实现在web应用中让用户下载文件的功能。 首先,我们需要理解文件下载的基本原理。在Web应用中,当用户点击一个链接或提交一个表单...
Struts2中的ValueStack是模型部分的重要组成部分,它可以方便地处理Action对象与页面之间的数据传递。我们可以在Action中直接通过栈顶对象(通常是Action实例)的属性来获取和设置请求参数。例如: ```java ...
ValueStack 对象在 Struts2 中扮演着非常重要的角色,它将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到 Action 对象,并将 ValueStack 对象中的属性的值终值赋给 Action 类...
在Struts2中,`struts.xml`是核心配置文件,它是整个应用的入口点,负责定义动作(Actions)、结果(Results)、拦截器(Interceptors)等关键元素。让我们深入探讨一下`struts.xml`的基本配置: 1. **Action配置**...
6. **ActionForm/POJOs**:在Struts2中,Action通常与简单的Java Bean或ActionForm对象交互,用来接收和封装HTTP请求中的参数。 7. **依赖注入**:Struts2支持依赖注入(DI),可以通过注解或XML配置将服务注入到...
6. **ValueStack**:ValueStack是Struts2中存储Action属性和请求参数的对象栈,使得在Action和JSP之间传递数据变得简单。 7. **Tiles框架集成**:Struts2可以与Tiles框架集成,方便地进行页面布局和组合。Tiles定义...
- **Action类**:在Struts2中,Action类是业务逻辑的载体,它处理用户请求并返回结果。 - **Result类型**:Struts2支持多种Result类型,如`dispatcher`(默认),`stream`,`freemarker`等,JSON结果类型允许将...