@ModelAttribute的用法,與@RequestBody的區別
@ModelAttribute的用法大概有兩種:一種是直接標記在方法上,一種是標記在方法的引數中,兩種標記的方法產生效果也各不相同
一.直接標記在方法上
部署後執行,點選頁面測試按鈕,檢視控制檯輸出,這個時候你會發現,後臺控制器並沒有直接進入modelTest.do的路徑,而是先執行了被@ModelAttribute標記的init方法。應該這麼理解,當同一個controller中有任意一個方法被@ModelAttribute註解標記,頁面請求只要進入這個控制器,不管請求那個方法,均會先執行被@ModelAttribute標記的方法,所以我們可以用@ModelAttribute註解的方法做一些初始化操作。當同一個controller中有多個方法被@ModelAttribute註解標記,所有被@ModelAttribute標記的方法均會被執行,按先後順序執行,然後再進入請求的方法。
當@RequestMapping標記和@ModelAttribute同時標記在一個方法上
點選測試頁面發現進入控制器後返回,頁面報404,這是因為當兩個註解標記到同一個方法上時,邏輯檢視名並不是返回值,而是返回請求的路徑,根據model/modelTest.do生成邏輯檢視。在這裡我們修改下程式碼,把controller上的@RequestMapping標記去掉,並修改下頁面的請求路徑,讓生成的檢視路徑和訪問的頁面路徑相同。
二.@ModelAttribute標記在引數前
點選頁面測試,頁面文字框會顯示URL地址傳遞過來的引數,因為SpringMVC會自動匹匹配頁面傳遞過來的引數的name屬性和後臺控制器中的方法中的引數名,如果引數名相同,會自動匹配,如果控制器中方法是封裝的bean,會自動匹配bean中的屬性,其實這種取值方式不需要用@ModelAttribute註解,只要滿足匹配要求,也能拿得到值
@ModelAttribute的用法,與@RequestBody的區別
@ModelAttribute的用法大概有兩種:一種是直接標記在方法上,一種是標記在方法的引數中,兩種標記的方法產生效果也各不相同
一.直接標記在方法上
部署後執行,點選頁面測試按鈕,檢視控制檯輸出,這個時候你會發現,後臺控制器並沒有直接進入modelTest.do的路徑,而是先執行了被@ModelAttribute標記的init方法。應該這麼理解,當同一個controller中有任意一個方法被@ModelAttribute註解標記,頁面請求只要進入這個控制器,不管請求那個方法,均會先執行被@ModelAttribute標記的方法,所以我們可以用@ModelAttribute註解的方法做一些初始化操作。當同一個controller中有多個方法被@ModelAttribute註解標記,所有被@ModelAttribute標記的方法均會被執行,按先後順序執行,然後再進入請求的方法。
當@RequestMapping標記和@ModelAttribute同時標記在一個方法上
點選測試頁面發現進入控制器後返回,頁面報404,這是因為當兩個註解標記到同一個方法上時,邏輯檢視名並不是返回值,而是返回請求的路徑,根據model/modelTest.do生成邏輯檢視。在這裡我們修改下程式碼,把controller上的@RequestMapping標記去掉,並修改下頁面的請求路徑,讓生成的檢視路徑和訪問的頁面路徑相同。
二.@ModelAttribute標記在引數前
點選頁面測試,頁面文字框會顯示URL地址傳遞過來的引數,因為SpringMVC會自動匹匹配頁面傳遞過來的引數的name屬性和後臺控制器中的方法中的引數名,如果引數名相同,會自動匹配,如果控制器中方法是封裝的bean,會自動匹配bean中的屬性,其實這種取值方式不需要用@ModelAttribute註解,只要滿足匹配要求,也能拿得到值