(Struts2)值棧(一)
1、什麼是值棧?
* 值棧相當於Struts2框架的資料的中轉站,向值棧存入一些資料,從值棧中獲取到資料。
* ValueStack 是 Struts2 提供的一個介面,實現類 OgnlValueStack --- 值棧物件(OGNL是從值棧中獲取資料的)
* Action是多例的,有一個請求,建立Action例項,建立一個ActionContext物件,代表的是Action的上下文物件,還會建立一個ValueStack物件。
* 每個Action例項都有一個ValueStack物件(一個請求對應一個ValueStack物件)
* 在其中儲存當前Action物件和其他相關物件
* Struts框架把ValueStack物件儲存在名為”struts.valueStack“的請求屬性中,request中(值棧物件是request的一個屬性)
> ValueStack vs = (ValueStack)request.getAttribute("struts.valueStack");
2、值棧的內部結構
* 值棧由兩部分組成
> root --- Struts把動作和相關物件壓入 ObjectStack中 --> List
> context
* Struts會預設把下面這些對映壓入ContextMap(Context)中
注意:request代表的是Map集合的key值,value的值其實也是一個Map集合。
> parameter:該Map中包含當前請求的請求引數 ?name=xxx&password=111
> request :該Map中包含當前request物件中的所有屬性
> session :該Map中包含當前session物件中的所有屬性
> application:該Map中包含當前application物件中的所有屬性
> attr :該Map按照順序來檢索某個屬性: request、session、application
* ValueStack中存在root屬性(CompoundRoot)、context屬性(OgnlContext)
> CompoundRoot 就是ArrayList
> OgnlContext 就是Map
* context 對應Map引入root 物件
> context中還存在request、session、application、attr、parameters 物件引用
> OGNL表示式訪問值棧中的資料
* 訪問root 中資料時,不需要 #
* 訪問 request、session、application、attr、parameters 物件資料 必須寫 #
> 操作值棧 預設指的是 操作root
3、值棧物件的建立,ValueStack 和 ActionContext 是什麼關係?
* 值棧物件是請求時建立的
* ActionContext 是繫結到當前的執行緒上,那麼在每個攔截器或者Action中獲取到的ActionContext是同一個
* ActionContext中存在一個Map集合,該Map集合和ValueStack的context是同一個地址
* ActionContext中可以獲取到ValueStack的引用,開發的時候,使用ActionContext來獲取值棧物件
4、如何獲取值棧物件
三種方法:
> ValueStack vs1 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
> ValueStack vs2 = (ValueStack) ServletActionContext.
getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
> ValueStack vs3 = (ValueStack) ActionContext.getContext().getValueStack();
5、向值棧儲存資料(主要針對root 棧)
* valueStack.push(Object obj):
> push方法的底層呼叫root物件的push方法(把元素新增到0位置)
* valueStack.set(String key, Object obj):
> 原始碼獲取Map集合(map有可能已經存在,有可能是新建立的),把map集合push到棧頂,再把資料存入到map集合中
* 在jsp中 通過 <s:debug /> 檢視值棧內容