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,…

【FBI WARNING】一些Noip的黑科技 持续整理!

有疑问或错误尽管评论&#xff01;&#xff01; 下面以C为准。 本文手&#xff08;粘&#xff09;打&#xff08;贴&#xff09;于各大博客之间 有问题。。。。。 我也不懂 max、min的优化 我们知道&#xff0c;打max、min时&#xff0c;要用分支&#xff08;if语句&#xff09…

@PathVariable注解使用

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

【mysql】- 常用命令

DML - 操作表 SELECT * FROM stu;INSERT INTO stu ( id, NAME ) VALUES ( 1, 张三 );INSERT INTO stu ( id, NAME, sex, birthday, score, email, tel, STATUS ) VALUES( 2, 李四, 男, 1999-11-11, 88.888, lisiitcase.cn, 13812345678, 1 );update stu set sex 女 where nam…

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…

【mysql】约束、外键约束、多对多关系

1、约束 DROP TABLE IF EXISTS emp;-- 员工表 CREATE TABLE emp (id INT PRIMARY KEY auto_increment, -- 员工id,主键且自增长ename VARCHAR(50) NOT NULL UNIQUE, -- 员工姓名,非空并且唯一joindate DATE NOT NULL, -- 入职日期,非空salary DOUBLE(7, 2) NULL, -- 工资,非空…

SSM+Netty项目结合思路

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

[6]Windows内核情景分析 --APC

APC&#xff1a;异步过程调用。这是一种常见的技术。前面进程启动的初始过程就是&#xff1a;主线程在内核构造好运行环境后&#xff0c;从KiThreadStartup开始运行&#xff0c;然后调用PspUserThreadStartup&#xff0c;在该线程的apc队列中插入一个APC&#xff1a;LdrInitial…

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…

【mysql】多表查询、左外连接、内连接、练习题

多表查询 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FBdzXkoQ-1659581225088)(C:\Users\L00589~1\AppData\Local\Temp\1659337934641.png)] 左外连接&右外连接 -- 查询emp表所有数据和对应的部门信息 select * from emp left join dept o…

noi2018

day0 笔试没啥问题&#xff0c;基本都是100 day1 时间有点紧&#xff0c;念了2h题目&#xff0c;能写80848&#xff0c;第一题不会可持久化所以只能暴力。第二题感觉没第三个好做。第三题sa乱搞&#xff0c;随机串只hash长度小于20的。 最后几分钟才改过了所有小样例&#xff0…

Python自建collections模块

本篇将学习python的另一个内建模块collections,更多内容请参考:Python学习指南 collections是Python内建的一个集合模块&#xff0c;提供了许多有用的集合类。 namedtuple 我们知道tuple可以表示不变集合&#xff0c;例如&#xff0c;一个点的二维左边就可以表示成&#xff1a;…

Thymeleaf th:include、th:replace使用

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

(OS X) OpenCV架构x86_64的未定义符号:错误(OpenCV Undefined symbols for architecture x86_64: error)...

原地址&#xff1a;http://www.it1352.com/474798.html 错误提示如下&#xff1a; Undefined symbols for architecture x86_64:"cv::_InputArray::_InputArray(cv::Mat const&)", referenced from:_main in test-41a30e.o"cv::namedWindow(std::__1::basic…

【算法】大根堆

const swap (arr, i, j) > {const tmp arr[i];arr[i] arr[j];arr[j] tmp; } const heapInsert (arr , i) > { // 插入大根堆的插入算法while(arr[i] > arr[Math.floor((i - 1) / 2]) {swap(arr, i, Math.floor((i - 1) / 2);i Math.floor((i - 1) / 2; } } cons…

[CF1082E] Increasing Frequency

Description 给定一个长度为 \(n\) 的数列 \(a\) &#xff0c;你可以任意选择一个区间 \([l,r]\) &#xff0c;并给区间每个数加上一个整数 \(k\) &#xff0c;求这样一次操作之后数列中最多有多少个数等于 \(c\)。 \(n,c,a_i\leq 10^5\) Solution 假设当前选择区间的右端点为 …

Thymeleaf select 使用 和多select 级联选择

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

Switch语句的参数是什么类型的?

在Java5以前&#xff0c;switch(expr)中&#xff0c;exper只能是byte&#xff0c;short&#xff0c;char&#xff0c;int类型。 从Java5开始&#xff0c;java中引入了枚举类型&#xff0c;即enum类型。 从Java7开始&#xff0c;exper还可以是String类型。 switch关键字对于多数…