springmvc学习笔记(12)——ModelAttribute
2015-04-23 11:35
106 查看
我们会遇到的问题
我们开发一个项目,最经常做的用例就是增删改查。假设这时候我们要修改一个用户的信息,他的数据库字段如下:id | name | password | age |
---|---|---|---|
1 | zhou | 123456 | 22 |
现在来模拟一下场景:
用户打开界面,要修改个人基本信息
<form action="testModelAttribute" method="post"> id:<input type="text" name="id"> name:<input type="text" name="name"> age:<input type="text" name="age"> <input type="submit" value="submit"> </form>
你可能注意到了,在这个表单中,并没有password。那是肯定的,用户要修改的是基本信息,并不是修改密码。难道每次修改基本信息都要把密码也一起修改了吗?显然不可能。
那么问题来了,挖掘机技术到底哪家强???
I’am just kidding!
回到正题,先看看这样子修改信息会产生什么问题:
@RequestMapping("/testModelAttribute") public String testModelAttribute(User user){ System.out.println(user); //执行更新操作 return "hello"; }
在控制台打印出要修改的User
看到了吧,打印出来的password是null。用户要修改个人信息,这时候你执行了更新操作,将user更新到数据库,那么用户的密码将被你更新为null,也就是说,用户修改了个人信息,密码却没掉了。
解决这个问题,我们可以使用ModelAttribute注解。
如何使用ModelAttribute
先看代码:@RequestMapping("/testModelAttribute") public String testModelAttribute(User user){ System.out.println(user); //执行更新操作 return "hello"; } /** * * @param id 用户ID,required必须为false,否则访问其他方法时将报错 * @param map 从数据库中读出来的user放入map中 */ @ModelAttribute public void getUser(@RequestParam(value="id",required=false) Integer id,Map<String, Object> map){ if(id!=null){ //从数据库读取Id为1的User数据,这里做一个模拟 User user = new User(1,"zhou","123456",22); map.put("user", user); } }
代码解析
在控制层中加入getUser方法,加上注解ModelAttribute。
产生的效果是:当用户访问该控制层中任意一个方法时,都会先调用getUser方法。这时候,用户要更新个人信息,getUser方法调用,根据传过来的Id,从数据库中获取用户的信息,存入map(请求域),然后testModelAttribute方法被调用。从前端传来的user的属性值,一一对应填充到user对象中,而password没有传值过来也不会影响,因为password的值已经从数据库读取了。这时候执行更新操作,用户的密码就不会被置为null了。
结果截图:
# | id | name | password | age |
---|---|---|---|---|
前端传值: | 1 | jackson | null | 35 |
数据库原值 | 1 | zhou | 123456 | 22 |
最后被更新的user | 1 | jsckson | 123456 | 35 |
注意
访问该控制层中其他方法时,都将调用ModelAttrubute注解的方法,因此入参id必须有required=false,否则访问其他方法没有传id的值就会报错。从数据库取出来的值必须放入map或者model中(即放入请求域),这样目标方法才能接收到值
运行流程
执行ModelAttribute修饰的方法:从数据库中取出对象User,把对象放入map中springmvc从map中取出对象,把表单的请求参数赋给User的对应属性
springmvc把上述对象传入目标方法的参数
相关文章推荐
- springmvc学习笔记(12)-springmvc注解开发之包装类型参数绑定
- springmvc学习笔记——ModelAttribute
- springmvc学习笔记(12)-springmvc注解开发之包装类型參数绑定
- springmvc学习笔记(12)-springmvc注解开发之包装类型参数绑定
- springmvc学习笔记(30)——ResponseStatus注解处理异常
- SpringMVC学习笔记四:数据绑定
- Spring学习笔记-springMVC校验框架
- Java基础学习笔记12——(Scanner的使用,String类的概述和使用样例)
- SpringMVC学习笔记(2):请求映射
- SpringMVC学习笔记五:使用converter进行参数数据转换
- SpringMVC学习(12):基于Hibernate+Spring+Spring MVC+Bootstrap的管理系统实现
- 软件开发过程学习笔记(四)之详细设计说明书模板 分类: 开发过程 2015-07-08 14:46 12人阅读 评论(0) 收藏
- 学习笔记之JavaSE(12)--面向对象编程3
- 【Android】学习笔记(12)——Animation使用方法(下)
- 学习笔记:springmvc4.3源码学习:spring解析配置文件过程
- hibernate学习笔记12--Hibernate中使用的集合类型
- Scala学习笔记12【继承、抽象类、trait实战】
- SpringMVC-学习笔记(1)——理解MVC及快速入门
- springmvc学习笔记--REST API的异常处理