标签:表达式 -- 调用 intercept top arraylist 执行 val 实现类
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组织结构::
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!)
Struts2--ActionContext&ValueStack
标签:表达式 -- 调用 intercept top arraylist 执行 val 实现类
原文地址:http://www.cnblogs.com/Tendo-pein/p/7900643.html