作用:
該注解是 SpringMVC4.3 版本以後新加入的。它可以用于修飾方法和參數。
出現在方法上,表示目前方法會在控制器的方法執行之前,先執行。它可以修飾沒有傳回值的方法,也可以修飾有具體傳回值的方法。
出現在參數上,擷取指定的資料給參數指派。
屬性: value:用于擷取資料的 key。key 可以是 POJO 的屬性名稱,也可以是 map 結構的 key。
應用場景: 當表單送出資料不是完整的實體類資料時,保證沒有送出資料的字段使用資料庫對象原來的資料。
(比如user類中有三個屬性,而我們表單隻送出了兩個屬性,另外一個屬性沒有送出值,預設為空,但是我們想用原來資料庫的值,現在我們就可以選擇modelattribute這個注解)
例如: 我們在編輯一個使用者時,使用者有一個建立資訊字段,該字段的值是不允許被修改的。在送出表單數 據是肯定沒有此字段的内容,一旦更新會把該字段内容置為 null,此時就可以使用此注解解決問題。
index.jsp
<br/>
<form action="anno/testModelAttribute" method="post">
使用者姓名:<input type="text" name="username"/><br/>
使用者年齡:<input type="text" name="age"/><br/>
<input type="submit" value="送出"/>
</form>
controller類
/*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("testModelAttribute執行了...");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(){
System.out.println("showUser執行了");
}
即送出表單資訊不完整。那我們想用資料庫(模拟)中原來的資料。
<br/>
<form action="anno/testModelAttribute" method="post">
使用者姓名:<input type="text" name="uname"/><br/>
使用者年齡:<input type="text" name="age"/><br/>
<input type="submit" value="送出"/>
</form>
我們事先建立了一個javabean的User類,
public class User implements Serializable {
private String uname;
private Integer age;
private Date date;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public String toString() {
return "User{" +
"uname='" + uname + '\'' +
", age=" + age +
", date=" + date +
'}';
}
}
/*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
//注意,這裡面的參數會拿到showUser方法中的user對象裡面的未被指派的date
public String testModelAttribute(User user){
System.out.println("testModelAttribute執行了...");
System.out.println(user);
return "success";
}
/*
* 該方法會先執行
*
* */
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser執行了");
//通過使用者查詢資料庫(模拟)
User user =new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
如果沒有傳回值呢,我們需要使用map集合,把user對象存入到map集合中,然後用modelattribute修飾這個參數,從集合中取出這個user對象。
*ModelAttribute注解*/
@RequestMapping("/testModelAttribute")
//注意,這裡面的參數會拿到showUser方法中的user對象裡面的未被指派的date
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("testModelAttribute執行了...");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
System.out.println("showUser執行了");
//通過使用者查詢資料庫(模拟)
User user =new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc",user);
}