天天看點

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);