使用場景:在控制器方法獲取用戶表單傳來的POJO,而且根據POJO修改數據庫時,會出現有些字段數據沒有出如今實參的POJO中,可是若是直接修改會致使那些沒有賦值的字段變爲null,因此須要引入@ModelAttribute。web
@ModelAttribute思想是把用戶表單數據封裝成POJO對象前,從數據庫取出對應記錄並封裝成POJO對象,而後根據表單數據修改這個POJO對象,那麼那些沒有數據的字段就仍然會是原先數據庫中的數據。spring
因此,須要如下步驟數據庫
順便整理沒有使用@ModelAttribute以前的步驟markdown
因此,使用@ModelAttribute後,增長了一、2兩步,而且把第三步中原來應新建立的對象改成從數據庫中取出並封裝好的對象。session
具體實現其實添加一、2兩步工做就好,第三步的差異會由SpringMVC自動識別並進行改變。app
一、2兩步也能夠合併爲一步,具體爲編寫一個方法,在其中取出數據庫數據並封裝,而後把它添加到ModelMap中。而這個方法只須要添加@ModelAttribute註解,SpringMVC將會自動在獲得用戶表單數據後,可是在封裝成POJO對象前調用。如下爲一個例子:ui
//在執行全部方法以前自動執行該方法 @ModelAttribute public void getUser(@RequestParam(value = "id",required = false)Integer id,ModelMap map){ if (id!=null){ //此處經過硬編碼賦值的方式建立一個新的POJO對象,可是實際過程當中應該是從數據庫中取出數據而且封裝而成的。 User user = new User(); user.setId(1); user.setUsername("tom"); user.setPassword("123456"); user.setAge(22); //把建立好的對象放入ModelMap中 map.put("user",user); } } @RequestMapping("/modelAttribute") public String modelAttribute(User user){ System.out.println(user); return "success"; }
固然這裏還有一些問題要處理:編碼