什么时候在 Spring 中使用 ModelAndView 和 Model?

Posted

技术标签:

【中文标题】什么时候在 Spring 中使用 ModelAndView 和 Model?【英文标题】:When to use ModelAndView vs Model in Spring? 【发布时间】:2013-06-05 23:41:29 【问题描述】:

这对Spring 专家来说可能听起来很愚蠢,但我不得不问: 您如何决定何时使用ModelAndView 以及何时使用Model

毕竟我研究过我找到的最佳答案是this one。它提到ModelAndView 是一种旧方式,而Model 返回StringSpring 中的一种新方式。

我的问题是,既然我们手头有Model,我们是否应该弃用旧的ModelAndView?或者有什么情况需要使用ModelAndView吗?

另外,有谁知道为什么必须将ModelAndView 更改为ModelString 值作为View,有什么好处?

【问题讨论】:

【参考方案1】:

我总是使用控制器方法返回ModelAndView 的方法。仅仅是因为它倾向于使控制器方法更加简洁。方法参数现在严格为input 参数。而所有output相关的数据都包含在方法返回的对象中。

ModelAndView 风格似乎与不喜欢将输入参数更新为方法的人产生共鸣。坚持认为这会构成副作用,一种危险的模式,因为您无法可靠地预测该方法将要做什么 - 它可以在返回的对象中返回数据,或者它可以更新任何输入参数中的任何内容。

所以有些人还是会继续偏爱ModelAndView

Model作为方法参数并返回字符串作为视图名称的新样式。似乎来自一种稍微不同的设计方法。在这里,模型对象被认为是传递给多个处理程序的事件或项,然后返回到呈现它们的视图。它提醒我在 AWT / Swing 世界中是如何处理事件的。此模型与多个处理程序可以在 Model 对象之上构建的方法更加一致,直到它到达一个视图。

因此,归根结底,似乎没有明确的理由来批评或提倡这两种方法。您应该使用与您的整体设计理念更一致的风格。

希望这会有所帮助。

【讨论】:

谢谢 :) 这是我的代码:@RequestMapping(value = "STB1/home", method = RequestMethod.GET) public ModelAndView homeAction() ModelAndView mav = new ModelAndView("STB1/home"); return mav; // renders the // /<packagename>/src/main/webapp/WEB-INF/jsp/STB1/home.jsp 【参考方案2】:

我可以发现的一个区别是使用 ModelAndView 对象,您可以设置对视图对象的直接引用:

ModelAndView mav = ...
mav.setView(myView);

而如果你使用模型和字符串,你需要一个视图解析器来将视图名称解析为一个实际的视图

public String myHandler(...) 
   return "myviewname"; // has to have a resolver from "myviewname" into an actual view

【讨论】:

虽然我同意这一点,但我仍然更喜欢让视图解析器解析要显示的页面。【参考方案3】:

从 SEO 的角度来看,如果我们有任何要求,我们可以使用 ModelAndView 来应用 301 重定向,我们无法使用 Model 来实现。

【讨论】:

以上是关于什么时候在 Spring 中使用 ModelAndView 和 Model?的主要内容,如果未能解决你的问题,请参考以下文章

spring中 实体类在啥时候交给spring容器管理?

#yyds干货盘点# Spring源码三千问Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?

什么时候应该使用 Spring Integration 或相关框架?

Spring 啥时候使用服务或组件? [复制]

spring什么时候实例化bean

什么时候以及为什么我必须使用 Spring Boot? [关闭]