Struts2--ActionContext&ValueStack

1. valueStack内部结构

ValueStack的组成:

就是一个ArrayList 和 context

在struts2框架中我们通过ognl表达式来获取valueStack中数据,没有使用#就会从CompoundRoot中获取数据,

如果使用#来获取,这时就会从context中来获取

CompoundRoot主要存储的是action的相关数据;其实就是一个ArrayList

context 其实就是一个Map集合

主要存储了一些引用,这个引用主要是关于web开发中相关信息

pameters :请求 参数

request:请求对象中所有属性

session:会话对象中所有属性

application:application对象中的所有发展

其中的context对象是OGNLContext,它实现了map接口,在valueStack的默认实现类中,OgnlValueStack中调用OGNL方法,返回一个OgnlContext对象。

valueStack组织结构::

 

2. ActionContext是什么

ActionContext它是action上下文,strtus2框架它使用actionContext来保存Action在执行过程中所需要的一些对象,例如 session, application…

意思就是:

 Struts2会根据每一次的http请求来创建对应的ActionContext,它是与当前线程绑定的。

每一次请求,就是一个线程,对应着一个request,每一次请求,会创建一个Action,每一个action对应一个ActionContext.每一次请求也对应着一个valueStack.

request---ActionContext----Action-----ValueStack它们都对应着一次请求(一个线程).

只有存在了action才会存在action上下文(也就是ActionContext)

 

在ActionContext中持有valuestack中context的引用,而在context中持有root的引用

 

ValueStack存储数据:

如果通过valueStack.set(name,value)存储的,可以在页面是使用<s:property value=”name”>获取

如果通过valuestack.push(value)存储的,可以根据它在root中的序号来获取.例如

<s:property value=”[1].top”>

 

ActionContext就是ValueStack中的context,(就是一个容器)属于Map集合,存储session,request,response等对象,只有有了action才会有ActionContext;所在它持有对root的引用,也就是持有对valuestack中compoundRoot(对象栈)的引用,里面主要存储action的相关数据;

 

                                    

Valuestack中获取数据:

如上图所示:在执行setUsername/setPassword之前:user对象被压倒valuestack(getModel中创建的对象,)中,这时候Action和ValueStack都指向一个对象,但紧接着,Action中的user被新的user对象覆盖,这时候action和valuestack不再指向同一个对象,valuestack中是旧的对象,而action中是新的对象;

 

(在最新的struts2版本中,ModelDrivenInterceptor提供了一个配置参数:refreshModelBeforeResult,只要将它定义为true,上述问题就被解决了!struts2的解决方案就是:先把旧的model对象从ValueStack中移除,然后再把新的model对象压入ValueStack!)

转载于:https://www.cnblogs.com/Tendo-pein/p/7900643.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值