(Struts2)值栈(一)

本文介绍了Struts2框架中的核心组件——值栈的基本概念、内部结构及其创建过程。值栈作为数据中转站,负责在Action与视图之间传递数据。文章详细解释了值栈的组成部分,包括root和context,并探讨了如何通过不同方式获取值栈对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是值栈?

      *   值栈相当于Struts2框架的数据的中转站,向值栈存入一些数据,从值栈中获取到数据。

      *   ValueStack 是 Struts2 提供的一个接口,实现类 OgnlValueStack   ---   值栈对象(OGNL是从值栈中获取数据的)

      *   Action是多例的,有一个请求,创建Action实例,创建一个ActionContext对象,代表的是Action的上下文对象,还会创建一个ValueStack对象。

      *   每个Action实例都有一个ValueStack对象(一个请求对应一个ValueStack对象)

      *   在其中保存当前Action对象和其他相关对象

      *   Struts框架把ValueStack对象保存在名为”struts.valueStack“的请求属性中,request中(值栈对象是request的一个属性)

            >   ValueStack   vs  =  (ValueStack)request.getAttribute("struts.valueStack"); 


2、值栈的内部结构

      *   值栈由两部分组成

             >  root                  ---   Struts把动作和相关对象压入 ObjectStack中  --> List

             >  context            ---   Struts把各种各样的映射关系(一些Map类型的对象)压入ContextMap

      *   Struts会默认把下面这些映射压入ContextMap(Context)中

             注意:request代表的是Map集合的key值,value的值其实也是一个Map集合。

             >  parameter:该Map中包含当前请求的请求参数          ?name=xxx&password=111

             >  request    :该Map中包含当前request对象中的所有属性

             >  session     :该Map中包含当前session对象中的所有属性

             >  application:该Map中包含当前application对象中的所有属性

             >  attr           :该Map按照顺序来检索某个属性: request、session、application

      *   ValueStack中存在root属性(CompoundRoot)、context属性(OgnlContext)

             >  CompoundRoot 就是ArrayList

             >  OgnlContext 就是Map

      *   context 对应Map引入root 对象

             >  context中还存在request、session、application、attr、parameters 对象引用

             >  OGNL表达式访问值栈中的数据

                       *   访问root 中数据时,不需要 #

                       *   访问 request、session、application、attr、parameters 对象数据  必须写 #

             >  操作值栈  默认指的是  操作root 


3、值栈对象的创建,ValueStack 和 ActionContext 是什么关系?

      *   值栈对象是请求时创建的

      *   ActionContext 是绑定到当前的线程上,那么在每个拦截器或者Action中获取到的ActionContext是同一个

      *   ActionContext中存在一个Map集合,该Map集合和ValueStack的context是同一个地址

      *   ActionContext中可以获取到ValueStack的引用,开发的时候,使用ActionContext来获取值栈对象


4、如何获取值栈对象

      三种方法:

  >  ValueStack  vs1  = (ValueStack)  ServletActionContext.getRequest().getAttribute("struts.valueStack");

  >  ValueStack  vs2  = (ValueStack)  ServletActionContext.

                        getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);

  >   ValueStack  vs3  =  (ValueStack)  ActionContext.getContext().getValueStack();


5、向值栈保存数据(主要针对root 栈)

      *   valueStack.push(Object  obj):

                >   push方法的底层调用root对象的push方法(把元素添加到0位置)

      *   valueStack.set(String  key,  Object  obj):

                >   源码获取Map集合(map有可能已经存在,有可能是新创建的),把map集合push到栈顶,再把数据存入到map集合中

      *   在jsp中  通过  <s:debug /> 查看值栈内容


下一篇:值栈(二)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值