距离上一篇博客已经过去三个月了。期间一直在忙毕业设计、以及了毕业找工作的事情,现在工作也步入正轨了,就过来继续分享知识啦。上次写的是关于SpringMVC的处理请求数据的内容,这次就写写SpringMVC是怎么处理响应数据的。
(1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
(2)Map或Model:入参为org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
控制器的处理方法的返回值如果为ModelAndView,则其既包含视图信息,也包含模型数据信息。
private Object view; //视图信息
private ModelMap model; //模型数据
MoelAndView addObject(String attributeName, Object attributeValue) //设置模型数据
ModelAndView addAllObject(Map<String, ?> modelMap) //设置模型数据
void setView(View view) //设置视图对象
void setViewName(String viewName) //设置视图名字
protected Map<String, Object> getModelInternal() 获取模型数据
public ModelMap getModelMap()
public Map<String, Object> getModel()
① 增加控制器方法
/**
* 目标方法的返回类型可以是ModelAndView类型
* 其中包含视图信息和模型数据信息
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
System.out.println("testModelAndView");
String viewName = "success";
ModelAndView mv = new ModelAndView(viewName );
mv.addObject("time",new Date().toString()); //实质上存放到request域中
return mv;
}
② 增加页面链接
index.jsp:
<a href="springmvc/testModelAndView">testModelAndViewa>
③ 增加成功页面,显示数据
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title heretitle>
head>
<body>
<a href="springmvc/testModelAndView">testModelAndViewa>
body>
html>
① 当触发控制器时首先进入到中央控制器DisPatcherServlet.,通过反射来找到ModelAndView并作为参数传入到processDispatchResult方法。
② ModelAndView作为参数会传输到render方法中。
③ 然后调用view的render来获取mv参数的视图对象。
④ 然后会到AbstractView找rederMergedOutputModel方法。
⑤通过返回的找到返回视图类调用exposeModelAsRequestAttributes方法来设置参数进行返回。
Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据
具体使用步骤:
(1)Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
(2)如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。
(3)在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。
① 增加控制器方法
//目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)
@RequestMapping("/testMap")
public String testMap(Map<String,Object> map){ //【重点】
System.out.println(map.getClass().getName());
//org.springframework.validation.support.BindingAwareModelMap
map.put("names", Arrays.asList("Tom","Jerry","Kite"));
return "success";
}
② 增加页面链接
<a href="springmvc/testMap">testMapa>
③ 增加成功页面,用于显示结果
names: ${requestScope.names }
④ 结果如图。
注意问题:Map集合的泛型,key为String,Value为Object,而不是String。
① 编写控制器
//目标方法的返回类型也可以是一个Map类型参数(也可以是Model,或ModelMap类型)
@RequestMapping("/testMapType")
public String testMap2(Map<String,Object> map,Model model,ModelMap modelMap){
System.out.println(map.getClass().getName());
map.put("names", Arrays.asList("Tom","Jerry","Kite"));
model.addAttribute("model", "org.springframework.ui.Model");
modelMap.put("modelMap", "org.springframework.ui.ModelMap");
System.out.println(map == model);
System.out.println(map == modelMap);
System.out.println(model == modelMap);
System.out.println(map.getClass().getName());
System.out.println(model.getClass().getName());
System.out.println(modelMap.getClass().getName());
return "success";
}
② 页面链接
<!-- 测试 Map 返回类型 -->
<a href="springmvc/testMapType">testMapType</a>
③ 测试结果
上图可以看到目标方法的返回类型也可以是一个Map类型参数、也可以是Model或ModelMap类型,它们对应的Class都是一样的。都对应了org.springframework.validation.support.BindingAwareModelMap。