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笔记_值栈的更多相关文章

  1. Struts2_day03--课程安排_OGNL概述入门_什么是值栈_获取值栈对象_值栈内部结构

    Struts2_day03 上节内容 今天内容 OGNL概述 OGNL入门案例 什么是值栈 获取值栈对象 值栈内部结构 向值栈放数据 向值栈放对象 向值栈放list集合 从值栈获取数据 获取字符串 获 ...

  2. struts2中各种值栈问题

    struts2中OGNL和 ValueStack(一) 收藏 学习的时候,总分不清楚在struts2中页面的传值和取值是怎么来完成的,所以从网上搜了很多资料,现在把这些资料总结写,留着以后参考..看完 ...

  3. Struts2 中的值栈的理解

    通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求 道服务器端 action时,就有个堆栈,如果action在服务器端 ...

  4. 关于Struts2中的值栈与OGNL表达式

    1.1.1    OGNL概述: Object Graphic Navigation Language(对象图导航语言)的缩写 * EL     :OGNL比EL功能强大很多倍. 它是一个开源项目. ...

  5. struts2 ValueStack(值栈)解析

    Struts2一个重要点就是值栈. ValueStack,是用来存储一些在各个action,或者说是通过s标签.el表达式等给前台Jsp等页面展示的东西. ValueStack是一个接口,其内部接口非 ...

  6. Struts2中的值栈

    一 什么是值栈 值栈: struts2中提供的一种类似于域对象的工具, 用于struts2中的存值和取值. 每次访问Action的时候, 都会创建一个action对象, 而每个action对象中都存在 ...

  7. Struts2 框架的值栈

    1. OGNL 表达式 1.1 概述 OGNL(Object Graphic Navigation Language),即对象图导航语言; 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个 ...

  8. struts2中的值栈对象ValueStack

    ValueStack, 即值栈对象. 值栈对象: 是整个struts数据存储的核心,或者叫中转站. 用户每次访问struts的action,都会创建一个Action对象.值栈对象.ActionCont ...

  9. struts2学习(7)值栈简介与OGNL引入

    一.值栈简介: 二.OGNL引入: com.cy.action.HelloAction.java: package com.cy.action; import java.util.Map; impor ...

随机推荐

  1. 哎呀,我老大写Bug啦——记一次MessageQueue的优化

    MessageQueue,顾名思义消息队列,在系统开发中也是用的比较多的一个中间件吧.我们这里主要用它来做日志管理和订单管理的,记得老老大(恩,是的,就是老老大,因为他已经跳槽了)还在的时候,当时也是 ...

  2. 亲测可用,iptables实现NAT转发。

    环境 服务器A:192.168.1.7 服务器B: 192.168.1.160 需求 实现将本机(192.168.1.7:7410)端口流量转发给(192.168.1.160:9200). 1. 内核 ...

  3. sau交流学习社区第三方登陆github--oauth来实现用户登录

    sau交流学习社区第三方登陆github--oauth来实现用户登录 最近在丰富nodejsBlog开发的“交流学习社区”(https://www.mwcxs.top)的其他功能以及修复一些bug. ...

  4. 开箱即用Bumblebee独立部署搭建webapi网关详解

    在之前的章节里都是讲述如何在程序中使用Bumblebee来构建一个Webapi网关:但这样显然有些麻烦,毕竟很多时候可能只需要一个简单负载处理,还需要写个程序针对服务进行编写代码或配置的确是比较麻烦的 ...

  5. BeetleX和Asp.net Core之webapi基础性能对比

    本文主要针对BeetleX和Asp.net Core在基础WebApi功能性能对比 测试环境描述 硬件配置:E1230V2 16G内存 10Gb带宽 操作系统:Windows server 2008 ...

  6. BeetleX快速构建多平台的TCP和SSL TCP应用

    对于普通开发者而言编写TCP应用通讯是一件相对复杂的工作,毕竟需要一系列的bytes操作:如果再针对SSL的安全性处理相信会把很多普通开发者拒之门外.为了简化这一问题BeetleX引入了Stream操 ...

  7. Java进阶篇设计模式之六 ----- 组合模式和过滤器模式

    前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...

  8. Vue2.0源码阅读笔记(三):计算属性

      计算属性是基于响应式依赖进行缓存的,只有在相关响应式依赖发生改变时才会重新求值,这种缓存机制在求值消耗比较大的情况下能够显著提高性能. 一.计算属性初始化   Vue 在做数据初始化时,通过 in ...

  9. MES是什么,MOM是什么?

    MES简介 MES(Manufacturing Execution System)制造执行系统,用于制造业车间级的信息化管理系统.单说MES系统这个概念比较广泛,大致分为以下几个方面:计划调度.生产. ...

  10. Dynamics 365中自定义工作流活动更新了输入输出参数后获取的方法

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复245或者20170309可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...