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