Spring MVC之@ModelAttribute详解

用法

其实这个注解最多也就两个用处,第一个就是被该注解注释的方法会在相应的controller中的任何一个方法执行之前执行一遍,直接贴代码吧

@ModelAttribute
    public void getUser(Map<String, Object> map){
        User user=new User("xhj", "123456", "23");
        map.put("user", user);
    }

@RequestMapping("testModelAttribute")
    public String testModelAttribute(User user){
        System.out.println("修改:"+user);
        return SUCCESS;
    }

当执行testModelAttribute方法时,SpringMVC会先执行getUser方法,通过map将其得到的user放到请求域中,然后找到名字同样叫user的对象作为入参传递给testModelAttribute方法。这里需要注意的是第一个方法中放入map的key值应该和第二个方法中入参的参数名一致,如果必须不一致的话这里就牵扯到第二个用法了(个人觉得也不算第二个用法),代码如下

@ModelAttribute
    public void getUser(Map<String, Object> map){
        User user=new User("xhj", "123456", "23");
        map.put("xx", user);
    }
@RequestMapping("testModelAttribute")
    public String testModelAttribute(@ModelAttribute("xx")User user){
        System.out.println("修改:"+user);
        return SUCCESS;
    }

在第二个方法的入参前面加入@ModelAttribute注解,SpringMVC会去请求域中找名为xx的User对象。

原理

想要知道这货的原理当然得去阅读源代码,考虑到过程有点复杂这里就直接将楼主的理解和心得贴出来分享给大家吧。

*1. 确定一个 key:

* 1). 若目标方法(第二个方法)的 POJO 类型的参数木有使用 @ModelAttribute 作为修饰, 则 key 为 POJO 类名第一个字母的小写

* 2). 若使用了 @ModelAttribute 来修饰, 则 key 为 @ModelAttribute 注解的 value 属性值.

* 2. 在 implicitModel 中查找 key 对应的对象, 若存在, 则作为入参传入

* 1). 若在 @ModelAttribute 标记的方法中在 Map 中保存过, 且 key 和 1 确定的 key 一致, 则会获取到.

* 3. 若 implicitModel 中不存在 key 对应的对象, 则检查当前的 Handler 是否使用 @SessionAttributes 注解修饰, 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所对应的 value 值, 若存在则直接传入到目标方法的入参中. 若不存在则将抛出异常.

* 4. 若 Handler 没有标识 @SessionAttributes 注解或 @SessionAttributes 注解的 value 值中不包含 key, 则会通过反射来创建 POJO 类型的参数, 传入为目标方法的参数

* 5. SpringMVC 会把 key 和 POJO 类型的对象保存到 implicitModel 中, 进而会保存到 request 中.

注意

最后还要多嘴一句,如果你是将这个注解跟@SessionAttributes注解一起使用的话,一不小心就会抛出这样的异常

发生这样错误的代码我也贴出来吧

@SessionAttributes(value={"user"})
@Controller
public class HelloWorld {

    public static final String SUCCESS="success";

    @RequestMapping("testModelAttribute")
    public String testModelAttribute(@ModelAttribute("user")User user){
        System.out.println("修改:"+user);
        return SUCCESS;
    }
}

原因其实在上面的原理中写的很明白了,这里就不再多说了,大家都是聪明人。

时间: 2024-10-08 21:55:26

Spring MVC之@ModelAttribute详解的相关文章

Spring mvc请求处理流程详解(一)之视图解析

前言 Spring mvc框架相信很多人都很熟悉了,关于这方面的资料也是一搜一大把.但是感觉讲的都不是很细致,让很多初学者都云里雾里的.本人也是这样,之前研究过,但是后面一段时间不用发现又忘记了.所以决定写下来,以备后用. 本系列文基于spring-4.3.1,配置方式全部基于java-based方式 从配置讲起 先上一段配置的代码: @EnableWebMvc @Configuration public class MvcConfig extends WebMvcConfigurerAdapt

Spring MVC @RequestMapping注解详解

@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) params:定义请求的 URL 中必须包含的参数.或者不包含某些参数.(了解) headers:定义请求中 Request Headers 必须包含的参数.或者不包含某些参数.(了解) @RequestMapping 的用法 @RequestMapping 有两种标注方式,一种是标注在类级别上,一种是

Spring MVC 配置Controller详解

在SpringMVC中,对于Controller的配置方式有很多种,如下做简单总结 第一种 URL对应Bean如果要使用此类配置方式,需要在XML中做如下样式配置: <!-- 表示将请求的URL和Bean名字映射--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <bean name="/hello.do" class

Spring MVC 注解开发详解

@Controller控制器定义 1.Controller是单利模式,被多个线程请求共享,因此设计成无序状态. 2.通过@controller标注即可将class定义为一个controller类.为使spring能找到定义为controller的bean,需要在spring-context配置文件中增加如下定义: @RequestMapping @RequestParam @SessionAttributes @ModelAttribute

Spring mvc整合freemarker详解

1.什么是FreeMarker FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) 2.FreeMarker特性 能够生成各种文本:HTML.XML.RTF.Java源代码等等 易于嵌入到你的产品中:轻量级:不需要Servl

Spring MVC整合Velocity详解

一.Velocity简介 Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象. 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人 员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码.Velocity将java代码从web页面中分离出来,这样为web站点的长 期维

Spring MVC之@RequestMapping 详解

引言: 前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessage

[转]Spring MVC之@RequestMapping 详解

前段时间项目中用到了REST风格来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为application/json, 而且服务器端通过request.getReader() 打出的数据里确实存在浏览器提交的数据.为了找出原因,便对参数绑定(@RequestParam. @RequestBody. @RequestHeader . @PathVariable)进行了研究,同时也看了一下HttpMessageConv

【转】Spring MVC之@RequestMapping 详解

@RequestMapping RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她分成三类进行说明. 1. value, method: value:     指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明): method:  指定请求的method类型, GET.POST.PUT.DELETE等: 2. con