1.作用
該注解是在SpringMVC4.3版本后新加入的。它可以修飾方法和參數。出現在方法上,表示當前方法會在控制器的方法之前執行。它可以修飾 沒有返回值的方法,也可以修飾沒有返回值的方法。它修飾參數,獲取指定 的數據給參數賦值。
當表單提交的不是完整的實體類型數據時,保證沒有提交數據的 字段使用數據庫對象原來的數據。
例如:我們在編輯一個用戶時,用戶有一個創建信息的字段,該字段的值是不 允許被修改的。在提交表單數據是肯定沒有此字段的內容,一旦更新會把該字段 的內容設置為null。此時就可以使用此注解解決問題。
2.屬性
value:用于獲取數據的key。可以是POJO屬性的名稱,也可以是Map結構的key
3.示例
定義POJO
public class Student {private String username;private String password;private Integer age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +'}';}
}
定義表單
<form action="demo1/showUser" method="post">
姓名: <input type="text" name="username"><br>
年齡: <input type="text" name="age"><br><input type="submit" value="保存"></form>
這個表單中只提交了兩個字段,還有password字段沒有提交
定義控制器方法(ModelAttribute注解修飾的方法帶返回值)
@ModelAttributepublic Student showModel(String username,Integer age){System.out.println("用戶名:" + username + "年齡" + age);Student student = new Student();student.setUsername(username);student.setAge(18);//模擬根據用戶名查詢從數據表查詢到了一個用戶信息
student.setPassword("admin");System.out.println("showModel方法執行了.....");return student;}@RequestMapping("showUser")public String showUser(Student student){System.out.println("showUser方法執行了.....");System.out.println(student);return "success";}
最終輸出的User有password的值
定義控制器方法(ModelAttribute注解修飾的方法也可以不帶返回值)
@ModelAttributepublic void showModel(String username, Integer age, Map<String, Object> map) {System.out.println("用戶名:" + username + "年齡" + age);Student student = new Student();student.setUsername(username);student.setAge(18);student.setPassword("admin"); // 模擬根據用戶名查詢從數據表查詢到用戶信息System.out.println("showModel方法執行了.....");map.put("student", student);}@RequestMapping("showUser")public String showUser(@ModelAttribute("student") Student student) {System.out.println("showUser方法執行了.....");System.out.println(student);return "success";}
效果也是一樣的