@ModelAttribute原理概述以及使用注意点

本文详细介绍了Spring MVC框架中@ModelAttribute注解的工作原理及其使用流程。包括如何通过该注解将请求参数绑定到对象属性,以及如何将对象实例传递给控制器方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@ModelAttribute注解修饰的方法:


1.从数据库中取出对象,把对象放到Map中,键为user

2.SpringMvc从Map中取出User对象,并且把请求参数赋值给User对象的对应属性

3.SpringMvc把上述的对象传入目标方法的参数

注意:在@ModelAttribute修饰的方法中,放入到Map中的键名要和目标方法入参类型的第一个字母小写的字符串一致

1.源码分析流程:

1.调用@ModelAttribute注解修饰的方法,实际上@ModelAttribute方法中Map中的数据放在了implicitModel中.

2.解析请求处理器的目标参数,实际上该目标参数来自于WebDataBinder对象的target属性

1).创建WebDataBinder对象

1.1确定objectName属性:如果传入的attrName属性值为"",则objectName为类名第一个字母小写

注意:attrName若目标方法的POJO属性使用了@ModelAttribute来修饰,则attrName的值为@ModelAttribute的value属性

1.2确定target属性

  在implitModel中查找attrName对应的属性值.若不存在,则验证当前handler是否使用了@sessionAttribute进行修饰,则尝试从session中获取attrName所对应的属性值,若session中没有,则抛出了异常。

若Handler没有使用@sessionAttribute进行修饰,或者@SessionAttrbutes中没有value值指定的key和attrName相,则通过反射创建POJO对象.

2).SpringMvc把表单的请求参数赋给了WebDataBinder的target对应的属性,

3).SpringMvc会把WebDataBinder的attrName和targe给到implicitMoel

4).把WebDataBinder的target作为参数传递给目标方法的入参





### Spring @ModelAttribute 使用指南 #### 1. @ModelAttribute 注解的作用 `@ModelAttribute` 是 SpringMVC 提供的一个注解,用于将方法返回值或方法参数绑定到模型(Model)中[^1]。它可以在类级别的方法上使用,也可以在控制器的方法参数或返回值上使用。 - 当 `@ModelAttribute` 应用于方法时,该方法的返回值会被添加到模型中,并且会在每个请求处理之前执行。 - 当 `@ModelAttribute` 应用于方法参数时,Spring 会尝试从模型中获取该参数的值。如果模型中不存在,则会尝试通过类型转换器创建实例并填充数据[^3]。 --- #### 2. 示例代码解析 ##### 示例 1:`@ModelAttribute` 方法绑定到模型 ```java @Controller public class HelloModelController { @ModelAttribute public void populateModel(@RequestParam String abc, Model model) { model.addAttribute("attributeName", abc); } @RequestMapping(value = "/helloWorld") public String helloWorld() { return "helloWorld.jsp"; } } ``` 在这个示例中,`populateModel` 方法会在每个请求处理之前被调用,并将请求参数 `abc` 添加到模型中,键名为 `attributeName`。因此,在视图中可以通过 `${attributeName}` 访问该值[^5]。 --- ##### 示例 2:`@ModelAttribute` 和 `@RequestMapping` 同时使用 ```java @Controller public class HelloWorldController { @RequestMapping(value = "/helloWorld.do") @ModelAttribute("attributeName") public String helloWorld() { return "hi"; } } ``` 在这个示例中,`helloWorld` 方法的返回值 `"hi"` 会被绑定到模型中,键名为 `attributeName`。当视图渲染时,可以通过 `${attributeName}` 访问该值[^4]。 --- ##### 示例 3:`@ModelAttribute` 用于复杂对象 ```java @Controller public class ModelAttributeTest { @ModelAttribute("pojo") public MyPojo createPojo() { return new MyPojo(); } @RequestMapping(value = "/modelTest.do") public String modelTest(@ModelAttribute("pojo") MyPojo pojo) { System.out.println("进入modelTest方法"); System.out.println(pojo.getName()); return "modelTest"; } } ``` 在这个示例中: - `createPojo` 方法会为每次请求创建一个新的 `MyPojo` 实例,并将其绑定到模型中,键名为 `pojo`。 - 在 `modelTest` 方法中,Spring 会自动从模型中获取 `pojo` 对象,并将其作为参数传递给方法[^3]。 --- #### 3. 注意事项 - **方法级 `@ModelAttribute`**:当 `@ModelAttribute` 应用于方法时,该方法会在每个请求处理之前执行,因此适合用于初始化模型数据[^1]。 - **参数级 `@ModelAttribute`**:当 `@ModelAttribute` 应用于方法参数时,Spring 会尝试从模型中获取该参数的值。如果模型中不存在,则会尝试通过类型转换器创建实例并填充数据[^3]。 - **性能考虑**:如果 `@ModelAttribute` 方法的逻辑较复杂,可能会对性能产生影响,因此需要谨慎设计[^2]。 --- #### 4. 常见问题解答 - **如何指定模型属性名称?** 可以通过 `@ModelAttribute` 的 `value` 属性指定模型属性的名称。例如:`@ModelAttribute("attributeName")`。 - **`@ModelAttribute` 方法的执行顺序是什么?** `@ModelAttribute` 方法会在控制器方法执行之前被调用,因此可以用来预加载模型数据[^1]。 - **`@ModelAttribute` 和 `@RequestBody` 的区别是什么?** - `@ModelAttribute` 通常用于表单提交场景,支持将请求参数绑定到复杂对象。 - `@RequestBody` 用于将请求体中的 JSON 数据直接映射到 Java 对象[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值