1、Model、Map、ModelAndView对比
-
Model是一个接口,底下派生出大量的子类;这些子类的实现都是依托Map展开的;并且它不带视图的只能响应数据。
-
ModelAndView是一个类,内部聚合了ModelMap类;ModelMap又继承自LinkedHashMap。这是一个带视图和数据的模型-视图。
-
Map就不多说了,反正他两没有一个离开Map。
2、转发之前
@RequestMapping("/model/map")
public String ModelAndMapTest(Model model,
Map<String,Object> map,
ModelAndView mv,
HttpServletRequest req){
model.addAttribute("Model_args", "这是model存放的参数");
map.put("Map_args", "这是map存放的参数");
mv.addObject("ModelAndView_args", "这是ModelAndView存放的参数");
req.setAttribute("Request_args", "这是request存放的参数");
System.out.println("============存放参数完毕============");
try{
System.out.println("HttpServletRequest 获取 Model_args = " + req.getAttribute("Model_args"));
System.out.println("HttpServletRequest 获取 Map_args = " + req.getAttribute("Map_args"));
System.out.println("HttpServletRequest 获取 ModelAndView_args = " + req.getAttribute("ModelAndView_args"));
System.out.println("HttpServletRequest 获取 Request_args = " + req.getAttribute("Request_args"));
System.out.println("\n\nModel、Map、ModelAndView三者互相取对方存放的数据\n\n");
System.out.println("Map 获取 Model_args = " + map.get("Model_args"));
System.out.println("Map 获取 ModelAndView_args = " + map.get("ModelAndView_args"));
System.out.println("Model 获取 Map_args = " + model.getAttribute("Map_args"));
System.out.println("Model 获取 ModelAndView_args = " + model.getAttribute("ModelAndView_args"));
System.out.println("ModelAndView 获取 Model_args = " + mv.getModel().get("Model_args"));
System.out.println("ModelAndView 获取 Map_args = " + mv.getModel().get("Map_args"));
} catch (Exception e){
}
System.out.println("============转发之前============");
return "forward:/tt";
}
-
转发之前,虽然Model、Map、ModelAndView中都各自存放的数据。但是通过HttpServletRequest解析不到它们存放的参数。意味着到这里他们的参数都没有合并到一起
-
而根据常识转发时代表一次完整的请求还没结束,转发会携带上一次的数据。但是在转发之前并没有看到数据没有合并!
-
Map、Model、ModelAndView三者相互取对方存放的参数时可以发现:Map和Model数据存放在同一个对象中,ModelAndView则是独立开来。
结论:转发之前数据域分三个域,HttpServletRequest、Model和Map、ModelAndView三个数据区域
3、进入转发页面
@RequestMapping("/tt")
@ResponseBody
public Map response_tt(Model model,
Map<String,Object> m,
ModelAndView mv,
HttpServletRequest req){
System.out.println("============进入转发============");
System.out.println("Model_args = " + model.getAttribute("Model_args"));
System.out.println("Map_args = " + m.get("Map_args"));
System.out.println("ModelAndView_args = " + mv.getModel().get("ModelAndView_args"));
System.out.println("Request_args = " + req.getAttribute("Request_args"));
System.out.println("===========HttpServletRequest获取参数================");
Map<String, Object> map = new HashMap<>();
map.put("Model_args", req.getAttribute("Model_args"));
map.put("Map_args", req.getAttribute("Map_args"));
map.put("ModelAndView_args", req.getAttribute("ModelAndView_args"));
map.put("Request_args", req.getAttribute("Request_args"));
System.out.println("============响应之前============");
return map;
}
-
现在来到转发页面,转发页面的新一轮的Model、Map、ModelAndView三个参数都取不到了之前存放的数据。结论:转发前后Model、Map、ModelAndView是不同的对象!
-
而我们的一次完整的请求到现在只进行到一半,但是可以通过HttpServletRequest取到转发之前存放的参数,不过不包括ModelAndView!结论:ModelAndView中存放的数据不会合并到HttpServletRequest中,二者之间相互独立
-
而Model、Map中存放的数据在HttpServletRequest中都能取到,再结合转发之前的迹象可以得出。结论:转发的时候通过参数解析器会将Model和Map中的数据合并到HttpServlet中