SpringMVC框架:响应数据处理

响应数据处理(向作用域放值)

ModelAndView的方式

	@RequestMapping(value = "/param",method = RequestMethod.POST)
	public ModelAndView param()
	{
		ModelAndView mav=new ModelAndView();
		mav.addObject("username", "root");//向request作用域放值
		mav.setViewName("success");//设置视图名称,实现页面跳转
		return mav;
	}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>okok</h1>
	${requestScope.username}
</body>
</html>

结果
SpringMVC框架:响应数据处理_第1张图片

原码分析ModelAndView

ModelAndView类,就只有view和ModelMap
SpringMVC框架:响应数据处理_第2张图片
ModelMap继承LinkedHashMap
LinkedHashMap继承实现HashMap,Map
所以相当于一个Map集合
SpringMVC框架:响应数据处理_第3张图片
SpringMVC框架:响应数据处理_第4张图片
回到ModelAndView类,里面的三个方法都是返回Map集合
SpringMVC框架:响应数据处理_第5张图片
addObject()方法就是向里面的Map放一个键值对
SpringMVC框架:响应数据处理_第6张图片
开始debug
调用了DispatcherServlet类里面的方法,返回一个ModelAndView mv
SpringMVC框架:响应数据处理_第7张图片
SpringMVC框架:响应数据处理_第8张图片
进入processDispatchResult方法
SpringMVC框架:响应数据处理_第9张图片
进入render方法
通过视图解析器 解析得到一个View视图对象.
SpringMVC框架:响应数据处理_第10张图片
然后视图对象开始处理模型数据
mv.getModelInternal()得到Map集合
SpringMVC框架:响应数据处理_第11张图片
进入view.render
render()方法是View接口中定义的。 在 AbstractView类中进行了实现. 所有具体的视图类都使用AbstractView中实现的render方法.

createMergedOutputModel
根据名知意,创建一个合并的模型数据
SpringMVC框架:响应数据处理_第12张图片
进入renderMergedOutputModel(合并输出模型)

SpringMVC框架:响应数据处理_第13张图片
进入exposeModelAsRequestAttributes(解析模型作为一个响应属性)
终于看到重点,这里遍历了Map集合,将集合里面的键值对设置成响应对象的属性
SpringMVC框架:响应数据处理_第14张图片
设置好后,跳出到renderMergedOutputModel的后面的方法
得到转发器然后转发
SpringMVC框架:响应数据处理_第15张图片

直接Map集合的方式

其实这种方式还是调用上面那个ModelAndView的方法

	@RequestMapping(value = "/param",method = RequestMethod.POST)
	public String param(Map<String,Object> map)
	{
		map.put("username", "admin");
		return "success";
	}

Model中向作用域放值

其实这种方式还是调用上面那个ModelAndView的方法

	@RequestMapping(value = "/param",method = RequestMethod.POST)
	public String param(Model model)
	{
		model.addAttribute("username", "jane");
		return "success";
	}

你可能感兴趣的:(SpringMVC框架:响应数据处理)