SpringMVC中常用注解之@SessionAttribute和@ModelAttribute详解
原文:http://blog.csdn.net/linzhiqiang0316/article/details/52319045
Model作为通用的模型数据承载对象,传递数据供视图所用。我们可以在请求处理方法中声明一个Model类型的入参,Spring会将本次请求模型对象引用通过该入参传递进来,这样就可以在请求处理方法内部访问模型对象了。
使用Model访问请示对应的隐含模型对象
/** * 选择管理维度属性值 * * @param model * @param ruleAppId * @return * @throws Exception */ @RequestMapping(value = "/showDimAttr.do") public String showDimAttrForm(Model model, String ruleAppId) throws Exception { logger.info("选择管理维度属性值"); // 查询用户选择的规则应用, 找不到就返回 RuleApp newRuleApp = ruleAppService.getRuleAppByRuleAppId(ruleAppId); if (newRuleApp == null) { logger.warn("未找到需要操作的规则应用."); return "redirect:/showGrantForm.do"; } // 判断该规则应用是否存在维度 if (newRuleApp.isRuleAppType()) { // 获取管理维度信息 setMgmtDimIntoModel(model, newRuleApp, ruleAppId); return ".page.showUserMgmtDimValues"; } else { model.addAttribute("ruleAppId", ruleAppId); return "redirect:/saveUserCodes.do"; } } / * 选择将授予用户的规则应用 * * @param model
* @return * @throws ServiceException */ @RequestMapping(value = "/showGrantForm.do", method = RequestMethod.GET) public String showGrantForm(Model model, String userId) throws ServiceException { logger.info("显示需要授权给用户的规则应用"); List<RuleApp> ruleApps = ruleAppService.getAllRuleApps(); List<RuleApp> newRuleApps = new ArrayList<RuleApp>(); for (RuleApp ruleApp : ruleApps) { if (ruleApp.isRuleAppType()) { newRuleApps.add(ruleApp); } } model.addAttribute("ruleApps", newRuleApps);
//将userId以userId为键放入model中 model.addAttribute("userId", userId); return ".page.selectRuleApps"; }
对于当次请求所对应的模型对象来说,其所有属性都将存放到request的属性列表中。像以上的例子,model中的userId等属性将放到request的属性列表中,所以可以在jsp视图页面中通过request.getAttribute("userId")或者通过${userId}EL表达式访问模型对象中的userId。从这个角度上看,model相当于是一个向request属性列表中添加对象的一条管道,借由model对象的支持,我们可以在一个不依赖ServletAPI的Controller中向request中添加属性。
在默认情况下,Model中的属性作用域是request级别。也就是说,当本次请求结束后,model中的属性将销毁。如果希望在多个请求中共享Model中的属性,必须将其属性转存到Session中,这样Model的属性才可以被跨请求访问。
Spring 允许我们有选择地指定 ModelMap 中的哪些属性需要转存到 session 中,以便下一个请求属对应的 ModelMap 的属性列表中还能访问到这些属性。这一功能是通过类定义处标注 @SessionAttributes 注解来实现的。
@Controller @SessionAttributes({ WebAttributes.AUTHENTICATION_EXCEPTION, "ruleAppId", "userId" })//将Model中属性名为ruleAppId,userId的属性放到session属性列表中,以便这个属性可以跨请求访问 public class UserMgmtController {
我们在前面添加了一个model属性,其属性名为userId,而此处通过@SessionAttributes注解将model中名为userId的属性放置到Session中
@SessionAttributes注解只能在类上使用,不能在方法上使用
被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
总结:
@ModelAttribute具有如下三个作用:
①绑定请求参数到命令对象:放在功能处理方法的入参上时,用于将多个请求参数绑定到一个命令对象,从而简化绑定流程,而且自动暴露为模型数据用于视图页面展示时使用。其实@ModelAttribute此处对于供视图页面展示来说与model.addAttribute("attributeName", abc);功能类似。
- public String test(@ModelAttribute("user") UserModel user)
此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。
②暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。
- public @ModelAttribute("user2") UserModel test3(@ModelAttribute("user2") UserModel user)
大家可以看到返回值类型是命令对象类型,而且通过@ModelAttribute("user2")注解,此时会暴露返回值到模型数据( 名字为user2 ) 中供视图展示使用
@ModelAttribute 注解的返回值会覆盖@RequestMapping 注解方法中的@ModelAttribute 注解的同名命令对象
③暴露表单引用对象为模型数据:放在处理器的一般方法(非功能处理方法)上时,是为表单准备要展示的表单引用对象,如注册时需要选择的所在城市等,而且在执行功能处理方法(@RequestMapping 注解的方法)之前,自动添加到模型对象中,用于视图页面展示时使用;
@ModelAttribute
• 作用域:request
• 例如
@RequestMapping("/base/userManageCooper/init.do")
public String handleInit(@ModelAttribute("queryBean") ManagedUser sUser,Model model,){
• 或者
@ModelAttribute("coopMap")//coopMap将返回到页 面
public Map<Long,CooperatorInfo> coopMapItems(){}
• 说明
@ModelAttribute 声明在属性上,表示该属性的value 来源于model 里"queryBean" ,并被保存到model 里。@ModelAttribute声明在方法上,表示该方法的返回值被保存到model 里 。

浙公网安备 33010602011771号