七、Spring MVC之ModelAttribute
前面几篇文章分别说了spring mvc如何传参数到后台,如何返回参数到前台。今天来说一下,spring mvc的ModelAttribute注解,这个注解有什么作用,什么场景下使用?
1、应用场景:数据更新。例如有一个实体User,其中有id、userName、age、email、createTime等属性,createTime定义了用户的创建时间,一般都是后台自动获取并赋值。除了id和createTime之外的User的其他属性,都是可以编辑修改的,如下图所示。
而此时我们的后台,一般会使用对象进行接收参数,如下所示:
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println(user);
return "success";
}
测试代码,设定user的默认值,可以看到后台的输出
User{userName='lxy', password='null', email='test@126.com',
age=20, createTime=null, address=null}
,user对象只有userName、age、emai有值,其它的都是null:
<form action="/testModelAttribute/testModelAttribute" method="post">
userName:<input type="text" name="userName" value="lxy"/> <br/>
age:<input type="text" name="age" value="20"/> <br/>
email:<input type="text" name="email" value="test@126.com"/> <br/>
<input type="submit" value="submit" />
</form>
如果我们这个时候更新数据库的话,就需要先查询一下数据库,读出来之前user对象的值,然后把前台传递过来的参数设置到user上,否则就会导致部分数据丢失。
另一种解决方案是在编辑之前,先把数据查询出来,然后在页面上使用隐藏域,把其它的值放在隐藏域中,然后使用在提交form表单的时候,把隐藏域的数据一并提交到后台。
2、配合使用ModelAttribute注解,这里根据参数userName,模拟从数据库中读取数据
@ModelAttribute
public void getUserById(@RequestParam(value = "userName", required = false)
String userName, Map<String, Object> map) {
System.out.println("任何时候我都会被调用");
if(userName != null) {
//模拟读取数据库中的数据
User user = new User();
user.setUserName("lxy");
user.setAge(18);
user.setPassword("123456");
user.setEmail("lxy@126.com");
user.setCreateTime(new Date());
map.put("user", user);
}
}
此时,再次运行项目,可以看到后台的输出为:email和age是前台传递过来的参数,而password和createTime都是从数据库中读取出来的数据,这就可以直接根据user实体,更新数据库了。
User{userName='lxy', password='123456', email='test@126.com', age=20,
createTime=Mon Mar 20 18:03:31 CST 2017, address=null}
3、注意,访问controller中的任意的方法,都会调用被ModelAttribute注解的方法。所以说这个注解要慎用,在适用在注解之前,需要认真考虑是否真的合适。
@RequestMapping("/testRun")
public String testRun(){
System.out.println("我就看看会不会调用ModelAttribute注解修饰的方法");
return "success";
}
访问上面的方法,可以看到下面的输出,被ModelAttribute注解修饰的方法,会先于目标方法执行:
任何时候我都会被调用
我就看看会不会调用ModelAttribute注解修饰的方法
4、在目标方法的参数上使用ModelAttribute注解
上面我们看到在被ModelAttribute注解修饰的方法上,如果要想被取到值,在方法中必须要这样设置,
User user = new User();
user.setUserName("lxy");
user.setAge(18);
user.setPassword("123456");
user.setEmail("lxy@126.com");
user.setCreateTime(new Date());
//如果设置的key为temp,则目标方法上必须要有相应的注解声明,才能起到效果
map.put("temp", user);
@RequestMapping("/testModelAttribute2")
public String testModelAttribute2(@ModelAttribute("temp")User user){
//这里的temp与被ModelAttribute注解修饰的方法的存放的key一致
System.out.println(user);
return "success";
}
项目源代码:
https://git.oschina.net/acesdream/spring-mvc
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341