一、值棧(valuestack)是什麼?
值棧(valuestack),是struts2的資料中轉站,其中自動儲存了當前action物件和其他相關物件(包括常用的web物件的引用,如request),也可以手動儲存自己是資料物件,同時也可以隨時隨地將物件從值棧取出或操作(通過ognl表示式)
值棧,實際是乙個介面物件的稱呼,介面是value類,實現類是ognlvaluestack類。struts2框架將valuestack物件儲存在名為"struts.valuestack"的請求(request)屬性中,即值棧是request中的乙個物件,乙個請求對應乙個action例項和乙個值棧物件。
二、值棧的資料儲存結構的分析
在值棧的內部有兩個邏輯部分:
objectstack(物件棧):儲存了action的相關物件和動作,資料儲存結構是list.
contextmap(上下文棧):儲存了各種對映關係,資料儲存結構是map.
值棧物件的獲取,兩種方式獲取的物件是同一物件:
1)request.getattribute("struts.valuestack");
2)actioncontext.getcontext().getvaluestack();
[值棧小結]:
值棧是在請求物件引用了一塊儲存空間。
值棧包括兩部分:物件棧(compoundroot,繼承list介面)和ognl上下文棧(ognlcontext,實現map介面)
三、值棧的獲取資料的機制
ognlvaluestack類包含兩個重要的屬性,乙個root(compoundroot)和乙個context(ognlcontext).
在這個ognlcontext物件中,有乙個預設的頂層物件
root
(引用),俗稱
root
棧,下面乙個物件稱之為
map棧.
ognl表示式的操作都基於ognlcontext物件,訪問的規則如下:
1) 如果訪問 root棧內容(
compoundroot
物件棧內容), 不需要#,
直接通過元素的名稱來訪問
。2) 如果訪問 map棧內容 (如
request
、response
、session
、servletcontext
、attr
、parameters
), 需要
#key
來引用訪問,例如
#request.name
相當於
request.getattribute("name" )
值棧的主要作用就是資料的儲存和獲取(可以在任何地方獲取)。
使用值棧的時候要思考:用什麼**存進去,然後再用什麼**取出來。
1. 如何向值棧儲存資料
1) valuestack.push(obj) :儲存資料到root棧頂-壓棧頂(物件本身)-匿名
2) actioncontext.getcontext().put(key,value) :儲存資料到map棧
中3) valuestack.set(key,value):將資料儲存到root棧頂
(資料物件自動被封裝為map來儲存,棧頂是個
map,
map裡面有個屬性是物件)
--有名字
提供action成員變數,提供
getter
方法(action
就在root
棧中,action
屬性可以被搜尋)
2.ognl
表示式如何獲取值棧的資料
1) name
」/>
先搜尋root
棧物件屬性(getter方法
:get***-->***),
再搜尋map的key
2) 搜尋map的key
3) 通過 [index].top 指定訪問
root
棧某個物件 ,例如
[0].top
棧頂物件
valuestack.findvalue(ognl表示式
) ; 獲取值棧資料
Struts2中的值棧
眾所周知,strut 2的action類通過屬性可以獲得所有相關的值,如請求引數 action配置引數 向其他action傳遞屬性值 通過chain結果 等等。要獲得這些引數值,我們要做的唯一一件事就是在action類中宣告與引數同名的屬性,在struts 2呼叫action類的action方法 預...
struts2中的值棧
一丶關於值棧 valuestack 二丶值棧中值得訪問方式 向值棧中訪問值有三種方式 先用actioncontext獲得值棧的物件 actioncontext context actioncontext.getcontext valuestack stack context.getvaluestac...
struts2 值棧的理解
之前工作中當遇到jsp在struts2取值的時候,對於 什麼的使用一直處於不太明白的狀態 雖然之前學習struts2的時候有學到過 今天再次遇到,整理一下。struts2上下文如上圖所示。其中值棧裡的內容我們經常用到的主要就是當前action的屬性值。可以用s debug標籤看到。對於在jsp裡取值...