Struts2笔记_值栈
A.值栈概述
值栈(ValueStack),通俗的来说就是Struts2里面用来管理和存储数据的东西。struts2项目部署运行后,底层会创建一个action实例,同时也会在内存上划分一块区域,这个区域就是值栈,该值栈对象会贯穿整个Action生命周期,用来存储这个过程中的数据。
B.值栈结构
首先,我们一起去看看struts2中值栈在哪里。找到xwork-core--->com.opensymphony.xwork2.util------>ValueStack

这个ValueStack是接口,里面没有具体功能实现,并不能拿来直接用,查看它的实现类,发现是OgnlValueStack,也就是说,真正起作用的,底层创建的实例是该实现类。值栈中有两个主要区域:

1.root区域.
点进去看看这个root到底是什么?
public class CompoundRoot extends ArrayList //原来root其实就是一个ArrayList集合,只不过里面添加了出栈和进栈的方法,也就是说它变成栈了,不过还是遵循list集合
CompoundRoot:存储了Action的实例,是ognl的root对象,struts2对原先ognl的root对象改进,使用CompoundRoot自定义栈(扩展了ognl),它读取Action属性值时会先从栈顶对象中找对应的属性,找不到继续找栈中其他对象,找到则停止。
2.context区域
(注: transient是声明对象不允许被序列化) 这里context其实是OgnlContext的上下文。它是一个map结构,里面存放了一些引用。
parameters:该Map中包含当前请求的请求参数。
request::该Map中包含当request对象中的所有属性。
session:该Map中包含当session对象中的所有属性
application:该Map中包含当application对象中的所有属性
attr:该Map按照如下顺序来检索某一个属性:request,session,application.
3.ActionContext和ValueStack的关系
通过查看源码可以知道,在ActionContext创建时,也会创建一个ValueStack对象,并且将该对象给ActionContext。即ActionContext里面有一个valueStack引用,而ValueStack里面也有ActionContext的应用。这一点,我们可以通过利用ActionContext获取Servlet原生API的方式就可以看出。主要就是获取值栈里面的Servlet对象。
C.值栈的使用。
1.获取值栈对象。(同一个Action中获取到的值栈是同一个)
---通过ActionContext对象来获取值栈
// 通过ActionContext对象来获取ValueStack对象(其实是一个父类引用指向子类方法)
ValueStack stack1 = ActionContext.getContext().getValueStack();
---通过request对象来获取
ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
2.操作值栈
一般操作值栈都是指操作root区域。
- 在Action中提供属性的get方法方式。(这里直接演示表单提交方式,简单类型和对象类型)
action类中
private User user;
private String password; public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String useStack() {
System.out.println(user.getName());
return SUCCESS;
}
jsp页面
从值栈里面取出值:
<s:property value="user.name"/>-----------------<s:property value="password"/>
<s:debug></s:debug>
运行结果

通过上述可以知道,默认情况下,会将Action对象压入到值栈中,所以其中的属性也在值栈中。在jsp页面显示时直接写属性名,如果是对象,由于用get方法对象不一定在栈顶,所以要用对象名.属性名。属性不要重复
- 手动操作值栈(注意被压入栈中的都是对象,你传什么类型,底层会被封装成对象,可以自已push对象和普通属性,看看root区)
action页面
public String handUseStack() {
ValueStack stack = ActionContext.getContext().getValueStack();
stack.push(user); //只是用来保存对象,将对象压入到栈中,传普通属性底层会包装成类对象
stack.set("password", password); //只要用set方法,底层会创建一个map集合,但是你看不到里面的属性和属性值。这是因为这个map集合没有set和get方法,不过没关系,虽然显示空,但是可以取出来。
return SUCCESS; }
jsp页面(与将Action自动压入栈时取对象值有区别,只需要使用属性名就可以取)
dy>
从值栈里面取出值:
<s:property value="name"/>-----------------<s:property value="password"/>
<s:debug></s:debug>
运行结果:

3.操作Context区域
由于context区域里面封装了域对象,所以直接利用域对象就可以达到我们操作context的目的
action页面
public String useContext() {
// 利用Action中内置对象获取request对象,向域中存值。其他的域都是一样
ServletActionContext.getRequest().setAttribute("user", user);
ServletActionContext.getRequest().setAttribute("password", password);
return SUCCESS;
}
jsp页面(取值还是和上面root区一样,只不过要加上一个#声明)
从context里面取出值:
<s:property value="#request.user.name"/>+..........+<s:property value="#request.password"/>
<s:debug></s:debug>
运行结果


如上图所示,都存到了contex区域里面了,普通属性直接属性名,如password,对象就直接用对象.属性 如 user.name.
最后注意下,值栈中的root区域还有一个request域中存值的时候,都只能接受一次请求,如果中间重定向了,对不起,获取不到你存的值。比如,在一个jsp或者html中,你要通过一个或者两个action的话,如果把从数据库获取的数据存到root区或者request中,从这个存数据的Action开始,这时你就需要全部设置跳转过程为请求转发,如果重定向,就是二次请求,取不到值。
Struts2笔记_值栈的更多相关文章
- Struts2_day03--课程安排_OGNL概述入门_什么是值栈_获取值栈对象_值栈内部结构
Struts2_day03 上节内容 今天内容 OGNL概述 OGNL入门案例 什么是值栈 获取值栈对象 值栈内部结构 向值栈放数据 向值栈放对象 向值栈放list集合 从值栈获取数据 获取字符串 获 ...
- struts2中各种值栈问题
struts2中OGNL和 ValueStack(一) 收藏 学习的时候,总分不清楚在struts2中页面的传值和取值是怎么来完成的,所以从网上搜了很多资料,现在把这些资料总结写,留着以后参考..看完 ...
- Struts2 中的值栈的理解
通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...
- 关于Struts2中的值栈与OGNL表达式
1.1.1 OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL :OGNL比EL功能强大很多倍. 它是一个开源项目. ...
- struts2 ValueStack(值栈)解析
Struts2一个重要点就是值栈. ValueStack,是用来存储一些在各个action,或者说是通过s标签.el表达式等给前台Jsp等页面展示的东西. ValueStack是一个接口,其内部接口非 ...
- Struts2中的值栈
一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...
- Struts2 框架的值栈
1. OGNL 表达式 1.1 概述 OGNL(Object Graphic Navigation Language),即对象图导航语言; 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个 ...
- struts2中的值栈对象ValueStack
ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...
- struts2学习(7)值栈简介与OGNL引入
一.值栈简介: 二.OGNL引入: com.cy.action.HelloAction.java: package com.cy.action; import java.util.Map; impor ...
随机推荐
- ERP不规范,同事两行泪
最近的很多次对外交流,都聊到了ERP建设的话题,并且无一例外的不那么让人省心,回想我这么多年走过的ERP坑坑路,在这里也写下经验和总结,希望能给正在或者即将走上ERP建设路的企业一些思考和帮助. 导读 ...
- Redis持久化方式的选择
本文将介绍Redis持久化的两种方式:快照持久化和AOF持久化,并对两种方法进行分析和对比,方便在实际中做出选择. 持久化 什么是持久化 Redis所有数据保存在内存中,对数据的更新将异步地保存到磁盘 ...
- 神奇的Scala Macro之旅(四)- BeanBuilder
在Java开发中,经常会有一个需求,将一个 Bean 复制到另外一个 Bean,尤其是在后台分层的场景下,在不同的层之间传递信息,经常需要进行 这样的一个对象复制工作,类似于: val source: ...
- Nginx高并发优化方案
原网址: https://blog.csdn.net/HoeWang/article/details/81221463 一.一般来说nginx 配置文件中对优化比较有作用的为以下几项: 1. work ...
- Fast R-CNN中的边框回归
前面对R-CNN系的目标检测方法进行了个总结,其中对目标的定位使用了边框回归,当时对这部分内容不是很理解,这里单独学习下. R-CNN中最后的边框回归层,以候选区域(Region proposal)为 ...
- RxJava操作符的简单使用
一.准备工作在app的build.gradle文件下的dependencies中添加依赖: compile 'io.reactivex:rxjava:1.3.0' compile 'io.reacti ...
- PostgreSQL 10.7 linux 主从配置
PostgreSQL 10.7 主从安装 硬件环境 云服务商:华为云 Linux: CentOS7.1 工具:Xshell Xftp IP:114.115.251.168 Port: 5432 543 ...
- Windows迁移打印机与打印队列
移动打印机时,打印机当前所在服务器为源服务器,打印机将迁移到的服务器为目的服务器. 步骤: 1.为源服务器创建打印机配置文件 printbrm -b -s Servername -f SaveFile ...
- 关于wordpress升级遇到的问题
前几天登录我的博客后台,发现可以升级了,顺手点了一下,但顺接出现了几个报错,然后这里记录一下解决方法: 1.出现“另一更新正在进行”的错误解决: 这是因为可能你上次更新失败了,或者WordPress在 ...
- July 01st. 2018, Week 27th. Sunday
Empty your cup so that it may be filled. 清空杯子,方能再次装满. From Bruce Lee. We can't learn anything new if ...