ModelAttribute
1.在方法定义上使用 @ModelAttribute 注解:Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
2.在方法的入参前使用 @ModelAttribute 注解:
- 可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数绑定到对象中,再传入入参
- 将方法入参对象添加到模型中
/*
* 有 @ModelAttribute 标记的方法,会在每个目标方法之前被 Spring MVC 调用
*/
@ModelAttribute
public void getUser(@RequestParam(value="id",required=false) Integer id,Map<String,Object>map) {
if(id != null) {
//模拟从数据库中取出数据
User user = new User(1, "Tom", "123456", 22);
System.out.println("从数据库中获取的对象 : " + user);
map.put("user", user);
}
}
/*
* 运行流程:
* 1.执行 @ModelAttribute 注解修饰的方法:从数据库中取出对象,将对象放到 Map 中。键为 user
* 2.Spring MVC 从 Map 中取出 User 对象,并把表单的请求参数赋给该 User 对象的属性中。
* 3.Spring MVC 将上述对象传入目标方法的参数。
*
* 注意:在 @ModelAttribute 注解修饰的方法中,放入到 Map 时的键要和目标方法参数类型第一个字母小写的字符串一致。
*/
@RequestMapping("testModelAttribute")
public String testModelAttribute(User user) {
System.out.println("修改:" + user);
return SUCCESS;
}
@ModelAttribute 注解修饰的方法中,map.put(“user”,user) 中键 “user”,应该为 testModelAttribute(User user) 中 User 首字母小写
运行流程:
1.表单提交后,先执行 @ModelAttribute 注解修饰的方法 getUser(),把 user 放到 map 中。
2.SpringMVC 从 map 中取出 User 对象,然后把表单的请求参数附给 User 对象的属性值。
3.Spring MVC 将上述对象传入目标方法 testModelAttribute 的参数。
用到此技术的地方:
当我们在对数据库某条记录修改时,以 User 为例,我们需要修改数据库中一条 User 记录,但是其 name 和 id 属性不能被修改,这时我们从表单中获取的数据是不包含 name 和 id 属性的,如果我们不使用 @ModelAttribute,那么在目标方法中获取到的 user 中 name 和 id 属性就为 null,如果此时写到数据库中就会出现问题。使用 @ModelAttribute 提前将原数据 user 取出来,再将表单提交的信息填充到此时的 user 中,这样就解决了该问题。