1. 程式人生 > >(Struts2)值棧(一)

(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把各種各樣的對映關係(一些Map型別的物件)壓入ContextMap

      *   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 /> 檢視值棧內容