响应数据处理(向作用域放值)
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>
结果
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SOwYjNykTNxIWOlNGOzIWNzYzXyATNwATM4IzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
原码分析ModelAndView
ModelAndView类,就只有view和ModelMap
ModelMap继承LinkedHashMap<String, Object>
LinkedHashMap<String, Object>继承实现HashMap<K,V>,Map<K,V>
所以相当于一个Map集合
回到ModelAndView类,里面的三个方法都是返回Map集合
addObject()方法就是向里面的Map放一个键值对
开始debug
调用了DispatcherServlet类里面的方法,返回一个ModelAndView mv
进入processDispatchResult方法
进入render方法
通过视图解析器 解析得到一个View视图对象.
然后视图对象开始处理模型数据
mv.getModelInternal()得到Map集合
进入view.render
render()方法是View接口中定义的。 在 AbstractView类中进行了实现. 所有具体的视图类都使用AbstractView中实现的render方法.createMergedOutputModel
根据名知意,创建一个合并的模型数据
进入renderMergedOutputModel(合并输出模型)
进入exposeModelAsRequestAttributes(解析模型作为一个响应属性)
终于看到重点,这里遍历了Map集合,将集合里面的键值对设置成响应对象的属性
设置好后,跳出到renderMergedOutputModel的后面的方法
得到转发器然后转发
直接Map集合的方式
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String param(Map<String,Object> map)
{
map.put("username", "admin");
return "success";
}
Model中向作用域放值
@RequestMapping(value = "/param",method = RequestMethod.POST)
public String param(Model model)
{
model.addAttribute("username", "jane");
return "success";
}