SpringMVC中Map、Model、ModelMap、ModelAndView之间的关系及区别

  首先,在了解这三者之前,需要知道一点:SpringMVC在调用方法前会创建一个隐含的数据模型(Model),作为模型数据的存储容器, 成为”隐含模型”。
也就是说在每一次的前后台请求的时候会随带这一个背包(Model),不管你用没有,这个背包确实是存在的,用来盛放我们请求交互传递的值。

  在前端向后台请求时,Model 和 ModelMap 的实例都是spirng mvc框架来自动创建并作为控制器方法参数传入,用户无需自己创建。

无论是Mode还是ModelMap底层都是使用BindingAwareModelMap,所以两者基本没什么区别,我们只需拿来使用即可。而ModelAndView则需要我们手动进行new,springMVC不会帮我们创建。

  既然这四个类或接口被放在一起对比,那么它们之间肯定有相同点:

  1.它们的作用相同,都是用于传递控制方法存储数据到展示页面(JSP页面),通过EL表达式C标签库的{name } 来获取对对象的key进行取值。

  它们之间的区别:

  1.Map、Model、ModelMap不需要我们手动创建,springmvc框架自动创建并作为控制器方法参数传入;而ModelAndView需要手动创建。

  2.Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView却是可以进行业务寻址的,就是设置对应的要请求的静态文件,这里的静态文件指的是类似jsp的文件。

示例1:Model 和 ModelMap

Model 和 ModelMap 的实例都是spirng mvc框架来自动创建并作为控制器方法参数传入,用户无需自己创建。

而且需要return 返回指定的页面路径。

控制层代码:

 //传值方法一
    @RequestMapping("listCategory2")
    public String listCategory2(Model model) {

        // 接收查询的信息
        List<Category> cs2= categoryService.list();
        // 封装了查询的数据
        model.addAttribute("test", cs2);
        //重要!!需要给出返回model跳转的路径
        return "listCategory2";
    }

JSP页面:

<!-- 获取值的时候,对应的是addAttribute的第一个参数!取了个别名为c-->
    <c:forEach items="${test }" var="c" varStatus="st">
        <tr>
            <td>${c.id}</td>
            <td>${c.name}</td>
        </tr>
    </c:forEach>

示例2:ModelAndView

ModelAndView的实例是需要我们手动new的,这也是和ModelMap的一个区别。
而且,ModelAndView 可以自己寻址,只需要return 返回其对象即可。

java代码:

//传值方法二:使用ModelAndView
    //当url处于这个时,由listCategory方法来处理请求
    @RequestMapping("listCategory")
    public ModelAndView listCategory(){
        //创建一个模型视图对象
        ModelAndView mav = new ModelAndView();
        //获取到查询的数据
        List<Category> cs= categoryService.list();

        // //将数据放置到ModelAndView对象view中,第二个参数可以是任何java类型
        mav.addObject("cs", cs);
        // 放入jsp路径
        mav.setViewName("listCategory");
         //返回ModelAndView对象mav
        return mav;
    }

JSP代码:

 <!-- 使用c标签库,循环遍历出数据 ,命名为c-->
    <c:forEach items="${cs}" var="c" varStatus="st">
        <tr>
            <td>${c.id}</td>
            <td>${c.name}</td>
        </tr>
    </c:forEach>

以上就是两种不同的方式取值传值,从上面我们可以看得出来这两个之间还是有一定的区别的,记住有一个需要返回对象,一个需要返回的是地址路径。

简单总结:

Map 为原生的储存键值的对象,自然的里面一大堆的方法可以使用。

Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;

ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;

Map、Model、ModelMap之间本质无太大区别。

ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

猜你喜欢

转载自www.cnblogs.com/ethan-37/p/12638427.html