• 请求处理方法执行完成后,最终返回一个 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——视图和视图解析器的更多相关文章

  1. SpringMVC听课笔记(六:视图和试图解析器)

    1.spring mvc解析视图 2.  视图和视图解析器 3. 视图 4.常用的视图类 5.视图解析器 1) 2) 3) 4)JSTL 需要注意的是,配置了mvc:view-controller,为 ...

  2. SSM-SpringMVC-23:SpringMVC中初探异常解析器

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客要讲的是异常解析器,SimpleMappingExceptionResolver简单映射异常解析器 可 ...

  3. springmvc中的页面解析器ViewResolver不起作用,变量输出字符串的解决方案

    <web-app xmlns:web="http://xmlns.jcp.org/xml/ns/javaee"> <servlet> <servlet ...

  4. springmvc html与jsp解析器

    1. 配置多个视图解析器 InternalResourceViewResolver内置了jsp解析器,用于解析jsp页面 此处我们使用了InternalResourceViewResolver,其有一 ...

  5. springMVC使用HandlerMethodArgumentResolver 自定义解析器实现请求参数绑定方法参数

    http://blog.csdn.net/truong/article/details/30971317 http://blog.csdn.net/fytain/article/details/439 ...

  6. Spring MVC的多视图解析器配置及与Freemarker的集成

    一.从freemarker谈起 Freemarker使用模板技术进行视图的渲染.自从看了Struts标签.Freemarker.JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差…… S ...

  7. 一步一步自定义SpringMVC参数解析器

    随心所欲,自定义参数解析器绑定数据. 题图:from Zoommy 干货 SpringMVC解析器用于解析request请求参数并绑定数据到Controller的入参上. 自定义一个参数解析器需要实现 ...

  8. DRF之频率限制、分页、解析器和渲染器

    一.频率限制 1.频率限制是做什么的 开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用. 2.频率组件原理 DRF中的频率控制基本原理是基于访问次数和时间的,当然我们可以通 ...

  9. rest-framework之解析器

    解析器 解析器的作用 根据请求头 content-type 选择对应的解析器对请求体内容进行处理. 有application/json,x-www-form-urlencoded,form-data等 ...

  10. drf8 解析器

    解析器的介绍 解析器的作用就是服务端接收客户端传过来的数据,把数据解析成自己想要的数据类型的过程. 本质就是对请求体中的数据进行解析. Accept与ContentType请求头. Accept是告诉 ...

随机推荐

  1. Info.plist字段列表详解

    常用字段: 1.获取版本信息: NSDictionary*infoDic = [[NSBundle mainBundle] infoDictionary]; NSString *localVersio ...

  2. 列表推导式,两个for循环的例子

    [a for a in alist for b in blist if a>b] for i in alist,blist: print(i) >>  alist[] >> ...

  3. Cocoapods的操作

    1.卸载Cocoapods命令: sudo gem uninstall cocoapods 2.安装Cocoapods的命令: >安装最新版本 sudo gem install cocoapod ...

  4. 【android】Socket简单用法

    Socket通常也称做”套接字“,用于描述IP地址和端口,废话不多说,它就是网络通信过程中端点的抽象表示.值得一提的是,Java在包java.net中提供了两个类Socket和ServerSocket ...

  5. (转)Android 中LocalBroadcastManager的使用方式

    发表于2个月前(2014-11-03 22:05)   阅读(37) | 评论(0) 0人收藏此文章, 我要收藏 赞0 1月10日 #长沙# OSC 源创会第32期开始报名 摘要 android中广播 ...

  6. WinForm Flicker闪屏解决方案

    开发WinForm 程序时经常会遇到闪屏的问题,这会给用户造成很差的使用体验,所以必须妥善解决好这个问题. 首先,我们先要找出闪屏的原因,就我目前遇到的问题而言,其原因真是五花八门. 主要的原因有:使 ...

  7. AIX rcp跨主机远程

    rcp用途:在本地主机和远程主机之间或者两个远程主机之间传输文件.详细用法可man rcp查看. 现在要把主机10.200.5.200的/tmp/work.sh(属主为root用户)拷贝到远程主机18 ...

  8. WIN10运行软件,窗口不显示(移动到屏幕外无法复原)的解决办法 Lebal:bug10解决方案

    双显示器切换回单显示器的时候,可能会遇到窗口移动到屏幕外不显示的情况 像这样虽然有缩略图但是点击无反应,并且平铺窗口也不管用,这个时候单击该窗口,Alt+space 执行最小化以及最大化操作即可复原

  9. 1138 Postorder Traversal

    题意:给出二叉树的前序序列后中序序列,输出其后序序列的第一个值. 思路:乍一看不就是前序+中序重建二叉树,然后后序遍历嘛!这么做当然不会有错,但是却没有真正领会本题的意图.本题并不是让我们输出后序序列 ...

  10. Invalid byte tag in constant pool: 19

    环境: windows 2008 server R2   ; tomcat 8.5.3 ;   jdk-1.8.0_91 故障截图: 报的就是 Invalid byte tag in constant ...