ModelAndView 类别就如其名称所示,是代表了 Spring Web MVC 程式中呈现画面时所使用 Model 资料物件与 View 资料物件,由于 Java 程式中一次只能返回一个物件,所以 ModelAndView 的作 用封装 这两个物件,以方便您一次返回 Model 与 View 这两个物件。
最简单的 ModelAndView 是持有 View 的名称返回,之后 View 名称被 View resolver,也就是实 作 org.springframework.web.servlet.View 介面的实例解析,例如 InternalResourceView 或 JstlView 等等,最简单的 ModelAndView 建构方式如下:
ModelAndView(String viewName)
如果您要返回呈现画面时所需的 Model 资料物件,则可以使用 Map 物件来收集呈现资料时所需的 资料,然后在建构 ModelAndView 作为建构时的引数,您可以使用下面这个版本的 ModelAndView 建构方法:
ModelAndView(String viewName, Map model)
Map 物件中设定好键(Key)与值(Value),之后可以在要呈现的画面中取出加以显示(例如在 JSP 网页中),如果您要返回一个 Model 资料物件并指定 Model 的名称,则可以使用下面这个 ModelAndView 版本:
ModelAndView(String viewName, String modelName, Object modelObject)
藉由 modelName,您可以在要 View 的实作类别中取出 Model 资料物件,并根据 View 所使用的技 术来加以显示(可能是 JSP 网页、Pdf 等呈现技术)。
ModelAndView 类别也提供实作 View 介面的物件来作为建构时的引数,以下是三个可用的建构方 法版本:
ModelAndView(View view) ModelAndView(View view, Map model) ModelAndView(View view, String modelName, Object modelObject)
一个实作 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 应用程式目录。
使用转发(Forward)方式的话,网址列上并不会出现被转发的目标位址,而且转发方式是在 Web 应用程式之内进行,可以访问 Web 应用程式所设定的内 部目录,像是 WEB-INF 目录,因而您可 以将一些要控管存取的资源放到 WEB-INF 下,如此使用者就无法直接请求这些资源,而必须透过 DispatcherServlet 与 Controller 的处理与控管,才可以取得这些资源,转发方式只能在 Web 应用程式中进行,不能指定至其它的 Web 应用程式位址。
使用重新导向(Redirect)的话,Web 应用程式会要求客户端浏览器重新发出一个所指定的请求 位址,也就是实际上相当于客户端重新连接至一个所指定 的位址,因此浏览器的位址列上会出 现被重新导向的资讯,重新导向的请求是由浏览器发出,所以不能访问 Web 应用程式中的隐藏目 录,像是 WEB-INF,重 新导向是重新要求一个网页,所以可以指定至其它的 Web 应用程式位址。