@ModelAttribute简介
被@ModelAttribute注释的方法会在此controller每个方法执行前被执行。
因此对于一个controller映射多个URL的用法来说,要谨慎使用。更好的方法是使用@Controller的时候同时加上@RequestMapping(value = ‘xxx’),以便把Mapping分开多级目录管理
例如下面这个UserController,他只管User的事情,所以Mapping都是User下的。
这样可以没有顾虑地使用@ModelAttribute。
@Controller
@RequestMapping(value = "user")
public class UserController {
@Autowired
private TbUserService tbUserService;
//在所有@RequestMapping之前执行
@ModelAttribute
public TbUser getTbUser(Long id) {
TbUser tbUser = null;
if(id != null){
tbUser = tbUserService.getById(id);
}else{
tbUser = new TbUser();
}
return tbUser;
}
@RequestMapping(value = "save",method = RequestMethod.POST)
public String save(TbUser tbUser,Model model, RedirectAttributes redirectAttributes){
BaseResult baseResult = tbUserService.save(tbUser);
if(baseResult.getStatus()==BaseResult.STATUS_SUCCESS){
redirectAttributes.addFlashAttribute("baseResult",baseResult);
return "redirect:/user/list";
}else{
model.addAttribute("baseResult",baseResult);
return "user_form";
}
}
@ModelAttribute用法
如刚刚的那段代码中的最后一个方法(save
),tbUserService.save(Tbuser tbuser)
方法会根据传入的tbuser是否已经有id值进行新建或更新用户操作,以修改操作为例:
tbUserService.save(Tbuser tbuser)
的参数是由使用了@ModelAttribute的getTbUser(Long id)
方法的返回值tbuser
得到的。也就是说在进行一次修改操作时,修改前的数据来源于数据库而不是前端,这能提高执行并发环境下修改操作的安全性