Model、Map、ModelAndView、HttpServletRequest区别

1、Model、Map、ModelAndView对比

  1. Model是一个接口,底下派生出大量的子类;这些子类的实现都是依托Map展开的;并且它不带视图的只能响应数据。

  2. ModelAndView是一个类,内部聚合了ModelMap类;ModelMap又继承自LinkedHashMap。这是一个带视图和数据的模型-视图。

  3. 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";
}

在这里插入图片描述

  1. 转发之前,虽然Model、Map、ModelAndView中都各自存放的数据。但是通过HttpServletRequest解析不到它们存放的参数。意味着到这里他们的参数都没有合并到一起

  2. 而根据常识转发时代表一次完整的请求还没结束,转发会携带上一次的数据。但是在转发之前并没有看到数据没有合并!

  3. 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;
}

在这里插入图片描述

  1. 现在来到转发页面,转发页面的新一轮的Model、Map、ModelAndView三个参数都取不到了之前存放的数据。结论:转发前后Model、Map、ModelAndView是不同的对象!

  2. 而我们的一次完整的请求到现在只进行到一半,但是可以通过HttpServletRequest取到转发之前存放的参数,不过不包括ModelAndView!结论:ModelAndView中存放的数据不会合并到HttpServletRequest中,二者之间相互独立

  3. 而Model、Map中存放的数据在HttpServletRequest中都能取到,再结合转发之前的迹象可以得出。结论:转发的时候通过参数解析器会将Model和Map中的数据合并到HttpServlet中

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值