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



数据列表全部获取到!


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


相关文章
部署hexo后样式丢失问题
部署hexo后样式丢失问题
260 0
|
API Windows
我的免杀之路:虚拟保护
虚拟保护技术利用的是 Windows API 中的 VirtualProtect 函数,是对应 Win32 函数的逻辑包装函数,它会在呼叫处理程序的虚拟位置空间里,变更认可页面区域上的保护。
1029 0
我的免杀之路:虚拟保护
|
11月前
|
XML JSON Java
SpringMVC详解(全网最全)
### SpringMVC 简介 SpringMVC 是 Spring 框架中的一个模块,用于构建 Web 应用的 MVC 架构。它提供了简洁、优雅的方式来处理 HTTP 请求和响应,支持前后端分离,优化用户体验。 #### 起源与发展 1. **三层架构**:早期的 Servlet 只能处理单一请求,耦合度高,复用性差,整页刷新影响用户体验。 2. **MVC 模式**:部分解耦业务逻辑与视图层,但后端仍负责 View 层,难以应对高并发。 3. **前后端分离**:通过异步调用实现解耦,增强复用性和交互体验。
1783 5
|
数据采集 存储 人工智能
数据治理工作的持续评估与优化策略
数据治理工作的持续评估与优化是企业实现数据价值最大化的关键。通过明确目标、建立评估体系、实施定期评估、制定优化策略以及建立反馈机制,企业可以不断提升数据治理水平,为业务决策提供有力支持,推动企业持续健康发展。在这个过程中,保持对新技术、新方法的关注与探索,也是确保数据治理工作与时俱进的重要途径。
1055 4
|
10月前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
1054 44
|
人工智能 安全 Java
关于Claude国内能用吗?回答是:能用!
想体验 Anthropic 公司打造的 AI 助手 Claude 的强大功能,却受限于网络?别担心!这篇指南将为你揭开 Claude 的神秘面纱,并提供多种途径,助你轻松跨越网络障碍,开启 AI 新世界!🎉
|
Java 编译器 Spring
面试突击78:@Autowired 和 @Resource 有什么区别?
面试突击78:@Autowired 和 @Resource 有什么区别?
16595 6
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
427 1
|
SQL 数据采集 存储
"揭秘SQL Server中REPLACE函数的神奇力量!一键替换字符串,解锁数据处理的无限可能,你还在等什么?"
【8月更文挑战第20天】SQL Server 的 REPLACE 函数是处理字符串的强大工具,用于在查询中替换字符串的部分内容。基本语法为 `REPLACE(string_expression, string_pattern, string_replacement)`。例如,可将员工邮箱从 `@example.com` 替换为 `@newdomain.com`。支持多级嵌套替换与变量结合使用,适用于动态生成查询。注意大小写敏感性及全局替换特性。掌握 REPLACE 函数能有效提升数据处理能力。
775 0