Struts2 中的值棧的理解

2021-08-08 15:57:07 字數 1324 閱讀 9890

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

當在客服端進行跳轉時,當有請求提交到伺服器的action時,只有乙個堆疊存在,堆疊中存放的是當前的請求的action,而原來那麼則銷毀了(本人觀 點,感覺如同request請求一樣)。
眾所周知,strut 2的action類通過屬性可以獲得所有相關的值,如請求引數、action配置引數、向其他action傳遞屬性值(通過chain結果)等等。要獲得 這些引數值,我們要做的唯一一件事就是在action類中宣告與引數同名的屬性,在struts 2呼叫action類的action方法(預設是execute方法)之前,就會為相應的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 中的值棧的理解

值棧 簡單的說,就是存放action的堆疊,當我們提交乙個請求到伺服器端 action時,就有個堆疊,如果action在伺服器端進行跳轉,所有action共用乙個堆疊,當需要儲存action中的資料時,首先從棧頂開始 搜尋,若找到相同的屬性名 與要獲得的資料的屬性名相同 時,即將對應的值取出,但這種...

struts2中對值棧的理解

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