@ModelAttribute注解的作用


問題描述:當我們使用表單傳值得時候,如果定義了,nameaddressage。等屬性,那么通過表單傳過去的值就只有這3個屬性,但是我們需要的namepassaddressage等四個屬性。那么在提交表單並賦值的時候就會出現,未得到的值為null的情況。如下圖:

獲取的passnull

那么我們需要用@ModelAttribute注解來解決他:

實現代碼如下:

 

 1 @ModelAttribute
 2     public void getUsers(@RequestParam(value="name",required=false) String name,Map<String, Object> map){
 3         if(name!=null){
 4             System.out.println("調用ModelAttribute");
 5             //模擬從數據庫中獲取的對象。
 6             User users = new User("cjh","123","123@qq.com","China");
 7             System.out.println("從數據庫中獲取一個對象"+users);
 8             map.put("user",users);
 9         }
10     }
11     @RequestMapping("/getInfo")
12     public String getServletAPI(User user){
13         String viewName = "hello";
14         System.out.println("修改:"+user);
15         return viewName;
16     }

 

@ModelAttribute注解的方法,在這個控制器中不管其他任何一個方法被調用,都會執行。

 

以上代碼的運行流程為

 

1.首先執行@ModelAttribute注解修飾的方法,從數據庫中查找出對應要修改的對象,把值放在map鍵值對中,key應該和處理請求的方法傳入的參數名一樣,如:此處定義的傳入參數名為user,那么map.put(“user”,值(從數據庫中查詢的對象))。這個Map需要定義在方法入參的地方(代碼如上)。

 

2.Spring MVC會從Map中找出user對象,並把表單請求參數賦值給該user對象,只有表單定義了的屬性才會被替換,沒定義的為null,不改變。所以要求@ModelAttribute修飾的方法中定義的key的名稱要和控制器方法(@RequestMapping()修飾的方法)中入參的名稱要一致。否則沒效果。

 

3.Spring MVC 把上述對象傳入目標方法的參數。

 

注意:在@ModelAttribute 修飾的方法中,放入到map時的鍵要和目標方法入參類型的參數名一致。

 

最終效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM