Spring 的 @ModelAttribute 注解主要用于数据绑定和模型属性管理,支持方法级别和参数级别的应用,以下是其核心特性和使用场景:
🔧 一、核心功能
-
数据绑定
- 将 HTTP 请求参数(如表单字段、查询参数)自动绑定到 Java 对象。
- 支持从请求参数、URI 路径变量、请求头等多来源获取数据。
-
模型属性管理
- 方法级别:在控制器方法执行前向
Model添加属性。 - 参数级别:从模型或请求中提取属性并绑定到方法参数。
- 方法级别:在控制器方法执行前向
📌 二、方法级别的使用
-
无返回值方法
- 通过
Model参数手动添加属性:@ModelAttribute public void initModel(Model model) { model.addAttribute("serverTime", LocalDateTime.now()); }
- 通过
-
有返回值方法
- 返回值自动作为模型属性,默认键名为返回类型的小写形式(如
User→"user"):@ModelAttribute public User defaultUser() { return new User("Guest", 18); } - 通过
value属性自定义键名:@ModelAttribute("currentUser") public User loadUser() { /* ... */ }
- 返回值自动作为模型属性,默认键名为返回类型的小写形式(如
-
与
@RequestMapping共用- 方法返回值直接作为模型属性,视图名由请求 URL 推导。
🎯 三、参数级别的使用
-
基本绑定
- 从请求参数创建对象并绑定:
@PostMapping("/save") public String save(@ModelAttribute User user) { // user 已绑定表单数据 }
- 从请求参数创建对象并绑定:
-
自定义属性名
- 通过
value指定模型中的属性键:public String edit(@ModelAttribute("editUser") User user) { /* ... */ }
- 通过
-
禁用数据绑定
- 设置
binding = false跳过数据绑定:public String view(@ModelAttribute(binding = false) User user) { /* ... */ }
- 设置
⚠️ 四、注意事项
-
执行顺序
- 方法级别的
@ModelAttribute会在同控制器内所有@RequestMapping方法前执行。
- 方法级别的
-
线程安全
- 若方法返回可变对象(如
List),需确保线程安全。
- 若方法返回可变对象(如
-
与
@SessionAttributes配合- 结合
@SessionAttributes可跨请求共享模型属性。
- 结合
💡 五、典型应用场景
- 表单编辑防数据丢失
- 仅更新表单提交的字段,保留未提交字段的原始值。
- 预加载下拉框数据
- 通过
@ModelAttribute方法预加载选项列表。
- 通过
- 请求参数聚合
- 将分散的请求参数绑定到单一对象。
通过合理使用 @ModelAttribute,可显著简化数据绑定逻辑,提升代码可维护性。
861

被折叠的 条评论
为什么被折叠?



