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)