什么时候在 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
返回String
是Spring
中的一种新方式。
我的问题是,既然我们手头有Model
,我们是否应该弃用旧的ModelAndView
?或者有什么情况需要使用ModelAndView
吗?
另外,有谁知道为什么必须将ModelAndView
更改为Model
和String
值作为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?的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点# Spring源码三千问Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?