通過對struts2的一段時間的接觸,將自己對OGNL的核心值棧說說,值棧:簡單的說,就是存放action的堆棧,當(dāng)我們提交一個請求道服務(wù)器端 action時,就有個堆棧,如果action在服務(wù)器端進(jìn)行跳轉(zhuǎn),所有action共用一個堆棧,當(dāng)需要保存在action中的數(shù)據(jù)時,首先從棧頂開始 搜索,若找到相同的屬性名(與要獲得的數(shù)據(jù)的屬性名相同)時,即將值取出,但這種情況可能出現(xiàn)找到的值不是我們想要的值,那么解決此問題需要用TOP語法 和N語法來進(jìn)行解決。 當(dāng)在客服端進(jìn)行跳轉(zhuǎn)時,當(dāng)有請求提交到服務(wù)器的action時,只有一個堆棧存在,堆棧中存放的是當(dāng)前的請求的action,而原來那么則銷毀了(本人觀 點(diǎn),感覺如同request請求一樣)。 ****************************************************** 眾所周知,Strut 2的Action類通過屬性可以獲得所有相關(guān)的值,如請求參數(shù)、Action配置參數(shù)、向其他Action傳遞屬性值(通過chain結(jié)果)等等。要獲得 這些參數(shù)值,我們要做的唯一一件事就是在Action類中聲明與參數(shù)同名的屬性,在Struts 2調(diào)用Action類的Action方法(默認(rèn)是execute方法)之前,就會為相應(yīng)的Action屬性賦值。 要完成這個功能,有很大程度上,Struts 2要依賴于ValueStack對象。這個對象貫穿整個Action的生命周期(每個Action類的對象實例會擁有一個ValueStack對象)。當(dāng) Struts 2接收到一個.action的請求后,會先建立Action類的對象實例,但并不會調(diào)用Action方法,而是先將Action類的相應(yīng)屬性放到 ValueStack對象的頂層節(jié)點(diǎn)(ValueStack對象相當(dāng)于一個棧)。只是所有的屬性值都是默認(rèn)的值,如String類型的屬性值為 null,int類型的屬性值為0等。 在處理完上述工作后,Struts 2就會調(diào)用攔截器鏈中的攔截器,當(dāng)調(diào)用完所有的攔截器后,最后會調(diào)用Action類的Action方法,在調(diào)用Action方法之前,會將 ValueStack對象頂層節(jié)點(diǎn)中的屬性值賦給Action類中相應(yīng)的屬性。大家要注意,在這里就給我們帶來了很大的靈活性。也就是說,在Struts 2調(diào)用攔截器的過程中,可以改變ValueStack對象中屬性的值,當(dāng)改變某個屬性值后,Action類的相應(yīng)屬性值就會變成在攔截器中最后改變該屬性 的這個值。 從上面的描述很容易知道,在Struts 2的的Action類可以獲得與屬性同名的參數(shù)值就是通過不同的攔截器來處理的,如獲得請求參數(shù)的攔截器是params,獲得Action的配置參數(shù)的攔 截器是staticParams等。在這些攔截器內(nèi)部讀取相應(yīng)的值,并更新ValueStack對象頂層節(jié)點(diǎn)的相應(yīng)屬性的值。而ValueStack對象 就象一個傳送帶,將屬性值從一個攔截器傳到了另一個攔截器(當(dāng)然,在這其間,屬性值可能改變),最后會傳到Action對象,并將ValueStack對 象中的屬性的值終值賦給Action類的相應(yīng)屬性 眾所周知,Strut 2的Action類通過屬性可以獲得所有相關(guān)的值,如請求參數(shù)、Action配置參數(shù)、向其他Action傳遞屬性值(通過chain結(jié)果)等等。要獲得 這些參數(shù)值,我們要做的唯一一件事就是在Action類中聲明與參數(shù)同名的屬性,在Struts 2調(diào)用Action類的Action方法(默認(rèn)是execute方法)之前,就會為相應(yīng)的Action屬性賦值。 要完成這個功能,有很大程度上,Struts 2要依賴于ValueStack對象。這個對象貫穿整個Action的生命周期(每個Action類的對象實例會擁有一個ValueStack對象)。當(dāng) Struts 2接收到一個.action的請求后,會先建立Action類的對象實例,但并不會調(diào)用Action方法,而是先將Action類的相應(yīng)屬性放到 ValueStack對象的頂層節(jié)點(diǎn)(ValueStack對象相當(dāng)于一個棧)。只是所有的屬性值都是默認(rèn)的值,如String類型的屬性值為 null,int類型的屬性值為0等。 在處理完上述工作后,Struts 2就會調(diào)用攔截器鏈中的攔截器,當(dāng)調(diào)用完所有的攔截器后,最后會調(diào)用Action類的Action方法,在調(diào)用Action方法之前,會將 ValueStack對象頂層節(jié)點(diǎn)中的屬性值賦給Action類中相應(yīng)的屬性。大家要注意,在這里就給我們帶來了很大的靈活性。也就是說,在Struts 2調(diào)用攔截器的過程中,可以改變ValueStack對象中屬性的值,當(dāng)改變某個屬性值后,Action類的相應(yīng)屬性值就會變成在攔截器中最后改變該屬性 的這個值。 從上面的描述很容易知道,在Struts 2的的Action類可以獲得與屬性同名的參數(shù)值就是通過不同的攔截器來處理的,如獲得請求參數(shù)的攔截器是params,獲得Action的配置參數(shù)的攔 截器是staticParams等。在這些攔截器內(nèi)部讀取相應(yīng)的值,并更新ValueStack對象頂層節(jié)點(diǎn)的相應(yīng)屬性的值。而ValueStack對象 就象一個傳送帶,將屬性值從一個攔截器傳到了另一個攔截器(當(dāng)然,在這其間,屬性值可能改變),最后會傳到Action對象,并將ValueStack對 象中的屬性的值終值賦給Action類的相應(yīng)屬性
新聞熱點(diǎn)
疑難解答