Resolving Views

        所有的MVC框架都有一种方式去解析视图,Spring有View Resolver。

        两个重要的接口:ViewResolver 和 View。ViewResolver在视图名和实际的视图之间提供映射,而View将请求导向一种特定的视图技术(View Technology)。

        ViewResolver接口

        Spring MVC controller中所有的处理器方法必须解析到一个视图名。Spring带有几种视图解析器:如XmlViewResolver、UrlBasedViewResolver、InternalResourceResolver、VelocityViewResolver、ContentNegotiatingViewResolver。

        可以在应用上下文中添加多个ViewResolver来组成一个链,还能通过order属性给它们排序。InternalResourceResolver总是会被放在链的最后(它总是会返回一个view)。如果某个指定的ViewResolver没有得到一个view,Spring会在上下文中继续寻找其他的ViewResolver,直到有一个能得到view,如果仍得不到,则Spring会抛出一个ServletException。

        

        Redirecting to views

        有时候在视图被渲染之前,很有必要发起一个HTTP重定向回客户端。例如,当发送一个post请求到一个Controller,并且应答是对另一个Controller的委托时(如一个成功的表单提交),一个普通的内部转发意味着另一个Controller也将看到同样的post数据,这可能会与其他所期待的数据造成混淆。另一个在展示结果之前进行重定向的理由是减少用户反复多次提交表单数据的可能性。在这种情形下,浏览器会发送最初的post,然后它将接收重定向到一个包含另一个url的应答,浏览器随后对这个url发出一个get请求。如此一来,从浏览器的角度看,当前的页面是一个get而非post请求的结果,最终的结果就是用户不可能通过刷新重复post数据。


        RedirectView

        一个让Controller的应答强制重定向的方法是让Controller创建并返回一个RedirectView实例。在这种情况下,DispatcherServlet不使用通常的那种视图解析机制——因为它已经得到一个RedirectView对象了,它使用该对象即可。RedirectView会发起一个HttpServletResponse.sendRedirect()调用,这回给浏览器返回一个HTTP重定向。默认所有的model属性会被暴露在重定向URL中作为URI template变量。剩下的属性中,原始类型或原始类型的集合或数组会被自动的追加成为查询参数。如果一个model实例本来就是为了重定向而准备的,那么把原始类型属性作为查询参数追加是没问题的。但是在一个注解的Controller中,model可能包含了为了渲染而添加的其他属性,为了避免在URL中出现这种属性,Controller可以声明一个RedirectAttributes类型的参数,用它去指定确切的属性供RedirectView使用。如果这个Controller决定重定向,那么RedirectAttributes中的内容会被使用,反之model中的内容会被使用。


        redirect: 前缀

        Controller不应该关心应答是如何被处理的,它只需要操作被注入进来的视图名就行了。

        如果一个返回的视图名包含redirect: 前缀,UrlBasedViewResolver(及其所有子类)就会意识到需要重定向了。这个视图名的其余部分会被当成重定向URL。

        

        



你可能感兴趣的:(view,redirect)