Spring MVC的ModelAndView、Model、ModelMap、RedirectAttributes的範圍及關係分析

廢話不多說,在Spring MVC中。

1、ModelAndView類中有個類型爲ModelMap的對象。

2、ModelMap繼承了LinkedHashMap<String,Object>,因此理論上可以保存任何類型的值。

3、有一個類ExtendedModelMap繼承了ModelMap並且實現了Model接口。

4、還有一個類BindingAwareModelMap繼承了ExtendedModelMap。

5、Model接口還有一個子接口RedirectAttributes,用於定義數據重定向時的存儲模型

6、RedirectAttributes有一個實現類RedirectAttributesModelMap,它繼承了ModelMap類,實現了RedirectAttributes接口。

這便是這幾者的關係。

 

用一張圖來表示便是:

1、在這幾者中,ModelAndView、ModelMap、Model是直接可以放在控制器方法的參數中的,在Spring MVC運行的時候,會自動初始化它們。

2、其中ModelMap和Model必須放在方法參數中才能完成初始化,而ModelAndView既可以放在方法參數中完成初始化,也可以在方法中進行手動實例化。

3、若放在參數中進行初始化,則不論是Model的參數還是ModelMap的參數,Spring MVC都會對其進行實例化爲BindingAwar-eModelMap,因此Model的參數和ModelMap的參數之間是可以進行相互轉換的。

4、在實例化ModelAndView後,ModeAndView對象中model屬性默認爲空,當調用它增加數據後,才自動創建實例。

5、在控制器返回的視圖名稱爲重定向時,如果在數據模型中設置的是String類型,則默認以get的方式添加在重定向url之後。

6、在控制器返回的視圖名稱爲重定向時,如果要傳遞的數據不是String類型,則需要使用RedirectAttributes接口的實例進行傳遞,其中有個方法addFlushAttribute,可以傳遞自定義數據對象給目標重定向url。其實現原理也很簡單,即加入的時候存入session,重定向後從session中將此值取出,然後加到重定向url的請求屬性中去,最後從session中刪除此數據。

7、除了在重定向時以字符串的形式傳遞數據的情況中使用了以請求參數方式傳遞外,所有的數據模型存儲的值的有效範圍均爲請求(requestScope)作用域。

參考資料:

1、Java EE互聯網輕量級框架整合開發_SSM框架(SpringMVC+Spring+MyBatis)和Redis實現[楊開振,周吉文,梁華輝,譚茂華著-中國工信出版社]

2、Spring4.3.2源碼

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