Model、ModelMap和ModelAndView的使用详解

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

<h2>1.前言</h2>

最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。

使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别。

这两者之间有着很大的区别,具体就表现在<b>Model只是用来传输数据的,并不会进行业务的寻址。ModelAndView 却是可以进行业务寻址的</b>,就是设置对应的要请求的静态文件,这里的静态文件指的是类似jsp的文件。

其次,两者还有一个最大的区别,那就是Model是每一次请求可以自动创建,但是ModelAndView 是需要我们自己去new的。


<h2>2.model方法</h2>

注意:如果在控制层上的方法声明了注解@ResponseBody ,则会直接将返回值输出到页面。

Model 是一个接口, 其实现类为ExtendedModelMap,继承了ModelMap类。


```java

public class ExtendedModelMap extends ModelMap implements Model

```

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


<h2>3.ModelMap方法</h2>


ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,

他的作用类似于<b>request对象的setAttribute方法</b>的作用:  <b>用来在一个请求过程中传递处理的数据</b>。

ModelMap或者Model通过addAttribute方法向页面传递参数.

其中addAttribute方法参数有多种方式:

常用的有:写在java代码中


```java

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中的数据。

<b>modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址.</b>

那么我们可以通过控制器方法的字符串返回值来设置跳转url地址别名或者物理跳转地址。


<h2>4.ModelAndView方法</h2>

添加模型数据用addObject;

设置视图setViewName;

ModelAndView 对象有两个作用:

(1). 设置转向地址,这也是ModelAndView和ModelMap的主要区别.设置方式如下所示:


```java

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

```

或者通过setViewName方式:


```java

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

```

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


```java

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

public ModelAndView addObject(Object attributeValue){...}

```

在jsp中:也是可以通过el表达式语言$attributeName或者C标签库的${name } 来获取并展示ModelAndView中的数据。


<h2>5.使用示例</h2>

(1) Model 或者 ModelMap

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

<b>而且需要return 返回指定的页面路径.</b>


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

```java

//传值方法一

@RequestMapping("listCategory2")

public String listCategory2(Model model) {

 

 // 接收查询的信息

 List<Category> cs2= categoryService.list();

 // 封装了查询的数据

 model.addAttribute("test", cs2);

 //重要!!需要给出返回model跳转的路径

 return "listCategory2";

}

```

然后在jsp页面中写入:


```html

<!-- 获取值的时候,对应的是addAttribute的第一个参数!取了个别名为c-->

   <c:forEach items="${test }" var="c" varStatus="st">

       <tr>

           <td>${c.id}</td>

           <td>${c.name}</td>

       </tr>

   </c:forEach>

```

图示java:

image.png


jsp:

image.png


效果:

image.png


数据列表全部获取到!


(2) ModelAndView

ModelAndView的实例是需要我们手动new的,这也是和ModelMap的一个区别。

而且,ModelAndView 可以自己寻址,<b>只需要return 返回其对象即可。</b>


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


```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页面中:


```html

<!-- 使用c标签库,循环遍历出数据 ,命名为c-->

   <c:forEach items="${cs}" var="c" varStatus="st">

       <tr>

           <td>${c.id}</td>

           <td>${c.name}</td>

       </tr>

   </c:forEach>

```

图示:

image.png




jsp:

image.png


效果:

image.png



数据列表全部获取到!


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


相关文章
|
Java 数据库连接 Spring
Spring之数据校验:Validation
【1月更文挑战第17天】 一、Spring Validation概述 二、实验一:通过Validator接口实现 三、实验二:Bean Validation注解实现 四、实验三:基于方法实现校验 五、实验四:实现自定义校验
785 2
Spring之数据校验:Validation
|
2月前
|
SQL 安全 API
【SpringSecurity新手村系列】(7)基于资源权限码(Authority)的接口权限控制实战
本章完成从“用户-角色-权限资源”数据模型到 `@PreAuthorize` 方法级拦截的完整闭环。和上一章“角色控制(Role)”不同,本章重点是 **资源权限码(Authority)**,即 `clue:list`、`clue:edit` 这类细粒度权限。你将得到一套能直接用于企业项目的权限控制方案,同时规避 `Controller 未注册`、`Mapper SQL 字段写错`、`权限码字段映射错位` 等高频坑位。
244 4
|
2月前
|
JSON 安全 Java
【SpringSecurity新手村系列】(6)基于角色的权限控制、权限拦截注解与自定义无权限页面
本章在 RBAC 角色体系上,开启 @EnableMethodSecurity,使用 @PreAuthorize 配合 hasRole / hasAnyRole 实现 Controller 方法级拦截,并配置自定义 403 无权限页面,重点拆解 ROLE_ 前缀重复拼接的常见坑位。
227 1
Springboot之Thymeleaf 表单提交
Springboot之Thymeleaf 表单提交
892 0
|
JSON 数据格式
SpringMVC-接收请求中的json数据及日期类型参数传递
SpringMVC-接收请求中的json数据及日期类型参数传递
680 0
|
12月前
|
开发者
HarmonyOS Next快速入门:@Builder自定义构建函数
《HarmonyOS Next快速入门》课程详解ArkUI开发技巧,介绍如何使用@Builder构建可复用的UI组件。涵盖私有与全局自定义构建函数、参数传递规则及实战示例,助力开发者高效掌握HarmonyOS应用开发核心技能。点击学习完整视频教程👇
252 0
|
JSON 文字识别 数据格式
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
文本,文识11,解析OCR结果,paddOCR返回的数据,接口返回的数据有code,data,OCR返回是JSON的数据,得到JSON数据先安装依赖,Base64转换工具网站在21.14
|
缓存 前端开发 Java
"揭秘!SpringBoot携手Nginx,性能飙升秘籍大公开:轻松掌握配置优化,让你的应用快如闪电!"
【8月更文挑战第11天】随着微服务架构的发展,SpringBoot成为构建RESTful API的首选,Nginx则作为高性能的反向代理服务器提升应用性能。本文将探讨两者如何协同工作,包括Nginx的负载均衡策略、静态资源缓存及数据压缩配置;同时讨论SpringBoot的线程池优化、缓存策略及性能监控。通过这些方法,帮助开发者显著提高系统的整体性能和可用性。
1039 1
|
文字识别 前端开发 API
印刷文字识别操作报错合集之通过HTTPS连接到OCR服务的API时报错,该如何处理
在使用印刷文字识别(OCR)服务时,可能会遇到各种错误。例如:1.Java异常、2.配置文件错误、3.服务未开通、4.HTTP错误码、5.权限问题(403 Forbidden)、6.调用拒绝(Refused)、7.智能纠错问题、8.图片质量或格式问题,以下是一些常见错误及其可能的原因和解决方案的合集。