Java中Struts2的值栈ValueStack详解

 更新时间:2023年08月07日 11:15:46   作者:吴声子夜歌  
这篇文章主要介绍了Java中Struts2的值栈ValueStack详解,值栈(ValueStack)就是 OGNL 表达式存取数据的地方,在一个值栈中,封装了一次请求所需要的所有数据,需要的朋友可以参考下

值栈

值栈(ValueStack)就是 OGNL 表达式存取数据的地方。

在一个值栈中,封装了一次请求所需要的所有数据。

在使用 Struts2 的项目中,Struts2 会为每个请求创建一个新的值栈,也就是说,值栈和请求是一一对应的关系,这种一一对应的关系使值栈能够线程安全地为每个请求提供公共的数据存取服务。

1.值栈的作用

值栈可以作为一个数据中转站在前台与后台之间传递数据,最常见的就是将 Struts2 的标签与 OGNL 表达式结合使用。

值栈实际上是一个接口,在 Struts2 中利用 OGNL 时,实际上使用的就是实现了该接口的 OgnlValueStack 类,这个类是 OGNL 的基础。

2.值栈的声明周期

值栈贯穿整个 Action 的生命周期,每个 Action 类的对象实例都拥有一个 ValueStack 对象,在 ValueStack 对象中保存了当前 Action 对象和其他相关对象。

Struts2 框架把 ValueStack 对象保存在一个名为 struts.valueStack 的 request 属性中,也就是说,值栈与 Action 的生命周期一致。值栈的生命周期随着 request 的创建而创建,随着 request 的销毁而销毁。

3.值栈的获取方式

要获取值栈中存储的数据,首先应该获取值栈。

值栈的获取有两种方式,具体如下。

1) 在request中获取值栈

ValueStack 对象在 request 范围内的存储方式为 request.setAttribute(“struts.valueStack”,valuestack),可以通过如下方式从 request 中取出值栈的信息。

//获取 ValueStack 对象,通过 request 对象获取
ValueStack valueStack = (ValueStack)ServletActionContext.getRequest()
            .getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

ServletActionContext.STRUTS_VALUESTACK_KEY 是 ServletActionContext 类中的常量,它的值为 struts.valueStack。

2)在ActionContext中获取值栈

在使用 Struts2 框架时,可以使用 OGNL 操作 Context 对象从 ValueStack 中存取数据,也就是说,可以从 Context 对象中获取 ValueStack 对象。实际上,Struts2 框架中的 Context 对象就是 ActionContext。

ActionContext 获取 ValueStack 对象的方式如下所示:

//通过 ActionContext 获取 valueStack 对象
ValueStack valueStack = ActionContext.getContext().getValueStack();

ActionContext 对象是在 StrutsPrepareAndExcuteFilter 的 doFilter() 方法中被创建的,在源码中用于创建 ActionContext 对象的 createActionContext() 方法内可以找到获取的 ValueStack 对象的信息。

方法中还有这样一段代码:

ctx=new ActionContext(stack.getContext());

从上述代码中可以看出,ValueStack 对象中的 Context 对象被作为参数传递给了 ActionContext 对象,这也就说明 ActionContext 对象中持有了 ValueStack 对象的引用,因此可以通过 ActionContext 对象获取 ValueStack 对象。

到此这篇关于Java中Struts2的值栈ValueStack详解的文章就介绍到这了,更多相关Struts2的值栈ValueStack内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • maven包冲突排查的解决方法

    maven包冲突排查的解决方法

    Maven包冲突是指项目中引用了多个版本的相同依赖,解决方法包括依赖排除、统一依赖版本、依赖管理等,验证排查和处理后,重新执行依赖树命令,确保无冲突,感兴趣的可以了解一下
    2026-01-01
  • SpringBoot启动后初始化的几种方式汇总

    SpringBoot启动后初始化的几种方式汇总

    这篇文章主要介绍了SpringBoot启动后初始化的几种方式汇总,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • Java实现文件的分割与合并

    Java实现文件的分割与合并

    这篇文章主要为大家详细介绍了Java实现文件的分割与合并,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • jboss配置方法简明教程

    jboss配置方法简明教程

    这篇文章主要介绍了jboss配置方法,较为简明扼要的说明了jboss服务器所需要的JDK环境安装设置以及jboss的安装与下载,并分析了配置与使用中的常见问题,需要的朋友可以参考下
    2016-08-08
  • java读取资源路径的几种实现方式

    java读取资源路径的几种实现方式

    文章总结了Java读取资源路径的几种方式,并指出了在JUnit测试文件和普通类中读取资源路径的区别,普通类中读取资源路径时,只返回主目录,而JUnit测试文件中可以精确到所在模块
    2025-02-02
  • 解决maven maven.compiler.source和maven.compiler.target的坑

    解决maven maven.compiler.source和maven.compiler.target的坑

    这篇文章主要介绍了解决maven maven.compiler.source和maven.compiler.target的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot的启动速度优化

    SpringBoot的启动速度优化

    随着我们项目的不断迭代 Bean 的数量会大大增加,如果都在启动时进行初始化会非常耗时,本文主要介绍了SpringBoot的启动速度优化,感兴趣的可以了解一下
    2023-09-09
  • java Hibernate多对多映射详解及实例代码

    java Hibernate多对多映射详解及实例代码

    这篇文章主要介绍了java Hibernate多对多映射详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01
  • 关于junit单元测试@Test的使用方式

    关于junit单元测试@Test的使用方式

    这篇文章主要介绍了关于junit单元测试@Test的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java 实战项目之教材管理系统的实现流程

    Java 实战项目之教材管理系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现教材管理系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11

最新评论