Spring MVC的视图解析器
一、视图解析器简介
在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义resolverViewName方法,根据viewName创建合适类型的View实现来实现。
视图解析器ViewResolver可以把一个逻辑上的视图名称解析为一个真正的视图。而视图View则是用于处理视图,然后返回给客户端。
Spring 默认提供了多种视图解析器,比如,我们可以使用最常用解析器InternalResourceViewResolver 来查找 JSP 视图(与之相对应的视图类为 InternalResourceView)。通常,一个视图解析器只能查找一个或多个特定类型的视图,在遇到 Spring 不支持的视图或者我们要自定义视图查找规则的情况下,我们就可以通过扩展 Spring 来自定义自己所需的视图解析器。
二、Spring MVC支持的视图解析器
常用视图解析器如下:
1:XmlViewResolver:接口ViewResolver的实现,从XML配置文件中查找视图实现(默认 XML 配置文件为 /WEB-INF/views.xml)。
2:ResourceBundleViewResolver:接口ViewResolver的实现,用于从 properties 文件中查找视图。
3:UrlBasedViewResolver:接口ViewResolver的实现,用于根据请求的URL路径返回相应的视图,该视图需为抽象类AbstractUrlBasedView的实现,它还有些子类,如InternalResourceView和JstlView 等。
4:InternalResourceViewResolver:UrlBasedViewResolver的子类,通常用于查找 JSP和JSTL等视图。
5:VelocityViewResolver /FreeMarkerViewResolver:UrlBasedViewResolver的子类分别用于支持Velocity(类VelocityView)和FreeMark视图(类 FreeMarkerView)。
6:ContentNegotiatingViewResolver:接口ViewResolver的实现,用于根据请求文件的后缀名或请求的header中的accept字段查找视图。
7:BeanNameViewResolver:在spring容器内查找实现了View接口的Bean,设置Bean的名称为逻辑视图名称。
通常情况下,InternalResourceViewResolver是实际开发中最常用的,但在使用它的时候,通常要把它配置到最后一个,因为该视图解析器即使没有找到正确的文件,也会返回一个视图,而不是返回 null,这样优先级比该视图解析器低的解析器,将不会被执行。
三、UrlBasedViewResolver
1、基本功能
UrlBasedViewResolver是对ViewResolver的一种简单实现,而且继承了AbstractCachingViewResolver,主要提供一种拼接URL的方式来解析视图,它可以通过prefix属性指定一个前缀,通过suffix属性指定一个后缀,然后把返回的逻辑视图名称加上指定的前缀和后缀就是视图的URL了。
2、AbstractCachingViewResolver介绍
这是一个抽象类,它会对它解析过的视图实现缓存的功能,这样可以把解析视图的性能问题降到最低。
3、重定向和转发
URL在客户端跳转的配置,就是redirect。我们可以在返回的视图名称中使用 redirect:前缀,这样就可以支持在客户端的跳转,如当返回的视图名称是”redirect:login”的时候,URLBasedViewResolver发现返回的视图名称包含”redirect:”前缀,于是把返回的视图名称前缀”redirect:”去掉,后面的按照上面讲的方式来进行处理。同理可以使用 forward:前缀 来指定是forward跳转。
使用UrlBasedViewResolver的时候必须指定属性viewClass,表示解析成哪种视图,一般使用较多的就是InternalResourceView,利用它来展现jsp,但是当我们使用JSTL的时候我们必须使用JstlView。
四、InternalResourceViewResolver
这个是最常用的,它是URLBasedViewResolver的子类,所以URLBasedViewResolver支持的特性它都支持。它会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通RequestDispatcher在服务器端把请求forword重定向到目标URL。
示例:
<bean id= "defaultViewResolver"class= "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name= "viewClass"value= "org.springframework.web.servlet.view.JstlView"/>
<property name= "contentType" value= "text/html"/>
<property name= "prefix" value= "/WEB-INF/jsp/"/>
<property name= "suffix" value= ".jsp"/>
</bean>
五、视图解析器链
1、在Spring Web MVC中可以同时定义多个视图解析器,它们会组成一个视图解析器链。当Controller处理器方法返回一个逻辑视图名称后,视图解析器链将根据其中ViewResolver的优先级来进行处理。
2、优先级可以通过order属性来指定顺序。由于所有的ViewResolver都实现了Ordered接口,因此可以通过order属性来指定顺序的,默认都是最大值。order属性是Integer类型,order越小,优先级越高。
3、视图解析器链执行时,第一个进行解析的将是ViewResolver链中order值最小的那个 ,如果一个视图解析器在进行视图解析后返回的View对象是null的话就表示该视图解析器不能解析该视图,继续向下;如果返回不会null,就结束;当定义的所有视图解析器都不能解析该视图的时候,就会抛出一个异常。
Spring MVC的视图解析器的更多相关文章
- Spring MVC之视图解析器
Spring MVC提供的视图解析器使用ViewResolver进行视图解析,实现浏览器中渲染模型.ViewResolver能够解析JSP.Velocity模板.FreeMarker模板和XSLT等多 ...
- Spring MVC之视图解析器和URL-Pattern的配置方案
上期讲解了第一入门案例之后接下来了解一下视图解析器与URL-Pattern的配置方案 先来说视图解析器,在上次博客文章中我们完成了入门案例,接下来我们就在上一个例子中完善一下体出视图解析器 <? ...
- Spring MVC Xml视图解析器
XmlViewResolver用于在xml文件中定义的视图bean来解析视图名称.以下示例演示如何在Spring Web MVC框架使用XmlViewResolver. XmlViewResolver ...
- spring配置多视图解析器
最近做一个小项目(移动端),自己搭了个简单的SSM框架(spring + spring MVC + Mybitis),展示层本来选用的是jsp,各方便都已经搭建好,结果发现有些页面需要用到H5的一些功 ...
- spring boot 1.视图解析器,2.开启静态资源访问
1.spring boot 视图解析器 #视图解析器 #前缀spring.mvc.view.prefix=/pages/ #后缀..jsp.dospring.mvc.view.suffix=.jsp ...
- 学习SpringMVC——说说视图解析器
各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注 ...
- SpringMVC 视图和视图解析器&表单标签
视图和视图解析器 请求处理方法执行完成后,最终返回一个 ModelAndView 对象.对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它 ...
- 【SpringMVC】SpringMVC系列10之视图与视图解析器
10.视图与视图解析器 10.1.概述 请求处理方法执行完成后,最终返回一个 ModelAndView处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象, ...
- springmvc(六)——视图和视图解析器
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoIAAAGrCAIAAADb2WEhAAAgAElEQVR4nOzdaVhTd78vfF8/z772c9 ...
随机推荐
- Elasticsearch 索引实例
1.简述 ElasticSearch包含了一系列的感念,比如索引(indexing).搜索(search)以及聚合(aggregations),现在我们主要介绍indexing. 在Elasticse ...
- org.apache.hadoop.ipc.RemoteException: User: root is not allowed to impersonate root
修改 core-site.xml文件 vim /usr/local/hadoop/etc/hadoop/core-site.xml 增加: <property> <name>h ...
- zabbix自定义触发器
zabbix中监控项仅负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正式 用于为监控项所收集的数据定义阈值,每一个触发器 ...
- 解决ListView在界面只显示一个item
ListView只显示一条都是scrollview嵌套listView造成的,将listView的高度设置为固定高度之后,三个条目虽然都完全显示.但是这个地方是动态显示的,不能写死.故采用遍历各个子条 ...
- gitlab创建项目代码:
cd (当前工程文件夹目录) git init //初始化git git remote add origin http://worker.njbandou.com/KLElevator/kle ...
- DB门面,查询构建器,Eloquent ORM三者的CURD
一.DB门面 1.insert DB::insert('insert into table(`name`) value(?)', ['test']); 2.update DB::update('upd ...
- ionic2项目创建回顾 及 react-native 报错处理
ionic2: 1.创建项目: ionic start MyIonic2Project tutorial --v2 (下载 tutorial 模板来初始化项目) ionic start MyIonic ...
- python第一个web程序
例一: import web urls= ('/(.*)','index') app= web.application(urls,globals()) class index: def GET(sel ...
- Vue mixins extend
const mixins = { created () { console.log('mixins created') } } const mixins2 = { created () { conso ...
- 去掉input框后边的叉号
::-ms-clear, ::-ms-reveal { display: none; }在样式里加上这句话即可