spring modelAttributes的使用
2016-06-02 11:45
447 查看
spring modelAttributes的使用
(1)用在处理方法(有requestmapping注解的方法)的入参之前,用来将请求参数注入到特定对象,并且将得到的对象暴露在模型数据中(暴露的意思就是将该对象添加到modelMap中,并指定对象的名字,方便在视图中使用)。如下所示:
http://localhost:8080/mvctest/hello/show?username="lp"&hobbyList[0]="soccer"&extraMap["address"]="nanjing"
其实,如果仅仅需要完成自动注入的功能,不需要加@modelAttribute就可以完成
(2)用在处理方法的返回类型前,可以将处理方法返回的结果暴露到模型数据中。
(3)用在非处理方法上,被@ModelAttribute注解的方法会在该处理器的每一个处理方法被访问之前调用,如果处理器有多个处理方法,应谨慎使用。这种个注解方式,会使得方法返回的对象暴露在模型数据中,然后可以在处理方法中直接使用该对象。
(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
(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
相关文章推荐
- springMVC参数注解
- @ModelAttribute和@SessionAttributes的用法
- springmvc的ModelAttribute注解
- Spring MVC系列(四)之session处理---@SessionAttributes
- SpringMVC学习笔记(6):处理模型数据(1)
- SpringMVC学习笔记(7):处理模型数据(2)
- SpringMVC学习之@ModelAttribute运用详解
- SpringMVC常用注解實例詳解2:@ModelAttribute GOOD
- Spring MVC之@RequestBody, @ResponseBody @PathVariable @SessionAttributes @ModelAttribute详解
- Spring MVC示例及常用注解(二)
- 处理模型数据 Spring mvc ModelAndView
- Spring MVC @ModelAttribute 详解
- @PathVariable,@RequestParam, @RequestBody,@ModelAttribute,@RequestHeader,@CookieValue的区别
- Spring ModelAttribute注解
- Spring MVC ModelAttribute学习
- ModelAttribute注解使用与spring重定向传参
- SpingMVC中的@ModelAttribute详解
- Spring ModelAttribute注解
- spring之ModelAttribute
- Spring MVC中@ModelAttribute注解