Model、ModelMap和ModelAndView的使用详解

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

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

public class ExtendedModelMap extends ModelMap implements Model


通常来讲,能够用model来接收各类类型的数据,若是使用来接收一组数据List 》》那么这个时候的model其实是ModelMap。spring

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

public ModelMap addAttribute(String attributeName, Object attributeValue){...}
public ModelMap addAttribute(Object attributeValue){...}
public ModelMap addAllAttributes(Collection<?> attributeValues) {...}
public ModelMap addAllAttributes(Map<String, ?> attributes){...}


而后在jsp页面上能够经过el表达式语言$attributeName或者是C标签库下的方法,来获取并展现modelmap中的数据。 
modelmap自己不能设置页面跳转的url地址别名或者物理跳转地址. 
那么咱们能够经过控制器方法的字符串返回值来设置跳转url地址别名或者物理跳转地址。app

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

ModelAndView view = new ModelAndView("path:student");


或者经过setViewName方式:jsp

public void setViewName(String viewName){...}


(2). 将控制器方法中处理的结果数据传递到结果页面,也就是把在结果页面上须要的数据放到ModelAndView对象中便可,其做用相似于request对象的setAttribute方法的做用,用来在一个请求过程当中传递处理的数据。经过如下方法向页面传递参数:url

public ModelAndView addObject(String attributeName, Object attributeValue){...}
public ModelAndView addObject(Object attributeValue){...}


在jsp中:也是能够经过el表达式语言attributeName或者C标签库的attributeName或者C标签库的{name } 来获取并展现ModelAndView中的数据。code

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


而后在jsp页面中写入:

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


图示: 
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;
    }


在jsp页面中:

 

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


图示: 

java

这里写图片描述
jsp: 

这里写图片描述
效果: 

这里写图片描述
数据列表所有获取到!

以上就是两种不一样的方式取值传值,从上面咱们能够看得出来这两个之间仍是有必定的区别的,记住有一个须要返回对象,一个须要返回的是地址路径。

You got a dream, you gotta protect it.  若是你有梦想的话,就要去捍卫它 。 ——《当幸福来敲门》

相关文章
相关标签/搜索