1.@ModelAttribute
a.注解在方法上
注解在方法上的 @ModelAttribute 说明了方法的作用是用于添加一个或多个属性到model上。这样的方法能接受与 @RequestMapping 注解相同的参数类型,只不过不能直接被映射到具体的请求上。在同一个控制器中,注解了@ModelAttribute的方法实际上会在@RequestMapping 方法之前被调用
@ModelAttribute public Account addAccount(@RequestParam String number) { return accountManager.findAccount(number); } // Add multiple attributes @ModelAttribute public void populateModel(@RequestParam String number, Model model) { model.addAttribute(accountManager.findAccount(number)); // add more ... } 在第一种写法中,方法通过返回值的方式默认地将添加一个属性;在第二种写法中,方法接收一个 Model 对象,然后可以向其中添加任意数量的属性
b.注解在参数上
注解在方法参数上的 @ModelAttribute 说明了该方法参数的值将由model中取得。如果model 中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中 所有名称匹配的参数都会填充到该参数中
@RequestMapping(path = "/owners/{ownerId}/pets/{petId}/edit", method = RequestMethod.P OST) public String processSubmit(@ModelAttribute Pet pet) { }
2.@SessionAttributes
@SessionAttributes用来标注那些数据可以通过Session来管理(其实也可以用作http请求之间转换时,数据的存储)
@SessionAttributes允许通过两种方法来管理将那些数据存进session中,一种通过类型,一种是通过属性名称
例如:
通过属性名称来吧数据存储到session中
@Controller @RequestMapping("/reportSetting.anno") @SessionAttributes(names="command") public class ReportSettingAnnotationController { public final static String FROM_VIEW_NAME = "anno/reportSetting"; @Autowired private IReportSettingManager reportSettingManager; @RequestMapping(method=RequestMethod.GET) public String displayReportSettings(ModelMap model){ ReportSetting reportSettings = getReportSettingManager().getReportSettings(); model.addAttribute("command", reportSettings); } public String updateReportSetting(@ModelAttribute("command")ReportSetting reportSettings,BindingResult result,SessionStatus status){ if(result.hasErrors()){ return FROM_VIEW_NAME; } getReportSettingManager().updateReportSettings(reportSettings); status.setComplete(); //表示将使用完的数据清理出session return "redirect:reportSetting.anno"; } } 通过类型把数据存储到session中@SessionAttributes(types=ReportSetting.class)