Springmvc @ModelAttribute和@SessionAttribute的区别

来源:互联网 发布:c#泛型和数组 编辑:程序博客网 时间:2024/06/05 19:21


1.@ModelAttribute

a.注解在方法上

注解在方法上的 @ModelAttribute  说明了方法的作用是用于添加一个或多个属性到model上。这样的方法能接受与 @RequestMapping 注解相同的参数类型,只不过不能直接被映射到具体的请求上。在同一个控制器中,注解了@ModelAttribute的方法实际上会在@RequestMapping 方法之前被调用


@ModelAttributepublic Account addAccount(@RequestParam String number) {return accountManager.findAccount(number);}// Add multiple attributes@ModelAttributepublic 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.POST)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";  @Autowiredprivate 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();  //表示将使用完的数据清理出sessionreturn "redirect:reportSetting.anno";}}

通过类型把数据存储到session中

@SessionAttributes(types=ReportSetting.class)



阅读全文
0 0