0%

Model、ModelMap、ModelAndView的使用和区别

在学习SSM框架中的SpringMVC时常常看到在控制层Controller中有的使用ModelAndView进行数据模型的传输,有的使用Model进行数据模型传输,为何有两种不同度类型进行传输呢?

一.ModelAndView

若返回类型为ModelAndView类型,需要方法结束时,定义ModelAndView,将model和view分别进行设置,代码方法如下:
-数据传递:ModelAndView通过addObject方法向页面传递数据;
-数据获取:JSP页面可以通过el表达式或C标签库的方法获取数据(与Model的获取方式相同);
-return:return返回的是ModelAndView对象;

ModelAndView设置跳转地址有两个方式:
第一种:在new ModelAndView时添加地址参数,如:
ModelAndView mav = new ModelAndView(“test”);
第二种:使用ModelAndView的setViewname(String)方法去设置,如:
      mav.setViewName(“test”);

1
2
3
4
5
6
7
8
@RequestMapping("/products")
public ModelAndView products() {
List<Product> ps = productService.listProducts();
ModelAndView mav = new ModelAndView();
mav.addObject("ps", ps);
mav.setViewName("products"); //视图名称(视图的全名称为products.html 或 products.jsp)
return mav;
}

主要步骤:

1.首先是创建ModelAndView对象,再调用addObject方法,参数一为该数据命名,参数二为传入实际数据列表

2.再调用setViewName方法设置jsp页面的路径,这里的地址前缀和后缀一般是定义好的(就像thymeleaf,前缀是classpath:/templates,后缀是.html, 要是设置的话,如果是springboot可以在配置文件中设置,mvc可以在web.xml中设置),可直接简写如上。如未有定义可以使用上方以注释的路径进行传入

3.最后返回modelAndView数据

二.Model

若方法返回String类型,则要使用Model,表示返回逻辑视图名,真正视图(jsp或html路径)=前缀+逻辑视图名+后缀,代码如下:

-数据传递:Model是通过addAttribute方法向页面传递数据的;
-数据获取:JSP页面可以通过el表达式或C标签库的方法获取数据,当然html页面也可以获取,具体就用thymeleaf的标签来做
-return:return返回的是指定的页面名称;

1
2
3
4
5
6
@RequestMapping("/products")
public Object products(Model m) {
List<Product> ps = productService.listProducts();
m.addAttribute("ps", ps);
return "products"; ////视图名称(视图的全名称为products.html 或 products.jsp)
}

主要步骤:

1.在方法括号中定义Model类型

2.调用addAttribute方法,参数一为给数据命名,参数二为传入上面获取到的数据

3.最后返回jsp页面的路径

三.ModelMap的使用

  ModelMap的使用与Model相同,ModelMap是一种特殊的Model,一般来说,Model可以接收各种类型的数据,如果接收的数据是List,那么这个时候Model实际上是ModelMap。

Model与ModelAndView的区别

  第一点:Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView 却是可以进行业务寻址的;所以Model的返回值是视图名称,而ModelAndView的返回值是ModelAndView对象;

  第二点:Model是每一次请求可以自动创建,但是ModelAndView 是需要我们自己去new的。所以使用Model时Controller方法的参数是Model。