Struts2中的值棧

衆所周知,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類的相應屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章