文档章节

Resolving Views

AlphaGo
 AlphaGo
发布于 2016/03/15 01:04
字数 854
阅读 15
收藏 0

        所有的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。

        

        



© 著作权归作者所有

AlphaGo
粉丝 0
博文 9
码字总数 7769
作品 0
程序员
私信 提问
spring mvc 中一些特殊的类

涉及到一些spring mvc 的设计 关键类赋予特别的关心 Table 16.1. Special bean types in the WebApplicationContext Bean type Explanation HandlerMapping Maps incoming requests to handl......

triankg
2014/06/19
53
0
have different Class objects for the type javax...

在测试spring-mvc-showcase的时候出现如下log: HTTP Status 500 - type Exception report message description The server encountered an internal error () that prevented it from fulfi......

刘文豪
2011/09/10
6K
0
Failed to convert value of type [java.lang.String] to required type [java.lang.Long]

2016-09-19 10:14:54.157 [http-nio-8080-exec-5] [DEBUG] org.springframework.web.servlet.DispatcherServlet {DispatcherServlet.java:845} - DispatcherServlet with name 'spring-servl......

落落酱
2016/09/19
3.6K
2
Android Studio 0.3.7 发布

Android Studio 0.3.7版本主要有以下几个方面的改进: Gradle The experimental "Direct Gradle Invocation" mode is now the default. This should result in builds being about 20% faste......

打杂程序猿
2013/12/06
4.3K
16
 ::          UNRESOLVED DEPENDENCIES   [warn]     :: org.apache.spark#spark-graph;2.0.2: not found [warn]   

;reload; */*:dumpStructureTo /tmp/sbt-structure.xml download resolveClassifiers resolveSbtClassifiers [info] Loading global plugins from /home/aurora/.sbt/0.13/plugins [info] Lo......

AuroraTan
2017/06/25
815
0

没有更多内容

加载失败,请刷新页面

加载更多

LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
29分钟前
3
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
30分钟前
3
0
使用bash -x 调试信息查看lvextend -r的调用

--1.打开调试: [root@db01 storage]# set -x --2.执行命令: [root@db01 storage]# /usr/sbin/lvextend -r -L 710M /dev/shazam/storage + /usr/sbin/lvextend -r -L 710M /dev/shazam/sto......

突突突酱
39分钟前
3
0
Linux重定向及反弹shell详解

这里说Linux重定向的原因主要还是为了详细了解一下Linux中的反弹shell 目录 0x01 文件描述符 0x02 重定向 0x03 反弹shell 0x04 交互重定向 0x05 命令变形 0x01 文件描述符 Linux的文件描述符...

无心的梦呓
44分钟前
3
0
开发经验 初学51单片机建议用C语言

typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   新手学习51单片机建议用C语言。因为使用C语言入门的话,上手速度快。实现几个例程后...

志成就
50分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部