zoukankan      html  css  js  c++  java
  • Model、ModelMap和ModelAndView的使用详解

    1.前言
    最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。
    使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别。
    这两者之间有着很大的区别,具体就表现在Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView 却是可以进行业务寻址的,就是设置对应的要请求的静态文件,这里的静态文件指的是类似jsp的文件。
    其次,两者还有一个最大的区别,那就是Model是每一次请求可以自动创建,但是ModelAndView 是需要我们自己去new的。

    2.model方法
    注意:如果在控制层上的方法声明了注解@ResponseBody ,则会直接将返回值输出到页面。
    Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。

    public class ExtendedModelMap extends ModelMap implements Model
    1
    一般来说,可以用model来接收各种类型的数据,如果使用来接收一组数据List 》》那么这个时候的model实际上是ModelMap。

    3.ModelMap方法
    ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,
    他的作用类似于request对象的setAttribute方法的作用: 用来在一个请求过程中传递处理的数据。
    ModelMap或者Model通过addAttribute方法向页面传递参数.
    其中addAttribute方法参数有多种方式:
    常用的有:写在java代码中

    public ModelMap addAttribute(String attributeName, Object attributeValue){...}
    public ModelMap addAttribute(Object attributeValue){...}
    public ModelMap addAllAttributes(Collection<?> attributeValues) {...}
    public ModelMap addAllAttributes(Map<String, ?> attributes){...}
    1
    2
    3
    4
    然后在jsp页面上可以通过el表达式语言$attributeName或者是C标签库下的方法,来获取并展示modelmap中的数据。
    modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址.
    那么我们可以通过控制器方法的字符串返回值来设置跳转url地址别名或者物理跳转地址。

    4.ModelAndView方法
    添加模型数据用addObject;
    设置视图setViewName;
    ModelAndView 对象有两个作用:
    (1). 设置转向地址,这也是ModelAndView和ModelMap的主要区别.设置方式如下所示:

    ModelAndView view = new ModelAndView("path:student");
    1
    或者通过setViewName方式:

    public void setViewName(String viewName){...}
    1
    (2). 将控制器方法中处理的结果数据传递到结果页面,也就是把在结果页面上需要的数据放到ModelAndView对象中即可,其作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数:

    public ModelAndView addObject(String attributeName, Object attributeValue){...}
    public ModelAndView addObject(Object attributeValue){...}
    1
    2
    在jsp中:也是可以通过el表达式语言attributeName或者C标签库的attributeName或者C标签库的{name } 来获取并展示ModelAndView中的数据。

    5.使用示例
    (1) Model 或者 ModelMap
    Model 和 ModelMap 的实例都是spirng mvc框架来自动创建并作为控制器方法参数传入,用户无需自己创建。
    而且需要return 返回指定的页面路径.

    在控制层的java代码中写入:

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

    // 接收查询的信息
    List<Category> cs2= categoryService.list();
    // 封装了查询的数据
    model.addAttribute("test", cs2);
    //重要!!需要给出返回model跳转的路径
    return "listCategory2";
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    然后在jsp页面中写入:

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

    jsp:


    效果:


    数据列表全部获取到!

    (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;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    在jsp页面中:

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


    jsp:


    效果:


    数据列表全部获取到!

    以上就是两种不同的方式取值传值,从上面我们可以看得出来这两个之间还是有一定的区别的,记住有一个需要返回对象,一个需要返回的是地址路径。
    ---------------------
    作者:csdnzoutao
    来源:CSDN
    原文:https://blog.csdn.net/itbiggod/article/details/79685610
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    C++类中的函数重载
    C++中的友元
    bzoj 2820
    莫比乌斯函数
    bzoj 2440: [中山市选2011]完全平方数
    莫比乌斯反演1
    [转]C++ 指针和引用
    P2756 飞行员配对方案问题
    P2055 [ZJOI2009]假期的宿舍
    P2654 原核生物培养
  • 原文地址:https://www.cnblogs.com/husam/p/11037212.html
Copyright © 2011-2022 走看看