68

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

毕竟我研究过我找到的最好的答案就是这个。它已经提到这ModelAndView是一种旧方式,而Model返回String是一种新方式Spring

我的问题是,我们是否应该弃用现有的旧ModelAndView版本Model?或者有什么需要用到ModelAndView的案例吗?

另外,有谁知道为什么必须更改ModelAndViewModelString价值 as View,有什么好处?

4

3 回答 3

57

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

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

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

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

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

希望这可以帮助。

于 2013-06-06T10:41:15.690 回答
17

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

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

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

public String myHandler(...) {
   return "myviewname"; // has to have a resolver from "myviewname" into an actual view
}
于 2013-06-06T00:56:44.180 回答
0

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

于 2017-03-16T07:01:28.800 回答