您的位置:首页 > 编程语言 > Java开发

Spring4.x官方参考文档中文版——第21章 Web MVC框架(16)

2016-06-28 11:16 495 查看
21.5.2 串联多个ViewResolver
Spring支持多个视图解析器。因此,你能够串联多个解析器,也可以在特定情况下覆写特定的视图。你可以通过在你的应用中的context中添加多个解析器来把这些视图解析器串联起来。此外,如果有必要的话,还可以设置order属性来指定执行顺序。请记住,order属性值越高,这个视图解析器执行的越晚。
在下面的例子中,这个解析器链包含了2个解析器:一个InternalResourceViewResolver,被自动置于这个解析器链的最后;还有一个XmlViewResolver,用来指定Excel视图,因为Excel视图是不被InternalResourceViewRersolver支持的:

<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

<bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="order" value="1"/>
<property name="location" value="/WEB-INF/views.xml"/>
</bean>

<!—这部分在views.xml中 -->

<beans>
<bean name="report" class="org.springframework.example.ReportExcelView"/>
</beans>


如果有一个特定的视图解析器没有生成视图,Spring将会在context中检查其他的视图解析器:如果有额外的视图解析器存在,Spring会继续检测,直到视图被解析了为止。如果还是没有视图解析器能返回视图,Spring会抛出ServletException异常。
视图无法被找到时返回null是视图解析器的默认守则。但并不是所有视图解析器都这样做,因为,在一些情况下,解析器并不能判定视图到底存在与否。比如,InternalResourceViewResolver在内部使用RequestDispatcher,dispatching(分派行为)是唯一一个能够知晓JSP是否存在的行为,但是这个行为只能执行一次,同样地,VelocityViewResolver和其他一些视图解析器也是如此。关于不同视图解析器的详细情况请查看javadoc文档,来查看其是否能够在视图不存在时进行反馈。因此,把InternalResourceViewResolver不放在最后一个位置时,不能保证视图处理器完全正确地解析视图,因为InternalResourceViewResolver总是会返回视图(包括空视图)。

21.5.3 视图的Redirect(重定向)
就如上面的章节所述,controller一般返回一个逻辑视图名,这个视图名能被视图解析器解析到特定的视图技术上。对于像JSP这样,通过Servlet或JSP引擎来处理视图的视图技术来说,一般使用InternalResourceViewResolver和InternalResourceView来解析。这代表着内部的forward和include行为将通过ServletAPI的RequestDispatcher.forward(..)方法和RequestDispatcher.include()方法来完成。对于其他的视图技术,类似Velocity,
XSLT等等来说,视图自己会把内容直接写到响应流中。
有些时候,我们会希望在视图被渲染完之前把HTTP的redirect(重定向)先发送给客户端。比如:当一个controller被一个包含POST数据的请求调用时,响应实际上是被委派到了另一个controller(比如:表单上传成功这种情况)。在这种情况下,普通的内部forward(转发)意味着其他的controller也能够看到相同的POST数据,如果这些数据与其他数据混在一起的话就会造成潜在的问题。对于需要在视图渲染前redirect(重定向)的另一个原因是,避免同一用户多次提交重复的表单。在这种情况下,浏览器会发送一个初始化的POST;之后会收到一个响应,来重定向到不同的URL;最后,浏览器会在redirect的响应中,为这个URL名后面展示一个GET。这样的话,从浏览器的角度来说,这个页面就不会展示POST的结果,而是一个GET。这样做的结果就是,用户不会通过刷新页面来重复POST相同的数据。刷新会在那个结果页面强制GET,而不是重新发送初始化的POST数据。

RedirectView
有一种在controller的响应中强制把redirect作为返回结果的方法,这种方法是: 创建Spring的RedirectView实例,并将其返回。在这种情况下DsipatcherServlet不会使用普通的视图解析机制。因为这个实例已经给出了(redirect重定向)视图了,DispatchetServlet只是简单的告诉目标视图去做他该做的。RedirectView会调用HttpServletResponse.sendRedirect()来发送一个HTTP
direct(重定向),到客户端的浏览器。
如果你使用RedirectView,并且视图是通过controller自己来创建的,推荐在配置文件中配置一下,来把这个重定向的URL注入到controller里,这样的话,就不会与这个controller耦合太大,而只是在context的配置文件中配置了这个视图名。详见”重定向: 前缀”这一章节了解如何促进解耦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息