SpringMVC_处理响应数据

  距离上一篇博客已经过去三个月了。期间一直在忙毕业设计、以及了毕业找工作的事情,现在工作也步入正轨了,就过来继续分享知识啦。上次写的是关于SpringMVC的处理请求数据的内容,这次就写写SpringMVC是怎么处理响应数据的。
  

1、SpringMVC输出模型数据概述

(1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据。
(2)Map或Model:入参为org.springframework.ui.Model、
org.springframework.ui.ModelMap 或 java.uti.Map 时,处理方法返回时,Map 中的数据会自动添加到模型中。
  

2、ModelAndView

控制器的处理方法的返回值如果为ModelAndView,则其既包含视图信息,也包含模型数据信息。

2.1 两个重要的成员变量
private Object view;      //视图信息
private ModelMap model;   //模型数据
2.2 添加模型数据
MoelAndView addObject(String attributeName, Object attributeValue)   		//设置模型数据
ModelAndView addAllObject(Map<String, ?> modelMap)   //设置模型数据
2.3 设置视图
void setView(View view)               //设置视图对象
void setViewName(String viewName)     //设置视图名字
2.4 获取模型数据
protected Map<String, Object> getModelInternal()   获取模型数据
public ModelMap getModelMap()
public Map<String, Object> getModel()
2.5 代码实现

① 增加控制器方法

/**
 * 目标方法的返回类型可以是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>

④ 测试结果
SpringMVC_处理响应数据_第1张图片

2.6 源码分析

① 当触发控制器时首先进入到中央控制器DisPatcherServlet.,通过反射来找到ModelAndView并作为参数传入到processDispatchResult方法。
SpringMVC_处理响应数据_第2张图片
② ModelAndView作为参数会传输到render方法中。
SpringMVC_处理响应数据_第3张图片
③ 然后调用view的render来获取mv参数的视图对象。
SpringMVC_处理响应数据_第4张图片
④ 然后会到AbstractView找rederMergedOutputModel方法。
SpringMVC_处理响应数据_第5张图片
⑤通过返回的找到返回视图类调用exposeModelAsRequestAttributes方法来设置参数进行返回。
SpringMVC_处理响应数据_第6张图片
SpringMVC_处理响应数据_第7张图片

3、Map

3.1 简介

Spring MVC 在内部使用了一个 org.springframework.ui.Model 接口存储模型数据
具体使用步骤:
(1)Spring MVC 在调用方法前会创建一个隐含的模型对象作为模型数据的存储容器。
(2)如果方法的入参为 Map 或 Model 类型,Spring MVC 会将隐含模型的引用传递给这些入参。
(3)在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。

UML类图:
SpringMVC_处理响应数据_第8张图片
类层次结构:

SpringMVC_处理响应数据_第9张图片
  

3.2 代码实现

① 增加控制器方法

//目标方法的返回类型也可以是一个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 }

④ 结果如图。
SpringMVC_处理响应数据_第10张图片
注意问题: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>

③ 测试结果
SpringMVC_处理响应数据_第11张图片
上图可以看到目标方法的返回类型也可以是一个Map类型参数、也可以是Model或ModelMap类型,它们对应的Class都是一样的。都对应了org.springframework.validation.support.BindingAwareModelMap。

你可能感兴趣的:(#,SSM框架,SpringMVC,处理响应数据,ModelAndView,Map,ModelMap,源码解析)