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";}
效果也是一样的