看源碼你就會發現,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);