Spring MVC 提供了以下几种途径输出模型数据:
ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体即可通过该对象添加模型数据
Map 及 Model: 入参为 org.springframework.ui.Model、org.springframework.ui. ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
@SessionAttributes: 将模型中的某个属性暂存到HttpSession 中,以便多个请求之间可以共享这个属性
@ModelAttribute:方法入参标注该注解后, 入参的对象 就会放到数据模型中
在本文中中重点讨论前三种方式,因为最后一种需要花大量的篇幅来讲解。详见SpringMVC处理模型数据(2)
演示代码的顺序按照index.jsp(初始界面),Controller控制器,success.jsp(显示结果)
1、ModelAndView
控制器处理方法的返回值如果为 ModelAndView, 则其既 包含视图信息,也包含模型数据信息。
添加模型数据的方法:
1)、添加单个键值对(有点类似request域对象的setAttribute方法)
MoelAndView addObject(String attributeName, Object attributeValue)
2)、添加多个键值对,即直接添加一个map集合
ModelAndView addAllObject(Map<String, ?> modelMap)
设置视图的方法:
1)、设置视图对象
void setView(View view)
2)、设置视图名
void setViewName(String viewName)
SpringMVC会把 ModelAndView 中的 model 数据放入 Request 域对象中
<a href="springmvc/testModelAndView">testModelAndView</a>
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 创建一个ModelAndView类型的对象,指定视图名称
ModelAndView modelAndView = new ModelAndView(SUCCESS);
// 为modelAndView添加modle数据
modelAndView.addObject("time", new Date());
return modelAndView;
}
<h3>${requestScope.time}</h3>
2、Map 及 Model
目标方法的入参可以是Map类型(实际上也可以是Model类型或者ModelMap类型)
* SpringMVC会将此Map数据作为ModelAndView的model
* 将目标方法的返回值作为ModelAndView的view
<a href="springmvc/testMap">testMap</a>
@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){
map.put("names", Arrays.asList("Tom","Jerry","mike"));
return SUCCESS;
}
<h3>${requestScope.names}</h3>
3、SessionAttributes
目标方法默认会将参数放在Request域对象中,加上此注解可以将参数同时放在Session域对象中
* 注意,此注解只能使用在类的上面
* 使用此注解时有两种方式可以指定哪些数据会被放在HttpSession中
* 第一种方式是直接指定参数名称:也就是使用value属性
* 第二种则是指定参数的类型:也就是使用types属性,比如types = String.class
* 当然,两种属性都支持多值操作
<a href="springmvc/testSessionAttributes">testSessionAttributes</a>
@SessionAttributes(value = "user",types = String.class)
@RequestMapping("/springmvc")
@Controller
public class RequestMappingTest {
public final static String SUCCESS = "success";
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String, Object> map) {
User user = new User("rgx", "123456", "rgx@love.com", 21, new Address("Hubei", "Yichang"));
map.put("user", user);
map.put("school", "CTGU");
return SUCCESS;
}
}
@RequestMapping("/testSessionAttributes")
public String testSessionAttributes(Map<String, Object> map) {
User user = new User("rgx", "123456", "rgx@love.com", 21, new Address("Hubei", "Yichang"));
map.put("user", user);
map.put("school", "CTGU");
return SUCCESS;
}
}
request:<h3>${requestScope.user}</h3>
<br><br>
session:<h3>${sessionScope.user}</h3>
<br><br>
request:<h3>${requestScope.school}</h3>
<br><br>
session:<h3>${sessionScope.school}</h3>
注意上面的控制器代码中存在SessionAttributes注解,两个属性value和types分别决定将什么对应参数名或者对应类型的model属性数据被放入HttpSession作用域内。