在方法定义上使用ModelAttribute注解,springMVC在调用目标方法前会逐个调用标准了ModelAttribute注解的方法。
在方法的参数前使用ModelAttribute注解,可以从隐含对象中隐含的模型数据中获取对象,再将请求参数绑定到参数中。
一.应用场景
修改学生信息,密码不改
Student类
package org.springmvc.entity;
public class Student {
private String name;
private String password;
private int age;
private String email;
public Student() {
}
public Student(String name, String password, int age, String email) {
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "Student [name=" + name + ", password=" + password + ", age=" + age + ", email=" + email + "]";
}
}
修改学生信息:
<form action="testModelAttribute" method="post">
name:<input type="test" name="name" value="zhangsan"/> <br>
age:<input type="test" name="age" value="16" />
<br>
email:<input type="test" name="email" value="asd@huawei.com" />
<br>
<input type="submit" value="submit">
</form>
controller:
@RequestMapping("testModelAttribute")
public String testModelAttribute(Student student){
System.out.println(student);
return "success";
}
结果密码变成null
Student [name=zhangsan, password=null, age=12, email=asd@huawei.com]
二.ModelAttribute注解使用
@ModelAttribute
public void getStudent(Map<String, Object> map){
// 模拟从数据库查询学生信息
Student student = new Student("zhangsan","1233456",14,"asd@huawei.com");
System.out.println("从数据库获得的student:" + student);
map.put("student", student);
}
@RequestMapping("testModelAttribute")
public String testModelAttribute(Student student){
System.out.println("修改:"+student);
return "success";
}
结果:
从数据库获得的student:Student [name=zhangsan, password=123456, age=14, email=asd@huawei.com]
修改:Student [name=zhangsan, password=123456, age=16, email=asd@huawei.com]
上述例子运行流程:
- 执行ModelAttribute注解修饰的方法:从数据库中取出对象,把对象放入到map中key为:student
- SpringMVC从map中取出student对象,并把表单的请求参数赋给该student对象的对应属性。
- SpringMVC把上述对象传入目标方法的参数。
注意:目标方法的POJO类型参数没有使用@ModelAttribute注解修饰,则在ModelAttribute修饰的方法中,放入到map时的key值要和目标方法参数类型的第一个字母小写的字符串一致。目标方法有@ModelAttribute注解修饰则key为@ModelAttribute注解注解的value属性值