springside4项目源码研读(3) -- springmvc实现参数的二次绑定

来源:互联网 发布:pdg2pic mac 编辑:程序博客网 时间:2024/06/01 23:01

二次绑定以前是听说过的,当时那个项目领导说的神乎其神,感觉也很牛逼的样子,不过今天看了看就是一种思路,也就那么回事吧。

假设这样的一个场景:用户更新功能,但jsp页面只允许用户更改用户名和密码,角色,权限,注册时间什么的就不让你更改了,也就是form表单向后台只传递username,password两个参数,此时就应该用到参数的二次绑定了。

详细代码请看 springside4的quickstart项目中的UserAdminController.java中的update方法:

@RequestMapping(value = "update", method = RequestMethod.POST)
public String update(@Valid @ModelAttribute("user") User user, RedirectAttributes redirectAttributes) {
accountService.updateUser(user);
redirectAttributes.addFlashAttribute("message", "更新用户" + user.getLoginName() + "成功");
return "redirect:/admin/user";
}


@ModelAttribute
public void getUser(@RequestParam(value = "id", defaultValue = "-1") Long id, Model model) {
if (id != -1) {
model.addAttribute("user", accountService.getUser(id));
}
}

springmvc用到二次绑定的关键点在于@ModelAttribute这个注解,这个注解会在每个@requestMapping映射到的方法执行之前先执行@ModelAttribute

映射的方法也就是getUser这个方法。由getUser方法可知:就在request上加上一个user的attribute。方法执行完,开始进入update方法,

而在@ModelAttribute("user")又将其取出,此时的User已经有的属性值,然后form表单的属性值在这里覆盖掉相应的属性值,这就是所谓的二次绑定,

form没有传递的属性,沿用getUser中的user属性值,这个就不会出现你在这里new一个user然后只能设置username和password属性,其他属性

你如果通过user.id找到user还要手动设置下其他属性,如果你找不到原来的user其他属性,就会覆盖掉原来user的属性值,导致更新后的user

只有username和password两个属性,其他属性都变成了null。

这就是参数的二次绑定。

0 0
原创粉丝点击