首先要了解@ModelAttribute標籤使用的場景:
比如我們在對錶單數據進行修改操作的時候,有一些值是不容許被修改的(比如錄入時間),從前臺表單只對對象中部分屬性值進行賦值,這樣進行的update操作會把沒有被賦值的屬性就賦值爲null,這樣的操作是錯誤的。
爲了解決這一問題,我們先將對象從數據庫中查出,然後再進行從前端頁面賦值,這樣沒有被賦值的屬性依然是數據庫原來的值,這樣進行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]