使用说明
- 作用: 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参 数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可 以修饰没有返回值的方法,也可以修饰有具体返回值的方法。出现在参数上, 获取指定的数据给参数赋值。
- 属性: value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
- 应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字 段使用数据库对象原来的数据。
- 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允 许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段 内容置为 null,此时就可以使用此注解解决问题。
使用示例1
基于 POJO 属性的基本使用(ModelAttribute 修饰方法带返回值) :模拟前端不传密码时,采用数据库原来的密码
jps 代码
<!-- 修改用户信息 -->
<form action="account/updateUser" method="post">
<input type="hidden" name="id" value="2">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
控制器代码:
@ModelAttribute("user")
//此参数必须是具体id,不能从user对象中获取
public User showModel(String id) {
//模拟去数据库查询
User user1 = findUserById(id);
System.out.println("执行了 showModel 方法"+user1);
return user1;
}
private User findUserById(String id) {
User user = new User();
user.setId(id);
user.setUsername("林浩");
user.setAge(19);
user.setPassword("123456");
return user;
}
@RequestMapping("/updateUser")
public String updateUser111(@ModelAttribute("user") User user) {
System.out.println("控制器中处理请求的方法:修改用户:" + user);
return "success";
}
运行结果
使用示例2
基于 Map 的应用场景(ModelAttribute 修饰方法不带返回值):模拟前端不传密码时,采用数据库原来的密码
jsp与前面一样
<!-- 修改用户信息 -->
<form action="account/updateUser" method="post">
<input type="hidden" name="id" value="2">
用户名称:<input type="text" name="username" ><br/>
用户年龄:<input type="text" name="age" ><br/>
<input type="submit" value="保存">
</form>
控制器代码
@ModelAttribute("user")
public void showModel(String id, Map<String,User> map) {
//模拟去数据库查询
User user1 = findUserById(id);
System.out.println("执行了 showModel 方法"+user1);
map.put("user",user1);
}
private User findUserById(String id) {
User user = new User();
user.setId(id);
user.setUsername("林浩");
user.setAge(19);
user.setPassword("123456");
return user;
}
@RequestMapping("/updateUser")
public String updateUser111(@ModelAttribute("user") User user) {
System.out.println("控制器中处理请求的方法:修改用户:" + user);
return "success";
}
运行结果