天天看点

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

原码分析ModelAndView

ModelAndView类,就只有view和ModelMap

SpringMVC框架:响应数据处理

ModelMap继承LinkedHashMap<String, Object>

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

所以相当于一个Map集合

SpringMVC框架:响应数据处理
SpringMVC框架:响应数据处理

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

SpringMVC框架:响应数据处理

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

SpringMVC框架:响应数据处理

开始debug

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

SpringMVC框架:响应数据处理
SpringMVC框架:响应数据处理

进入processDispatchResult方法

SpringMVC框架:响应数据处理

进入render方法

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

SpringMVC框架:响应数据处理

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

mv.getModelInternal()得到Map集合

SpringMVC框架:响应数据处理

进入view.render

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

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

SpringMVC框架:响应数据处理

进入renderMergedOutputModel(合并输出模型)

SpringMVC框架:响应数据处理

进入exposeModelAsRequestAttributes(解析模型作为一个响应属性)

终于看到重点,这里遍历了Map集合,将集合里面的键值对设置成响应对象的属性

SpringMVC框架:响应数据处理

设置好后,跳出到renderMergedOutputModel的后面的方法

得到转发器然后转发

SpringMVC框架:响应数据处理

直接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";
  }