Spring MVC 中Model, ModelMap, ModelAndView 之间有什么关系和区别?

SpringMVC中Model,ModelAndView,ModelMap的区别 目录前言`Model` 前言 在 springMVC 请求处理方法返回的参数类型中,最重要就是 Model 和 ModelAndView了。使用 Model 和 ModelAndView 这两者之间有着很大的区别 Model 只是用来传输数据的,并不会进行业务的寻址 ModelAndView 却是可以进行业务寻址的,就是设置对应的要请求的静态文件,这里的静态文件指的是类似 jsp 的文件 Model Model 是一个接口,实现类为 ExtendedModelMap 和 ModelMap。Model 本 阅读详情

在 Spring MVC 中,Model, ModelMap, 和 ModelAndView 都是用来在 Controller 和 View 之间传递数据的,但它们在使用方式和功能上有所不同。

它们的核心在于:Spring MVC 需要知道两件事来渲染视图:① 数据 (Model) ② 视图名称 (View Name)。

下面我们详细介绍一下它们的关系和区别:

  1. Model (接口)

    • 是什么:Model 是一个接口 (org.springframework.ui.Model)。它主要用于在 Controller 方法中添加需要在 View 中展示的数据。
    • 如何工作:当我们在 Controller 方法的参数中声明一个 Model 类型的参数时,Spring MVC 会自动创建一个 Model 的实例(通常是 ExtendedModelMap 的实例)并将其传递给我们的方法。
    • 主要方法:
      • addAttribute(String attributeName, Object attributeValue): 添加单个属性。
      • addAttribute(Object attributeValue): 添加属性,名称由类型推断。
      • addAllAttributes(Map<String, ?> attributes): 添加一个 Map 中的所有属性。
      • mergeAttributes(Map<String, ?> attributes): 合并一个 Map 中的属性,如果键已存在则覆盖。
      • containsAttribute(String attributeName): 检查是否存在某个属性。
    • 视图选择:当使用 Model 时,Controller 方法通常返回一个 String 类型的值,这个字符串就是逻辑视图名。Spring MVC 会根据这个视图名找到对应的视图进行渲染。
    • 示例:
      @Controller
      public class MyController {
          @GetMapping("/showData")
          public String showData(Model model) {
              model.addAttribute("message", "Hello from Model!");
              User user = new User("John Doe", 30);
              model.addAttribute("user", user);
              return "dataView"; // 返回逻辑视图名
          }
      }
      
  2. ModelMap (类)

    • 是什么:ModelMap 是一个类 (org.springframework.ui.ModelMap),它实现了 Model 接口,并且继承自 java.util.LinkedHashMap。
    • 如何工作:与 Model 类似,我们可以在 Controller 方法参数中声明它,Spring MVC 会提供相应的实例。因为它是一个 Map,所以我们可以使用所有 Map 的方法(如 put(), get() 等)以及 Model 接口定义的方法。
    • 与 Model 的关系:ModelMap 是 Model 接口的一个具体实现。当我们使用 Model 接口时,Spring MVC 内部提供的是 ModelMap(或其子类 ExtendedModelMap)的实例。
    • 视图选择:与 Model 相同,Controller 方法通常返回一个 String 类型的逻辑视图名。
    • 为什么存在:
      • 提供了 Map 的便利性,如果已经有了一个 Map 对象,可以直接用 addAllAttributes 或 putAll。
      • 历史原因,在泛型广泛使用前,ModelMap 提供了类型安全(相对于直接使用 Map<String, Object>)。
    • 示例:
      @Controller
      public class MyController {
          @GetMapping("/showDataWithModelMap")
          public String showDataWithModelMap(ModelMap modelMap) {
              modelMap.addAttribute("message", "Hello from ModelMap!");
              modelMap.put("anotherMessage", "Using put method!"); // Map 的方法
              User user = new User("Jane Doe", 25);
              modelMap.addAttribute("user", user);
              return "dataView"; // 返回逻辑视图名
          }
      }
      
  3. ModelAndView (类)

    • 是什么:ModelAndView 是一个类 (org.springframework.web.servlet.ModelAndView),它是一个容器,同时持有 模型数据 (Model) 和 视图信息 (View)。
    • 如何工作:与 Model 和 ModelMap 不同,ModelAndView 对象是由我们在 Controller 方法中创建并返回的。我们不需要将其声明为方法参数(虽然也可以,但不常见)。
    • 主要方法/构造函数:
      • ModelAndView(String viewName)
      • ModelAndView(String viewName, Map<String, ?> model)
      • ModelAndView(String viewName, String modelName, Object modelObject)
      • addObject(String attributeName, Object attributeValue): 添加模型数据。
      • setViewName(String viewName): 设置逻辑视图名。
      • setView(View view): 直接设置一个 View 对象。
      • getModel(): 获取模型数据 (返回一个 Map)。
      • getModelMap(): 获取模型数据 (返回一个 ModelMap)。
    • 视图选择:视图信息直接包含在 ModelAndView 对象中。
    • 示例:
      @Controller
      public class MyController {
          @GetMapping("/showDataWithModelAndView")
          public ModelAndView showDataWithModelAndView() {
              ModelAndView mav = new ModelAndView();
              mav.setViewName("dataView"); // 设置逻辑视图名
              mav.addObject("message", "Hello from ModelAndView!");
              User user = new User("Peter Pan", 100);
              mav.addObject("user", user);
              return mav; // 返回 ModelAndView 对象
          }
      }
      

关系总结:

  • Model 是一个接口,定义了添加数据到模型的基本操作。
  • ModelMap 是 Model 接口的一个实现,它本身是一个 LinkedHashMap,提供了 Map 的操作便利性。
  • ModelAndView 是一个独立的类,它封装了模型数据(内部使用 ModelMap 或类似的 Map 结构来存储数据)和视图信息。

区别总结:

特性Model (接口)ModelMap (类)ModelAndView (类)
类型接口类 (实现 Model, 继承 LinkedHashMap)类
主要职责仅传递数据仅传递数据 (以 Map 形式)传递数据 和 指定视图
如何获取实例作为 Controller 方法参数 (Spring 注入)作为 Controller 方法参数 (Spring 注入)在 Controller 方法中 new 出来并返回
视图指定Controller 方法返回 String 视图名Controller 方法返回 String 视图名视图名或 View 对象在 ModelAndView 内部设置
返回值String (逻辑视图名)String (逻辑视图名)ModelAndView 对象本身
灵活性专注于数据,视图名解耦专注于数据,视图名解耦,有 Map 特性数据和视图紧密耦合在一个对象中

使用场景?

  • Model (推荐):

    • 这是目前最常用和推荐的方式。
    • 当 Controller 方法的主要职责是准备数据,并且视图名是固定的或者可以通过简单的字符串返回时。
    • 代码更简洁,职责分离更清晰(方法只关注数据,返回类型指明视图)。
  • ModelMap:

    • 如果需要 Map 的特定方法,或者想强调模型数据是一个 Map 结构时。
    • 实际上,由于 Model 接口已经足够强大,并且 Spring 内部通常用 ModelMap 的子类 ExtendedModelMap 来实现 Model,所以直接使用 Model 接口通常更好。
  • ModelAndView:

    • 当 Controller 方法需要根据逻辑动态决定返回哪个视图,或者需要返回一个具体的 View 对象时。
    • 在一些较早的 Spring MVC 代码中比较常见。
    • 当你想将数据和视图信息明确的捆绑在一起返回时。
    • 如果你需要返回 null 来指示不渲染任何视图(例如,在某些拦截器或特殊处理中),ModelAndView 也可以做到(返回 null 的 ModelAndView)。

Spring MVC 实践建议:

优先使用 Model 作为方法参数,并让 Controller 方法返回 String 类型的逻辑视图名。这种方式更简洁,也更符合 Spring MVC 的设计,即 Controller 负责处理请求、准备数据,并将逻辑视图名交给 ViewResolver 去解析。

只有在确实需要将模型和视图紧密绑定,或者需要动态决定视图对象本身时,考虑使用 ModelAndView。 ModelMap 的使用场景相对较少,通常 Model 接口就能满足需求。

Spring中Model,ModelMap以及ModelAndView之间的区别 1.场景分析 在许多实际项目需求中,后台要从控制层直接返回前端所需的数据,这时Model大家族就派上用场了。2.三者区别①ModelModel是一个接口,它的实现类为ExtendedModelMap,继承ModelMap类public class ExtendedModelMap extends ModelMap implements Model1②ModelMapModelMap继承Lin... 阅读详情

相关推荐

本科双非的计算机考研择校注意点——经验贴

一战一志愿上岸某211的电子信息专硕。之前在某乎也发过帖子。但现在用优快云,所以把相关的心得再发出来仅供大家参考。 首先,我认为最重要的是你为什么要考研? 不管你是为了混一个文凭将来好进大厂,还是为了真正搞学术或者学知识,你要知道你自己的目标,只有坚定自己的目标,才有动力去走完这段复习的历程。真正的考研,是很苦的。如果你是为了逃避大四面临的就业才选择考研,并且还浑浑噩噩不当回事,那我劝你放弃,不如踏踏实实学点技术去找实习。那从我自己出发,我是认为自己本科双非院校且自己四年间没有学到什么专业方面的技能,

m0_56698268的博客 3165

ModelAndView 详解

当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherServlet。 因此,经常需要在控制器中构造ModelAndView对象。ModelAndView类提供了几个重载的构造器和一些方便的方法, 让你可以根据自己的喜好来构造ModelAndView对象。这些构造器和方法以类似的方式支持视图名称和视图对象。 当你只有一个模型

努力奔跑的蜗牛 4万+

避坑指南:Zabbix poller进程100%占用的5种常见原因及解决方案

本文深入剖析了Zabbix poller进程占用率高达100%的五大常见原因,包括监控项与进程数不匹配、不可达主机资源浪费、数据库性能瓶颈、监控项配置不合理以及版本缺陷。文章提供了从系统化诊断到针对性解决方案的完整指南,并重点介绍了如何通过优化zabbix_server.conf中的StartPollers等关键参数进行有效调优,帮助运维人员从根本上解决这一经典性能问题。

7z8x2c4v6b9的博客 251

Model和ModelAndView的区别,以及使用详解

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

JBIB ENGINE 3165

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1111

2023推免(夏令营+套实验室)面试总结(博文附问题汇总和参考答案)

2023推免(夏令营+套实验室)面试总结(博文附问题汇总和参考答案)

m0_51339444的博客 1808

ModelAndView详解

ModelAndView的构造方法有7个。但是它们都是相通的。这里使用无参构造函数来举例说明如何构造ModelAndView实例。 ModelAndView类别就如其名称所示,是代表了MVC Web程序中Model与View的对象,不过它只是方便您一次返回这两个对象的holder,Model与View两者仍是分离的概念。 最简单的ModelAndView是持有View的名称返回,之后View名

来啊 快活啊 8355

学Simulink——基于扩展卡尔曼滤波(EKF)的列车牵引电机转子温度在线估计仿真

本文介绍了一种基于扩展卡尔曼滤波(EKF)的列车牵引电机转子温度在线估计方法,通过Simulink建模实现。文章首先阐述了EKF在估计电机转子温度中的优势,即利用易测量信号(如电流、电压、转速)在线估计难以直接测量的转子温度,并分析了温升对电机性能的影响。随后详细讲解了电机热电增广模型的构建,包括定子电阻温度关系、一阶热近似模型和PMSM的dq轴方程。接着,文章提供了Simulink建模的详细步骤,包括PMSM+FOC电流环的搭建、EKF算法的实现(推荐使用ExtendedKalmanFilter块或MAT

xiaoheshang_123的博客 58

springMVC 处理返回数据:Map、Model、ModelMap、ModelAndView。

Map Model ModelMap ModelAndView 在处理结果上,4者并没有太多区别。但使用方法略有不同: 1、2、3在方法参数中声明,指定一个该类型的对象: 后台: @RequestMapping("/test") public String test(Map<Sting, Object> map, Model model, ModelMap modelMap){ ...

学习中 1941

【四足机器人项目实战】四足机器人嵌入式硬件设计

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、电源管理板设计及制作二、通讯中继板设计及制作三、力控无刷电机驱动板设计及制作1.磁场定向控制FOC控制原理2.电机转子位置、速度检测原理3.硬件CAN通讯原理 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对四足机器人–嵌入式硬件设计做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、电

qq_35635374的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring MVC 数据模型与视图

  从控制器获取数据后,会装载数据到数据模型和视图中,然后将视图名称转发到视图解析器中,通过解析器解析后得到最终视图,最后将数据模型渲染到视图中,展示最终的结果给用户。  用ModelAndView来定义视图类型,包括JSON视图,也用它来加载数据模型。ModelAndView有一个类型为ModelMap的属性model,而ModelMap继承了LinkedHashMap<String,...

xc_oo0的博客 53

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Model、ModelMap和ModelAndView的使用详解

1.前言 最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。 使用Model和ModelAndView这两个类在spring的视图解析时作用以及区别。 这两者之间...

空空说技术的博客 9万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringMVC中的Model和ModelAndView详解

1.Model是什么?model是”模型“的意思,是MVC架构中的”M“部分,是用来传输数据的。2.ModelAndView是什么?如果翻译过来就是”模型和视图“,可以理解成MVC架构中的”M“和”V“,其中包含”Model“和”view“两部分,主要功能是:设置转向地址将底层获取的数据进行存储(或者封装)最后将数据传递给View区别?1.Model只是用来传输数据的,并不会进行业务的寻址。

城南蝈蝈 2万+

springMVC Model ModelMap 和 ModelAndView的区别

近来在看代码,发现controller里有不同的处理返回数据的方式,而自己一直在用ModelAndView在处理数据,对于其他的方式也零星用过,但是总感觉不明白其中的区别,也就写了这篇博客总结一下: 简单来说: Model是包含四个addAttribute 和一个 merAttribute方法的接口。 ModelMap :实现了Map接口,包含Map方法。视图层通过request找到Mod

maoyeqiu的专栏 2万+

Spring MVC的ModelAndView、Model、ModelMap、RedirectAttributes的范围及关系分析

废话不多说,在Spring MVC中。 1、ModelAndView类中有个类型为ModelMap的对象。 2、ModelMap继承了LinkedHashMap<String,Object>,因此理论上可以保存任何类型的值。 3、有一个类ExtendedModelMap继承了ModelMap并且实现了Model接口。 4、还有一个类BindingAwareModelMap继承了...

贝贝的博客 1881

Springboot---Model,ModelMap,ModelAndView

Model(org.springframework.ui.Model) Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。 ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。 public class ExtendedModelMap extends ModelMap implements Model...

likunpeng6656201的博客 6223

Spring中Model、ModelMap及ModelAndView之间的区别

1. Model(org.springframework.ui.Model) Model是一个接口,包含addAttribute方法,其实现类是ExtendedModelMap。 ExtendedModelMap继承了ModelMap类,ModelMap类实现了Map接口。 Model通过以下方法向页面传递参数: 2.ModelMap(org.springframework.ui.ModelMap) Spring框架自动创建modelmap的实例,并作为controller方法的参数传入,用户无需自

weixin_46217160的博客 1296

spring中Model、ModelMap、ModelAndView的用法

1. Model(org.springframework.ui.Model) 可以向页面传递参数,但不可以跳转url。 前端取参数: ${requestScope.user.loginname } 例:(@ModelAttribute修饰的方法会先于login调用,它把请求参数值赋给对应变量。可以向方法中的Model添加对象,前提是要在方法中加入一个Model类型的参数。) @Req...

Captain249的博客 1404

model、modelMap、ModelAndView的使用和区别

1、Model的使用 数据传递:Model是通过addAttribute方法向页面传递数据的; 数据获取:JSP页面可以通过el表达式或C标签库的方法获取数据; return:return返回的是指定的页面路径; /** * Model是每一次请求可以自动创建 * @param model * @return */ @RequestMapping("/test01") public String test01(Model mode

Yuwen110的博客 841

Model、ModelMap和ModelAndView之间的区别及一些用法

对应ssm+maven搭建及扩展修改(三.对前俩节基础架构弊端及解析)追加 1.前言 最近SSM框架开发web项目,用得比较火热。spring-MVC肯定用过,在请求处理方法可出现和返回的参数类型中,最重要就是Model和ModelAndView了,对于MVC框架,控制器Controller执行业务逻辑,用于产生模型数据Model,而视图View用于渲染模型数据。  使用Model和ModelA...

qq_24241631的博客 706

spring mvc ModelAndView和ModelAttribute和Model和ModelMap的区别

Model 最大的一个类,其他的都是它的实现类。spring mvc中Model的作用是把从前面传的值通过Model把值存到request域里,使用Model替代了原始的HttpServletRequest获取数据,因为使用Request代码 要引入jar包Api 耦合度过高 如果没有相关的jar包 就会报错,解决的办法就是Model 它会自动的把值存到Request域里。 @RequestMapping("TestSessionAttributes") public String TestSession

weixin_45247356的博客 463
上一篇: Spring Boot 为 MongoDB 自动配置了哪些核心 Bean?
下一篇: Spring 是什么?它解决了什么问题?
冰糖心书房
博客等级 码龄15年 6019粉丝 690原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰糖心书房

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值