SpringMVC——视图和视图解析器
- 请求处理方法执行完成后,最终返回一个 ModelAndView对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图
- Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart 等各种表现形式的视图
- 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦
一、视图
- 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客 户。
- 为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View 接口:
- 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们 不会有线程安全的问题
常用的视图实现类
视图实现类 | 说明 |
---|---|
InternalResourceView | 将jsp或其他资源封装成一个视图,这是InternalResourceViewResolver解析成的视图 |
JstlView | 如果jsp文件中需要用到JSTL国际化标签功能,则需要使用该视图类,而非InternalResourceView视图类 |
XsltView | XSTL驱动的视图 |
TilesView | 基于Tiles页面布局的视图 |
TilesJstlView | 如果Tiles模版的jsp组成文件使用到了JSTL了,则需要用该视图替换TilesView |
AbstractExcelView | Excel视图抽象类,开发者需要继承AbstractExcelView,获取视图模型进行填充,实现自己的文档视图,需要依赖POI |
AbstractJExcelView | 和AbstractExcelView只不过他是依赖JExcelAPI |
AbstractPdfStamperView | PDF文档视图抽象类,通过AcroForm对PDF文档进行操作 |
AbstractPdfView | PDF文档视图抽象类,可以通过该抽象类实现自己的PDF文档视图,依赖iText |
FreeMarkView | 使用FreeMark模版引擎的视图 |
VelocityLayoutView | 使用Velocity模版引擎的视图 |
VelocityView | 使用Velocity模版引擎的视图 |
ConfigurableJasperReportsView | 使用java JasperReports报表技术的视图 |
JasperReportsCsvView | 使用java JasperReports报表技术的视图 |
JasperReportsHtmlView | 使用java JasperReports报表技术的视图 |
JasperReportsMultiFormatView | 使用java JasperReports报表技术的视图 |
JasperReportsPdgView | 使用java JasperReports报表技术的视图 |
JasperReportsXlsView | 使用java JasperReports报表技术的视图 |
MarshallingView | 通过oxm和Marshaller技术将模型数据以xml方式输出 |
MappingJackson2JsonView | 将模型数据通过Jackson开发框架的ObjectMapper已JSON方式输出 |
MappingJackson2XmlView | 将模型数据通过Jackson开发框架的ObjectMapper已XML方式输出 |
redirectView | 通过redirect:和forword:前缀进行重定向的视图 |
二、视图解析器
- SpringMVC 为逻辑视图名的解析提供了不同的策略,可 以在 Spring WEB 上下文中配置一种或多种解析策略,并 指定他们之间的先后顺序。每一种映射策略对应一个具体 的视图解析器实现类。
- 视图解析器的作用比较单一:将逻辑视图解析为一个具体 的视图对象。
- 所有的视图解析器都必须实现 ViewResolver 接口
常用的视图解析器
视图解析器实现类 | 说明 |
---|---|
beanNameViewResolver | 常用,将视图名解析为一个bean,视图名是bean的id |
XmlViewResolver | 和beanNameViewResolver类似,它和beanNameViewResolver的区别是bean的定义是放在xml文件中,而不是DispatchServert的配置文件中 |
ResourceBundleViewResolver | 可以利用该类为不同本地化类型提供不同的解析结果 |
InternalResourceViewResolver | 常用,一般通过该类配置前缀和后缀,然后解析为一个URL文件,例如jsp页面,解析优先级最低 |
XsltViewResolver | 将视图名解析为一个指定的XSLT样式表的URL文件 |
JasperReportsViewResolver | JasperReports是一个基于java的开源报表工具,该解析器将视图名解析为报表文件对应的路径 |
FreeMarkerViewResolver | 解析基于FreeMarker模版技术的模版文件 |
VelocityViewResovler, VelocityLayoutViewResovler | 解析为基于Velocity模版技术的模版文件 |
ContentNegotiatingViewResovler | 常用,内容协商视图解析器,它不负责具体的视图解析,而且根据请求的媒体类型,从注册的视图解析器中选择一个合适的解析器来将视图解析,解析优先级最高 |
程序员可以选择一种视图解析器或混用多种视图解析器
- 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。
- SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解 析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常
InternalResourceViewResolver
JSP 是最常见的视图技术,可以使用 InternalResourceViewResolver 作为视图解析器:
<!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
<!--该视图的优先级为Integer的最大值-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
Excel 视图
若希望使用 Excel 展示数据列表,仅需要扩展 SpringMVC 提供的 AbstractExcelView 或 AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以 了。
- AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。
- 视图对象需要配置 IOC 容器中的一个 Bean,使用 BeanNameViewResolver 作为视图解析器即可
- 若希望直接在浏览器中直接下载 Excel 文档,则可以设置 响应头 Content-Disposition 的值为 attachment;filename=xxx.xls
<!-- 配置视图 BeanNameViewResolver 解析器: 使用视图的名字来解析视图 -->
<!-- 通过 order 属性来定义视图解析器的优先级, order 值越小优先级越高 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
三、重定向和转发
①、一般情况下,控制器方法返回字符串类型的值会被当成逻 辑视图名处理
②、如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:
将 forward: 和 redirect: 当成指示符,其后的字符串作为 URL 来处理
- redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
- forward:success.jsp:会完成一个到 success.jsp 的转发操作
org.springframework.web.servlet.view.UrlBasedViewResolver.class
protected View createView(String viewName, Locale locale) throws Exception {
if(!this.canHandle(viewName, locale)) {
return null;
} else {
String forwardUrl;
if(viewName.startsWith("redirect:")) {
forwardUrl = viewName.substring("redirect:".length());
RedirectView view = new RedirectView(forwardUrl,
this.isRedirectContextRelative(),
this.isRedirectHttp10Compatible());
return this.applyLifecycleMethods(viewName, view);
} else if(viewName.startsWith("forward:")) {
forwardUrl = viewName.substring("forward:".length());
return new InternalResourceView(forwardUrl);
} else {
return super.createView(viewName, locale);
}
}
}
SpringMVC——视图和视图解析器的更多相关文章
- SpringMVC听课笔记(六:视图和试图解析器)
1.spring mvc解析视图 2. 视图和视图解析器 3. 视图 4.常用的视图类 5.视图解析器 1) 2) 3) 4)JSTL 需要注意的是,配置了mvc:view-controller,为 ...
- SSM-SpringMVC-23:SpringMVC中初探异常解析器
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客要讲的是异常解析器,SimpleMappingExceptionResolver简单映射异常解析器 可 ...
- springmvc中的页面解析器ViewResolver不起作用,变量输出字符串的解决方案
<web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"> <servlet> <servlet ...
- springmvc html与jsp解析器
1. 配置多个视图解析器 InternalResourceViewResolver内置了jsp解析器,用于解析jsp页面 此处我们使用了InternalResourceViewResolver,其有一 ...
- springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数
http://blog.csdn.net/truong/article/details/30971317 http://blog.csdn.net/fytain/article/details/439 ...
- Spring MVC的多视图解析器配置及与Freemarker的集成
一.从freemarker谈起 Freemarker使用模板技术进行视图的渲染.自从看了Struts标签.Freemarker.JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差…… S ...
- 一步一步自定义SpringMVC参数解析器
随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...
- DRF之频率限制、分页、解析器和渲染器
一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...
- rest-framework之解析器
解析器 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有application/json,x-www-form-urlencoded,form-data等 ...
- drf8 解析器
解析器的介绍 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的数据进行解析. Accept与ContentType请求头. Accept是告诉 ...
随机推荐
- 洛谷 P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver
传送门 题目大意: n个谷仓 ,每次关闭一个谷仓,问剩下没被关闭的谷仓是 否联通. 题解:并查集+倒序处理 代码: #include<iostream> #include<cstdi ...
- springmvc中拦截器与springmvc全局异常处理器的问题
最近在做一个练手的小项目, 系统架构中用了springmvc的全局异常处理器, 做了系统的统一异常处理. 后来加入了springmvc的拦截器, 为了一些需求, 在拦截器中的 preHandle 方法 ...
- iconfont阿里字体图标的使用方法
我们在做web项目的时候,之前比较常用的是bootstrap,所以使用font awesome字体图标比较多,无意中在一个项目中接触到了iconfont,发现想要的什么图标都有,还可以自定义图标,非常 ...
- STM32高级定时器用于普通定时,定时周期变长
最近在用stm32定时器控制步进电机,由于普通定时器不够用,只能把TIM1当普通定时器用,我随手就把普通定时器的代码搬过去. void cs_Timer_Init(void) //TIM1 us级 { ...
- Use the dkms from EPEL when install CUDA Toolkits on CentOS
###Use the dkms from EPEL. yum install epel-release yum install dkms # download the rpm from the NVi ...
- Java并发--CountDownLatch CyclicBarrier ReentrantLock
CountDownLatch CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行.CountDownLatch使用一个数字count初始化,使 ...
- php读取文件夹文件,清理文件
// 获取文件夹中图片的数量和名称 public function show_tmp_file() { $handler = opendir('./tmp/');//当前目录中的文件夹下的文件夹 $c ...
- 安卓端后台登录接口单元测试demo
package com.js.ai.modules.pointwall.interfac; import java.io.IOException; import java.io.Unsupported ...
- 16c550芯片编写的优化
参考了 <Altera FPGA/CPLD 设计>高级篇, 关于状态机的推荐写法实现的功能是一样的但是编译使用的逻辑门如下图: 下图是我自己编的状态机需要的逻辑: 下图是使用推荐的有限状态 ...
- PHP操作Redis(一) PHP连接Redis,含Redis密码验证、指定某一Redis数据库
台服务器上都快开启200个redis实例了,看着就崩溃了.这么做无非就是想让不同类型的数据属于不同的应用程序而彼此分开. 那么,redis有没有什么方法使不同的应用程序数据彼此分开同时又存储在相同的实 ...