ModelAndView 类别就如其名称所示,是表明了Spring Web MVC程式中呈现画面时所使用Model资料物件与View资料物件,因为Java程式中一次只能返回一个物件,因此ModelAndView的做用封装这两个物件,以方便您一次返回Model与View这两个物件。web
最简单的ModelAndView是持有View的名称返回,以后View名称被View resolver,也就是实做org.springframework.web.servlet.View介面的实例解析,例如 InternalResourceView或JstlView等等,最简单的ModelAndView建构方式以下:
ModelAndView(String viewName)spring
若是您要返回呈现画面时所需的Model资料物件,则可使用Map物件来收集呈现资料时所需的资料,而后在建构ModelAndView做为建构时的引数,您可使用下面这个版本的ModelAndView建构方法:
ModelAndView(String viewName, Map model)浏览器
Map物件中设定好键(Key)与值(Value),以后能够在要呈现的画面中取出加以显示(例如在JSP网页中),若是您要返回一个Model资料物件并指定Model的名称,则可使用下面这个ModelAndView版本:
ModelAndView(String viewName, String modelName, Object modelObject)this
藉由modelName,您能够在要View的实做类别中取出Model资料物件,并根据View所使用的技术来加以显示(多是JSP网页、Pdf等呈现技术)。spa
ModelAndView类别也提供实做View介面的物件来做为建构时的引数,如下是三个可用的建构方法版本:
ModelAndView(View view)
ModelAndView(View view, Map model)
ModelAndView(View view, String modelName, Object modelObject)htm
一个实做View的实例是org.springframework.web.servlet.view.RedirectView, ModelAndView预设是使用转发(Forward)方式来完成请求的结果画面,使用RedirectView的话,则会使用从新导向(Redirect)将请求重导至指定的结果画面位置,以呈现请求的结果,例如:
...
public ModelAndView handleRequest(....) ... {
...
return new ModelAndView(new RedirectView(this.getViewPage()));
}
...资源
在这边,viewPage所设定的位址要是从伺服器网页根目录开始指定,而不是Web应用程式的根目录,因此您的getViewPage()传回的位址必须像是/FirstSpringMVC/pages/index.htm这样的位址,其中FirstSpringMVC是您的Web应用程式目录。get
使用转发(Forward)方式的话,网址列上并不会出现被转发的目标位址,并且转发方式是在Web应用程式以内进行,能够访问Web应用程式所设定的内部目录,像是WEB-INF目录,于是您能够将一些要控管存取的资源放到WEB-INF下,如此使用者就没法直接请求这些资源,而必须透过 DispatcherServlet与Controller的处理与控管,才能够取得这些资源,转发方式只能在Web应用程式中进行,不能指定至其它的 Web应用程式位址。servlet
使用从新导向(Redirect)的话,Web应用程式会要求客户端浏览器从新发出一个所指定的请求位址,也就是实际上至关于客户端从新链接至一个所指定的位址,所以浏览器的位址列上会出现被从新导向的资讯,从新导向的请求是由浏览器发出,因此不能访问Web应用程式中的隐藏目录,像是WEB-INF,从新导向是从新要求一个网页,因此能够指定至其它的Web应用程式位址。model