天天看点

ActionContext_、ValueStack、Stack_Context关系

看源码你就会发现,actioncontext这个类中有一个变量:

 map context,

实际上调用actioncontext的put,get就相当于调用context的相就方法,你在页面上通过获取的就相当于调用context.get("request"),context.get("attr"),而你通过ac.put("list", list)也只能通过ac.get("list")获得。

而actioncontext.getvaluestack()相当于调用context.get(ognlvaluestack.value_stack)所获取的与通过actioncontext.get("request")获取的是不一样的东西

===============================================================================

actioncontext

一次action调用都会创建一个actioncontext

调用:actioncontext context = actioncontext.getcontext()

valuestack

由ognl框架实现

可以把它简单的看作一个list

stack object:放入stack中的对象,一般是action。

stack context(map):stack上下文,它包含一些列对象,包括request/session/attr/application map等。

el:存取对象的任意属性,调用对象的方法,遍历整个对象结构图

======================================================================================

actioncontext是action上下文

可以得到request session application

valuestack是值栈存放表单中的值

stack context 栈上下文也是用来存值的

=======================================================================================

你可以通过在页面中添加<s:debug/>标签察看valuestack和stack context中有哪些具体的内容。valuestack里面的东西先入后出,很多没有id的元素使用完之后就退栈了。

stackcontext提供了一些命名对象,这些命名对象与根对象无关,访问这些对象需要使用#前缀指名。比如这里面存在:parameters对象,request对象, session对象,application对象等等。

value stack contents ognl 值栈

stack context action上下文

action上下文是一个map对象,通过#key获得对象内容,在#request又可以得到值栈,值栈里存储的是一些action里的变量

于是获得action变量内容有三种方式

1,从值栈中直接获得

<s:property value="type"/>

${type }

2,从action上下文获得值栈的属性

<s:property value="#request['type']"/>或者<s:property value="#request.type"/>

1) valuestack可以用 request.getattribute("struts.valuestack")取得的一个 com.opensymphony.xwork2.util.ognlvaluestack实例,它实现为一个栈,有 peek()、pop()、push(obj)方法。

   2) stack context是在前面的 valuestack的上下中的一个 java.util.stack实例:

  //stack 为 valuestack实例,component_stack="__component_stack"

  // org.apache.struts2.components.component.getcomponentstack()中的代码

  stack componentstack = (stack) stack.getcontext().get(component_stack);