spring modelAttributes的使用

原创 2016年06月02日 11:45:11
spring modelAttributes的使用
(1)用在处理方法(有requestmapping注解的方法)的入参之前,用来将请求参数注入到特定对象,并且将得到的对象暴露在模型数据中(暴露的意思就是将该对象添加到modelMap中,并指定对象的名字,方便在视图中使用)。如下所示:

    @RequestMapping(value = "show", method = RequestMethod.GET, headers = "Accept=application/json")
    public ModelAndView getHelloView(HttpServletResponse response, @ModelAttribute("userbefore") UserModel user,
            ModelMap modelMap)
    {

        logger.info("getHelloView USER:" + ToStringBuilder.reflectionToString(user));

        logger.info("getHelloView USER BEFORE:" + ToStringBuilder.reflectionToString(modelMap.get("userbefore")));
        return new ModelAndView("hello", "message", "please login first!");
    }


http://localhost:8080/mvctest/hello/show?username="lp"&hobbyList[0]="soccer"&extraMap["address"]="nanjing"


其实,如果仅仅需要完成自动注入的功能,不需要加@modelAttribute就可以完成
(2)用在处理方法的返回类型前,可以将处理方法返回的结果暴露到模型数据中。
(3)用在非处理方法上,被@ModelAttribute注解的方法会在该处理器的每一个处理方法被访问之前调用,如果处理器有多个处理方法,应谨慎使用。这种个注解方式,会使得方法返回的对象暴露在模型数据中,然后可以在处理方法中直接使用该对象。
   @ModelAttribute("userbefore")
    public UserModel getUserBefore()
    {
        UserModel user = new UserModel();
        user.setUserflag("getUserBefore");
        user.setUsername("hello");
        logger.info("getUserBefore:" + ToStringBuilder.reflectionToString(user));
        return user;
    }

public class UserModel
{
    private String username;
    private String password;
    private List<String> hobbyList;
    private Map<String, String> extraMap;
    private String userflag;
....
}



(4)疑点:在参考《http://sishuok.com/forum/blogPost/list/6233.html》的过程中发现一些问题,总结如下:
     当在非处理方法getUserBefore之前用@modelAttribute("userbefore")注解,则该方法返回的user对象会以userbefore为名称存储在模型数据中。与此同时,在处理器方法getHelloView中使用@modelAttribute("userbefore")进行入参绑定。文章中说,spring mvc 会先去模型数据中查找是否存在名叫userbefore的对象,如果存在则直接使用该对象,否则通过反射机制重新创建一个新的user对象,并注入参数。但是,通过测试代码,会发现,getHelloView中获得的对象的属性值跟入参一致,与getUserBefore中新建的对象并不是同一个,而且处理方法中的@ModelAttribute注解绑定的对象会覆盖掉非处理方法中存储的对象(可能是我理解偏差,欢迎大家指正)。
    基于上述注解,继续在控制器类上使用SessionAttributes(value={"userbefore"}),这时spring mvc的处理流程如下:
    i.首先根据sessionAttributes注解的value属性,将所有的指定的会话中的对象加入模型数据
    ii.如果模型数据中不存在userbefore对象,则执行getUserBefore方法,并把返回的对象暴露在模型数据中。否则直接取会话中的对象,不再执行getUserBefore方法
    iii.对于处理器方法中入参前面的@ModelAttributes("userbefore"),文章中说:先去模型数据中查找同名对象,如果存在,直接使用,如果不存在则通过反射机制创建并注入参数,并暴露在模型数据中。但是测试发现,得到的对象与请求参数中的属性值保持一致。
(5)匿名绑定命令参数,没有指定value时,这时的对象暴露在模型数据中,其名称是什么呢?spring mvc有一套默认机制,即处理集合类,一律是类型名首字母小写。对于集合类是元素类型名首字母小写+List

spring学习之@ModelAttribute运用详解

@ModelAttribute使用详解 1.@ModelAttribute注释方法     例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此co...
  • li_xiao_ming
  • li_xiao_ming
  • 2012年12月20日 11:38
  • 268794

@ModelAttribute注解的用法

@ModelAttribute可以用于注解方法和参数。 1、注解Controller中的方法时,返回的参数是一个属性值,@ModelAttribute注解的方法在Controller中每...
  • zxygww
  • zxygww
  • 2015年05月18日 13:27
  • 4058

SpringMVC基础-@ModelAttribute注解&PUT请求方式修改数据

在总结@ModelAttribute注解功能配合PUT请求方式使用之前,先来总结一下POJO类作为入参接收form表单POST提交方式提交数据。 POJO类接收参数 总的来说POJO类还是与普通的J...
  • qq_24868901
  • qq_24868901
  • 2016年01月29日 11:00
  • 288

spring modelAttributes的使用

spring modelAttributes的使用 (1)用在处理方法(有requestmapping注解的方法)的入参之前,用来将请求参数注入到特定对象,并且将得到的对象暴露在模型数据中(暴露的意...
  • lp09160206
  • lp09160206
  • 2016年06月02日 11:45
  • 676

spring学习之@ModelAttribute运用详解

@ModelAttribute使用详解 1.@ModelAttribute注释方法      例子(1),(2),(3)类似,被@ModelAttribute注释的方法会在此c...
  • my543843165
  • my543843165
  • 2016年10月21日 14:18
  • 431

spring modelAttributes、sessionAttributes、redirectAttributes

作为一个javaweb应用的开发者,你快速学习了request(HttpRequest)和Session(HttpSession)的范围,理解这些范围并且在这些范围内数据和对象是如何是进出的对设计和构...
  • shendeguang
  • shendeguang
  • 2018年01月25日 16:34
  • 17

Spring3MVC 在JSP中使用@ModelAttribute--源自技术

在教程中,我们将创建一个简单的Spring3MVC simple CRUD应用程序.  什么是@ModelAttribute  Spring3关于@ModelAttribute的文档 (h...
  • MyJava_Dx
  • MyJava_Dx
  • 2016年04月07日 15:37
  • 2445

@ModelAttribute 用法(完全转载)

完全转载的目的就是为了方便阅读。 http://blog.sina.com.cn/s/blog_6d3c1ec601017q4p.html spring学习之@ModelAttribute运用...
  • u012246342
  • u012246342
  • 2016年09月22日 16:12
  • 570

SpringMVC重定向视图RedirectView小分析

SpringMVC重定向视图RedirectView小分析  前言   SpringMVC是目前主流的Web MVC框架之一。        本文所讲的部分内容跟SpringMVC的视图机制有关,Sp...
  • wilsonke
  • wilsonke
  • 2014年09月10日 09:36
  • 16370

@ModelAttribute和@SessionAttributes的用法

1.@SessionAttribute是Controller类级别的注解,作用是为了将指定名称或类型的隐含模型中的对象放置到Session作用域中,实现多次请求共享参数,在每次请求的时候,使用@Ses...
  • yu870646595
  • yu870646595
  • 2016年04月18日 10:49
  • 1382
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring modelAttributes的使用
举报原因:
原因补充:

(最多只允许输入30个字)