SpringMVC標籤之ModelAttribute

首先要了解@ModelAttribute標籤使用的場景:

  1. 比如我們在對錶單數據進行修改操作的時候,有一些值是不容許被修改的(比如錄入時間),從前臺表單只對對象中部分屬性值進行賦值,這樣進行的update操作會把沒有被賦值的屬性就賦值爲null,這樣的操作是錯誤的。

  2. 爲了解決這一問題,我們先將對象從數據庫中查出,然後再進行從前端頁面賦值,這樣沒有被賦值的屬性依然是數據庫原來的值,這樣進行update操作就不會有問題。

@ModelAttribute標籤就能幫我們解決這個問題,看示例:
前端頁面代碼:

<!--  
        模擬修改操作
        1. 原始數據爲: 1, Tom, 123456,[email protected],12
        2. 密碼不能被修改.
        3. 表單回顯, 模擬操作直接在表單填寫對應的屬性值
    -->
    <form action="${pageContext.request.contextPath}/testModelAttribute" method="Post">
        <input type="hidden" name="id" value="1"/>
        username: <input type="text" name="username" value="Tom"/>
        <br>
        email: <input type="text" name="email" value="[email protected]"/>
        <br>
        age: <input type="text" name="age" value="12"/>
        <br>
        <input type="submit" value="Submit"/>
    </form>

有 @ModelAttribute 標記的方法:

/**
 * 1. 有 @ModelAttribute 標記的方法, 會在每個目標方法執行之前被 SpringMVC 調用! 
 * 2. @ModelAttribute 註解也可以來修飾目標方法 POJO 類型的入參, 其 value 屬性值有如下的作用:
 * 1). SpringMVC 會使用 value 屬性值在 implicitModel 中查找對應的對象, 若存在則會直接傳入到目標方法的入參中.
 * 2). SpringMVC 會以 value 爲 key, POJO 類型的對象爲 value, 存入到 request 中. 
 */
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id, 
    Map<String, Object> map){
    System.out.println("modelAttribute 方法");
    if(id != null){
        //模擬從數據庫中獲取對象
        User user = new User(1, "Tom", "123456", "[email protected]", 12);
        System.out.println("從數據庫中獲取一個對象: " + user); 
        map.put("user", user);
    }
}

目標方法:

/**
  * 運行流程:
  * 1. 執行 @ModelAttribute 註解修飾的方法: 從數據庫中取出對象, 把對象放入到了 Map 中. 鍵爲: user
  * 2. SpringMVC 從 Map 中取出 User 對象, 並把表單的請求參數賦給該 User 對象的對應屬性.這裏沒有賦值的屬性還是數據庫中的值.
  * 3. SpringMVC 把上述對象傳入目標方法的參數. 
  *注意:如果目標方法的入參沒有用@ModelAttribute修飾, 在 @ModelAttribute 修飾的方法中, 放入到 Map 時的鍵需要和目標方法入參類型的第一個字  母小寫的字符串一致!
  **/ 
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@ModelAttribute("user")  User user){
    System.out.println("目標方法");
    System.out.println("修改: " + user);
    return SUCCESS;
}

運行結果:

從數據庫中獲取一個對象: User [id=1, username=Tom, password=123456, email=tom@haha.com, age=12]
修改: User [id=1, username=Tom, password=123456, email=tom@haha.com, age=15]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章