Struts2 中的值棧的理解

2021-07-02 20:47:15 字數 1287 閱讀 8884

值棧:簡單的說,就是存放action的堆疊,當我們提交乙個請求到伺服器端 action時,就有個堆疊,如果action在伺服器端進行跳轉,所有action共用乙個堆疊,當需要儲存action中的資料時,首先從棧頂開始 搜尋,若找到相同的屬性名(與要獲得的資料的屬性名相同)時,即將對應的值取出,但這種情況可能出現找到的值不是我們想要的值,那麼解決此問題需要用top語法 和n語法來進行解決。 

當在客服端進行跳轉,有請求提交到伺服器的action時,只有乙個堆疊存在,堆疊中存放的是當前請求的action。

strut 2的action類通過屬性可以獲得所有相關的值,如請求引數、action配置引數、向其他action傳遞屬性值(通過chain結果)等等。要獲得 這些引數值,我們要做的就是在action類中宣告與引數同名的屬性(如: request.setattribute("paramname", paramname);),在struts 呼叫action類的action方法之前,就會為相應的action屬性賦值。 

要完成這個功能,有很大程度上,struts 2要依賴於valuestack物件。這個物件貫穿整個action的生命週期(每個action類的物件例項會擁有乙個valuestack物件)。當 struts 2接收到乙個.action的請求後,會先建立action類的物件例項,但並不會呼叫action方法,而是先將action類的相應屬性放到 valuestack物件的頂層節點(valuestack物件相當於乙個棧)。只是所有的屬性值都是預設的值,如string型別的屬性值為 null,int型別的屬性值為0等。 

在處理完上述工作後,struts 2就會呼叫***鏈中的***,當呼叫完所有的***後,最後會呼叫action類的action方法,在呼叫action方法之前,會將 valuestack物件頂層節點中的屬性值賦給action類中相應的屬性。注意,在這裡就給我們帶來了很大的靈活性,也就是說,在struts 2呼叫***的過程中,可以改變valuestack物件中屬性的值,當改變某個屬性值後,action類的相應屬性值就會變成在***中最後改變該屬性 的這個值。 

從上面的描述很容易知道,在struts 2的的action類可以獲得與屬性同名的引數值就是通過不同的***來處理的,如獲得請求引數的***是params,獲得action的配置引數的攔 截器是staticparams等。在這些***內部讀取相應的值,並更新valuestack物件頂層節點的相應屬性的值。而valuestack物件 就象乙個傳送帶,將屬性值從乙個***傳到了另乙個***(當然,在這其間,屬性值可能改變),最後會傳到action物件,並將valuestack對 象中的屬性的值終值賦給action類的相應屬性。 

struts2 值棧的理解

之前工作中當遇到jsp在struts2取值的時候,對於 什麼的使用一直處於不太明白的狀態 雖然之前學習struts2的時候有學到過 今天再次遇到,整理一下。struts2上下文如上圖所示。其中值棧裡的內容我們經常用到的主要就是當前action的屬性值。可以用s debug標籤看到。對於在jsp裡取值...

Struts2 中的值棧的理解

通過對struts2的一段時間的接觸,將自己對ognl的核心值棧說說,值棧 簡單的說,就是存放action的堆疊,當我們提交乙個請求道伺服器端 action時,就有個堆疊,如果action在伺服器端進行跳轉,所有action共用乙個堆疊,當需要儲存在action中的資料時,首先從棧頂開始 搜尋,若找...

struts2中對值棧的理解

struts2的interceptor一層一層,把action包裹在最裡面。這樣的結構,大概有以下一些特點 1.整個結構就如同乙個堆疊,除了action以外,堆疊中的其他元素是interceptor 2.action位於堆疊的底部。由於堆疊 先進後出 的特性,如果我們試圖把action拿出來執行,我...