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);功能类似。

  1. public String test(@ModelAttribute("user") UserModel user)   

此处多了一个注解@ModelAttribute("user"),它的作用是将该绑定的命令对象以“user”为名称添加到模型对象中供视图页面展示使用。我们此时可以在视图页面使用${user.username}来获取绑定的命令对象的属性。

②暴露@RequestMapping 方法返回值为模型数据:放在功能处理方法的返回值上时,是暴露功能处理方法的返回值为模型数据,用于视图页面展示时使用。

 
  1. 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  

posted @ 2017-02-14 15:06  Timer©jiao  阅读(254)  评论(0)    收藏  举报