通過對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類的相應屬性
眾所周知,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類的相應屬性