SpringMVC 之@ModelAttribute

使用場景:在控制器方法獲取用戶表單傳來的POJO,而且根據POJO修改數據庫時,會出現有些字段數據沒有出如今實參的POJO中,可是若是直接修改會致使那些沒有賦值的字段變爲null,因此須要引入@ModelAttribute。web

@ModelAttribute思想是把用戶表單數據封裝成POJO對象前,從數據庫取出對應記錄並封裝成POJO對象,而後根據表單數據修改這個POJO對象,那麼那些沒有數據的字段就仍然會是原先數據庫中的數據。spring

因此,須要如下步驟數據庫

  1. 在獲得用戶表單數據後,可是在封裝成POJO對象前,從數據庫中取出數據並封裝。
  2. 把封裝好的對象交給SpringMVC
  3. SpringMVC根據表單數據修改上一步傳入的POJO對象
  4. SpringMVC把修改後的對象做爲控制器中具體用來修改數據庫的方法的實參傳入。
  5. 執行數據庫修改操做

順便整理沒有使用@ModelAttribute以前的步驟markdown

  1. SpringMVC建立一個新的POJO對象,而後根據表單傳入的數據修改對象數據
  2. SpringMVC把修改後的對象做爲控制器中具體用來修改數據庫的方法的實參傳入。
  3. 執行數據庫修改操做

因此,使用@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";
}

固然這裏還有一些問題要處理:編碼

  1. 添加了@ModelAttribute註解的方法將在全部控制器方法執行以前執行,因此必需要判斷具體狀況並執行咱們想要的代碼。上述例子中是經過判斷是否存在id,這個id是經過表單傳入的,而其餘方法不會傳入該屬性。
  2. 在map中放入放入的鍵值對的鍵默認爲POJO類名並把首字母改成小寫。若是須要自定義該鍵名,則須要在控制器方法的POJO類型形參前加入@ModelAttribute而且把value屬性改成須要自定義的鍵名。如:@ModelAttribute(value = 「myuser」)User user
  3. 若是在ModelMap中不存在對應的鍵值對,那麼SpringMVC會判斷當前的控制器類是否添加了SessionAttribute註解,若是添加了且value屬性中有對應的鍵名(在上述例子中就是user),可是實際的session中找不到該鍵值對,那麼SpringMVC將會拋出異常,例如:org.springframework.web.HttpSessionRequiredException: Session attribute ‘user’ required - not found in session
  4. 若是在ModelMap中不存在對應的鍵值對,或當前控制器類沒有添加SessionAttribute註解,或添加了SessionAttribute註解可是value屬性沒有對應的鍵名,SpringMVC將會經過反射機制建立一個新的POJO對象傳入對應的方法中。
  5. 若是在同一控制器中定義了多個有@ModelAttribute註解的方法,則按在類中定義的順序反序執行。
相關文章
相關標籤/搜索