久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

深度解析Struts2中ValueStack

 Baruch 2017-10-06

1.什么是ValueStack

對于每一個action的調(diào)用,,Struts在執(zhí)行相應的動作方法之前會先創(chuàng)建一個名為ValueStack的對象,。Value Stack用來保存該動作對象或者對象,。由于最終在執(zhí)行Action類相應的action方法之前,,攔截器需要先訪問ValueStack,。視圖也需要訪問ValueStack。Struts框架將其保存在一個名為struts.valueStack的請求屬性中,。

2.獲取valueStack的三種方法:

 ValueStack v1 = ActionContext.getContext().getValueStack();
     ValueStack v2 = ServletActionContext.getValueStack(ServletActionContext.getRequest());
        ValueStack v3 = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack");
  • 1
  • 2
  • 3
  • 4

打印其HashCode碼一模一樣,。
說明:
1、 值是一樣的,,說明只有一個對象
2,、 因為有一種是從request域中獲取的,所以是一次請求

3.ValueStack的內(nèi)容

valueStack分為對象棧(Object Stack)和Map棧(Context Map).

Struts將把動作和相關對象壓入Object Stack,,而把各種各樣的映射關系壓入Context Map,。

通常說的ValueStack就是指Object Stack,它是一個真正數(shù)據(jù)結構意義的棧,。Object Stack也常常被稱為root(其實是一個ArrayList),。Context Map我們一般稱其為context(是一個HashMap)它是整個OGNL其中包括了root

4.OGNL中的兩種對象

OGNL中包含兩種對象,即_root和_value.
_value即:request, session, application, parameters, attr等命名對象,,但這些命名對象都不是根,。
_root即:當前請求的Action實例等
“根”對象和普通命令對象的區(qū)別在于:
“根”對象(root) 對象棧: 實際上是 CompoundRoot 類型, 是一個使用 ArrayList 定義的棧. 里邊保存各種和當前 Action 實例相關的對象(如果這個Action實例包括域對象的話域對象會進root).是一個數(shù)據(jù)結構意義的棧.

1)訪問Context Map里的對象需要在對象名之前添加 #
2)訪問Object Stack對象的屬性時,可以省略#而直接通過屬性名來搜索

這里寫圖片描述

說明:
從上圖中也可以看出valueStack總共分為兩個部分:

      對象棧:root (CompoundRoot類)
      Map棧:_values和_root (OgnlContext 類)
  • 1
  • 2
  • 3

5.Struts會把當前訪問的Action實例壓入值棧棧定

壓入時間點為:
由于Struts2最后終將調(diào)用Action類中的action方法。但在調(diào)用此方法之前:

*先創(chuàng)建一個StrutsActionProxy (ActionProxy默認實現(xiàn)的子類)
*在創(chuàng)建StrutsActionProxy之后,,對其進行初始化,,把Action對象壓入值棧

在調(diào)用該方法前該Action被壓入棧頂,如果在初始化的過程中,,在Action的構造函數(shù)中又初始化了其他類,,這這個類也會被壓入值棧。所以最后棧頂?shù)脑貢沁@個新初始化的類,。

6.ValueStack中對象的存取

Object Stack 的存放: push 或者 add:

將一個對象放入Object Stack的棧頂:

ActionContext.getContext().getValueStack().push(object);
ActionContext.getContext().getValueStack().getRoot().add(0,object);
  • 1
  • 2

Object Stack的提取: peek() 或 pop()

peek()取得的是棧頂元素:

Object object  =    ActionContext.getContext().getValueStack().peek();
  • 1

Object Stack的元素的彈出:pop:

Object object  =    ActionContext.getContext().getValueStack().pop();
  • 1

7.動態(tài)修改ValueStack中對象的屬性

這里寫圖片描述

說明:
可以利用valueStack.setParameter方法改變對象棧中對象的屬性的值,。至于匹配哪個。則依次從對象棧的棧頂向下搜索,找到匹配的就修改

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多