这对Spring
专家来说可能听起来很愚蠢,但我不得不问:
您如何决定何时使用ModelAndView
以及何时使用Model
?
毕竟我研究过的最佳答案是this one。它提到ModelAndView
是一种旧方法,Model
返回String
是Spring
中的一种新方式。
我的问题是,我们现在是否已弃用ModelAndView
旧的Model
?或者是否有任何需要使用ModelAndView
的情况?
此外,是否有人知道为什么必须将ModelAndView
更改为Model
和String
值为View
,有什么好处?
答案 0 :(得分:44)
我总是使用控制器方法返回ModelAndView
的方法。仅仅因为它倾向于使控制器方法更简洁。方法参数现在是严格的input
参数。所有output
相关数据都包含在从方法返回的对象中。
ModelAndView
样式似乎与那些不喜欢将输入参数更新为方法的人产生共鸣。坚持认为这会构成副作用,这是一种危险的模式,因为你无法可靠地预测方法将要做什么 - 它可以返回返回对象中的数据,或者它可以更新任何输入参数中的任何内容。
所以有些人仍然会继续选择ModelAndView
。
以Model
作为方法参数的新样式,并返回字符串作为视图名称。似乎来自略有不同的设计方法。这里,模型对象被认为是在返回到渲染它们的视图之前传递给多个处理程序的一类事件或项。它提醒我如何在AWT / Swing世界中处理事件。此模型与多个处理程序可以构建在Model
对象之上的方法更加一致,直到它到达视图。
因此,在一天结束时,似乎没有一个明确的理由来批评或推广这两种方法。您应该使用与整体设计理念更加一致的风格。
希望这有帮助。
答案 1 :(得分:15)
我可以发现的一个区别是使用ModelAndView对象可以设置对视图对象的直接引用:
ModelAndView mav = ...
mav.setView(myView);
如果你使用Model和String,你需要一个视图解析器来将视图名称解析为实际视图
public String myHandler(...) {
return "myviewname"; // has to have a resolver from "myviewname" into an actual view
}
答案 2 :(得分:0)
在SEO视角中,如果我们对此有任何要求,我们可以使用ModelAndView来应用301重定向。我们无法使用Model实现此目的。
答案 3 :(得分:0)
@RequestMapping("/")
public ModelAndView AWBCOntroller() {
log.info("Tracking info");
ModelAndView mav = new ModelAndView();
mav.setViewName("index");
return mav;
}