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

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框架:响应数据处理_map集合

原码分析ModelAndView

ModelAndView类,就只有view和ModelMap

SpringMVC框架:响应数据处理_作用域_02


ModelMap继承LinkedHashMap<String, Object>

LinkedHashMap<String, Object>继承实现HashMap<K,V>,Map<K,V>

所以相当于一个Map集合

SpringMVC框架:响应数据处理_map集合_03


SpringMVC框架:响应数据处理_map集合_04


回到ModelAndView类,里面的三个方法都是返回Map集合

SpringMVC框架:响应数据处理_map集合_05


addObject()方法就是向里面的Map放一个键值对

SpringMVC框架:响应数据处理_作用域_06


开始debug

调用了DispatcherServlet类里面的方法,返回一个ModelAndView mv

SpringMVC框架:响应数据处理_map集合_07


SpringMVC框架:响应数据处理_作用域_08


进入processDispatchResult方法

SpringMVC框架:响应数据处理_作用域_09


进入render方法

通过视图解析器 解析得到一个View视图对象.

SpringMVC框架:响应数据处理_html_10


然后视图对象开始处理模型数据

mv.getModelInternal()得到Map集合

SpringMVC框架:响应数据处理_作用域_11


进入view.render

render()方法是View接口中定义的。 在 AbstractView类中进行了实现. 所有具体的视图类都使用AbstractView中实现的render方法.createMergedOutputModel

根据名知意,创建一个合并的模型数据

SpringMVC框架:响应数据处理_map集合_12


进入renderMergedOutputModel(合并输出模型)

SpringMVC框架:响应数据处理_map集合_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";
}