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

一般来说,可以用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){...}

然后在jsp页面上可以通过el表达式语言$attributeName或者是C标签库下的方法,来获取并展示modelmap中的数据。
modelmap本身不能设置页面跳转的url地址别名或者物理跳转地址.
那么我们可以通过控制器方法的字符串返回值来设置跳转url地址别名或者物理跳转地址。

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

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

或者通过setViewName方式:

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

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

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

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

然后在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对象mavreturn mav;}

在jsp页面中:

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

图示:
在这里插入图片描述
jsp:

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

图示:
在这里插入图片描述
jsp:
在这里插入图片描述
效果:
数据列表全部获取到!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/250021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【mysql】- 初始化

参考 1、写配置文件 在mysql的根目录下创建 my.ini&#xff0c;根目录的截图和输入的内容如下所示。 my.ini的内容如下 [mysql] default-character-setutf8[mysqld] character-set-serverutf8 default-storage-engineINNODB sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,…

@PathVariable注解使用

PathVariable是spring3.0的一个新功能&#xff1a;接收请求路径中占位符的值 语法&#xff1a; PathVariable("xxx") 通过 PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中PathVariable(“xxx“) RequestMapping(value”user/{id}/{name}”) 请…

JAVA 框架-Spring-AOP面向切面

AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;我们一般称为面向方面&#xff08;切面&#xff09;编程&#xff0c;作为面向对象的一种补充&#xff0c;用于处理系统中分布于各个模块的横切关注点&#xff0c;比如事务管理、日志、缓存等等。AOP实现的关键…

互相关和卷积的关系

转载于:https://www.cnblogs.com/seisjun/p/10134021.html

Thymeleaf3语法详解

Thymeleaf是Spring boot推荐使用的模版引擎&#xff0c;除此之外常见的还有Freemarker和Jsp。Jsp应该是我们最早接触的模版引擎。而Freemarker工作中也很常见&#xff08;Freemarker教程&#xff09;。今天我们从三个方面学习Thymeleaf的语法&#xff1a;有常见的TH属性&#x…

SSM+Netty项目结合思路

最近正忙于搬家&#xff0c;面试&#xff0c;整理团队开发计划等工作&#xff0c;所以没有什么时间登陆个人公众号&#xff0c;今天上线看到有粉丝想了解下Netty结合通用SSM框架的案例&#xff0c;由于公众号时间限制&#xff0c;我不能和此粉丝单独沟通&#xff0c;再此写一篇…

THYMELEAF 如何用TH:IF做条件判断

TestController 增加一个布尔值数据&#xff0c;并且放在model中便于视图上获取 package com.how2java.springboot.web; import java.util.ArrayList; import java.util.Date; import java.util.List;import org.springframework.stereotype.Controller; import org.springfr…

Thymeleaf th:include、th:replace使用

最近做到页面数据展示分页的功能&#xff0c;由于每个模块都需要分页&#xff0c;所以每个页面都需要将分页的页码选择内容重复的写N遍&#xff0c;如下所示&#xff1a; 重复的代码带来的就是CtrlC&#xff0c;CtrlV ,于是了解了一下thymeleaf的fragment加载语法以及th:includ…

Thymeleaf select 使用 和多select 级联选择

1.使用select 并且回绑数据; 页面&#xff1a; 状态&#xff1a; <select name"status" th:field"*{status}" id"idstatus" class"input-select" th:value"*{status}"> <option value"">--请选择-…

表达式符号

Thymeleaf对于变量的操作主要有$*#三种方式&#xff1a; 变量表达式&#xff1a; ${…}&#xff0c;是获取容器上下文变量的值.选择变量表达式&#xff1a; *{…}&#xff0c;获取指定的对象中的变量值。如果是单独的对象&#xff0c;则等价于${}。消息表达式&#xff1a; #{……

Java学习的快速入门:10行代码学JQuery

生活在快速发展时代的我们&#xff0c;如果不提速可能稍不留神就被时代淘汰了。快节奏的时代成就了快餐&#xff0c;亦成就了速成教育。尤其是身处互联网行业的我们&#xff0c;更新换代的速度更是迅速&#xff0c;快速掌握一门技术已经成为潮流趋势。怎样才能快速入门学习java…

项目管理

项目先后衔接的各个阶段的全体被称为项目管理流程。项目管理流程对于一个项目能否高效的执行起到事半功倍的效果。接下来我会利用36张的ppt&#xff08;当然了这里我只用部分图片展示要不然就太多图片了&#xff09;&#xff0c;介绍项目管理的整体流程。 1.项目管理的五大过程…

docker——三剑客之Docker Machine

Docker Machine是Docker官方三剑客项目之一&#xff0c;负责使用Docker的第一步&#xff0c;在多种平台上快速安装Docker环境。它支持多种平台&#xff0c;让用户在很短时间内搭建一套Docker主机集群。Machine项目是Docker官方的开源项目&#xff0c;负责实现对Docker主机本身进…

软件项目管理(二)

根据上次的路线图 从项目初始开始&#xff1a;包括项目确立和生存期 项目确立分成 项目立项、项目招投标、项目授权 项目立项&#xff1a;确定项目的目标、时间、资源、资金&#xff0c;关键在于得到项目发起人的认可 一个软件项目的立项开始于软件项目的启动&#xff0c;只…

软件项目管理(三)

上次讲完了项目初始部分&#xff0c;包括立项、招投标、授权 在进入第二部分&#xff0c;项目计划 前我们要先了解软件的需求以及任务的分解 软件需求管理 软件需求定义&#xff1a;用户对软件功能和性能的要求 软件需求管理过程&#xff1a;需求获取、需求分析、需求规格…

软件项目管理(四)

上一篇介绍了软件项目的需求分析和任务分解&#xff0c;即软件项目的范围计划&#xff0c;那么对于一个软件项目来说&#xff0c;我们还需要知道它需要多少时间多少成本&#xff0c;如何得到这些数据就是这次要解决的问题&#xff0c;即项目的成本计划 在项目未完成之前谁也不…

软件项目管理(五)

在get到成本计划后&#xff0c;我们便要着手开始对项目的进度进行计划&#xff0c;即这次的核心计划之一进度计划。 进度计划的重要性&#xff1a;按时完成项目是项目经理最大的挑战之一&#xff0c;时间是项目规划中灵活性最小的因素&#xff0c;进度问题是项目冲突的主要原因…

Python 列表元组字典集合

列表&#xff08;list&#xff09; 有序性&#xff0c;可存储任意类型的值通过偏移存取&#xff0c;支持索引来读取元素&#xff0c;第一个索引为0 &#xff0c;倒数第一个索引为-1可变性 &#xff0c;支持切片、合并、删除等操作可通过索引来向指定位置插入元素可通过pop()方法…

MySQL中事物的详解

1. 事物的定义及特性 事务是一组操作数据库的SQL语句组成的工作单元&#xff0c;该工作单元中所有操作要么同时成功&#xff0c;要么同时失败。事物有如下四个特性&#xff0c;ACID简称“酸性”。 1&#xff09;原子性&#xff1a;工作单元中所有的操作要么都成功&#xff0c;要…