作者:111 | 来源:互联网 | 2024-11-24 12:55
在开发 Web 应用时,经常需要在用户从一个页面跳转到另一个页面后,自动填充某些表单字段的数据。Spring MVC 提供了 ModelAttribute 注解来简化这一过程。
### 方法一:传统方式
通过在控制器方法中直接设置请求属性,然后返回 ModelAndView 对象,可以实现简单的数据传递和视图渲染。
@Controller
public class BookController {
@RequestMapping(value = "/book", method = RequestMethod.GET)
public ModelAndView traditionalMethod(HttpServletRequest request) {
request.setAttribute("title", "SpringMVC");
request.setAttribute("author", "Apache");
return new ModelAndView("/comm/book");
}
}
对应的 JSP 页面代码如下:
### 方法二:使用 ModelAttribute 注解
当多个控制器方法需要共享相同的数据初始化逻辑时,可以使用 @ModelAttribute 注解来避免重复代码。
@Controller
public class BookController {
@ModelAttribute
public void populateModel(Model model) {
model.addAttribute("title", "SpringMVC");
model.addAttribute("author", "Apache");
}
@RequestMapping(value = "/book", method = RequestMethod.GET)
public ModelAndView method1() {
return new ModelAndView("/comm/book");
}
@RequestMapping(value = "/book1", method = RequestMethod.GET)
public ModelAndView method2() {
return new ModelAndView("/comm/book");
}
}
### 初始化复杂对象
如果需要初始化的对象较为复杂,例如包含多个属性的实体类,可以通过以下方式实现:
@RequestMapping(value = "/book1", method = RequestMethod.GET)
public ModelAndView method1(Model model) {
Book book = new Book("SpringMVC", "Apache");
model.addAttribute("book", book);
return new ModelAndView("/comm/book");
}
@RequestMapping(value = "/book2", method = RequestMethod.GET)
public Book method2(Model model) {
return new Book("SpringMVC", "Apache");
}
### 深入理解 ModelAttribute
#### 常用接口与类
- org.springframework.ui.Model: 用于添加模型属性的接口。
- org.springframework.ui.ModelMap: 具体实现了 Model 接口的类。
- org.springframework.web.servlet.ModelAndView: 用于封装模型和视图信息的类。
#### 转换与同步
- Model 到 ModelMap: 可以通过 `model.asMap()` 方法将 Model 转换为 ModelMap。
- ModelAndView 到 ModelMap: 可以通过 `mv.getModelMap()` 方法将 ModelAndView 转换为 ModelMap。
#### 使用场景
- 初始化 Model: 在每个请求前调用,用于设置通用的模型属性。
- 初始化特定数据: 可以为特定的方法或对象初始化数据。
- 初始化对象参数: 可以直接作为方法参数接收,Spring 会自动注入相应的对象。
#### 原理
当使用 @ModelAttribute 注解时,Spring 会先通过反射创建对象,并根据请求参数自动填充对象的属性。最后,将填充好的对象放入模型中,以便在视图中使用。