3.2.4 Model和ModelMap

3.2.4 Model和ModelMap

在请求处理方法中可出现和返回的参数类型中,最重要的就是ModelModelAndView了。

控制器产生模型数据 视图渲染模型数据

对于MVC框架,控制器(Controller)执行业务逻辑,用于产生模型数据(Model),而视图(view)则用于渲染模型数据

传递模型数据的途径

如何将模型数据传递给视图是Spring MVC框架的一项重要工作, Spring MVC提供了多种途径输出模型数据,如:

  • ModelModelMap
  • ModelAndView
  • @ModelAttribute
  • @SessionAttributes

下面将重点介绍ModelModelMap以及ModelAndView,@SessionAttributes将在3.11节中重点介绍;@ModeLAttribute将在3.12节中重点介绍.

Model

Spring MVC在内部使用了一个org.springframework.ui.Model接口存储模型数据,它的功能类似java.util.Map接口,但是比Map易于使用。org.springframework.ui.ModelMap接口实现了Map接口。
Spring MVC在调用处理方法之前会创建一个隐含的模型对象,作为模型数据的存储容器。
如果处理方法的参数为ModelModelMap类型,则Spring MVC会将隐含模型的引用传递给这些参数。
在处理方法内部,开发者可以通过这个参数对象访问模型中的所有数据,也可以向模型中添加新的属性数据。

添加模型数据

在处理方法中, ModelModelMap对象都可以使用如下方法添加模型数据
addAttribute(String attributeName,Object attributeValue)

示例 Model和ModelMap的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package org.fkit.controller;

import org.fkit.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

// Controller注解用于指示该类是一个控制器,可以同时处理多个请求动作
@Controller
public class ModelController
{
/*
* SpringMVC在调用处理方法之前会创建一个隐含的模型对象, 作为模型数据的存储容器。
* 如果处理方法的参数为Model或ModelMap类型,则SpringMVC会将隐含模型的引用传递给这些参数。
*/
@RequestMapping(value = "/modelTest")
public String modelTest(Model model)
{
System.out.println("modelTest");
User user = new User();
// 设置user对象的username属性
user.setUsername("添加到modeMap中的数据");
// 在处理方法内部,开发者可以通过这个参数对象访问模型中的所有数据,
// 也可以向模型中添加新的属性数据。
// 将User对象添加到Model当中,也就是添加到JSP的请求域中
model.addAttribute("user", user);
// 返回视图路径
return "result1";
}

@RequestMapping(value = "/ModelMapTest")
public String modelMapTest(ModelMap modelMap)
{
System.out.println("ModelMapTest");
User user = new User();
// 设置user对象的username属性
user.setUsername("添加到modeMap中的数据");
// 将User对象添加到ModelMap当中
modelMap.addAttribute("user", user);
return "result2";
}

}

modelTest方法中创建了一个自定义的User对象,并且给username属性赋值。使用Model对象的addAttribute("user",user)方法将User对象添加到Model当中,即JSPrequest Scope当中

modelMapTest方法的代码功能与此类似,只是存储对象由Model改成了ModelMap