请求处理方法执行完成后,最终返回一个 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 作为视图解析器:

Excel 视图

若希望使用 Excel 展示数据列表,仅需要扩展 SpringMVC 提供的 AbstractExcelView 或 AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以 了。

AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。

视图对象需要配置 IOC 容器中的一个 Bean,使用 BeanNameViewResolver 作为视图解析器即可

若希望直接在浏览器中直接下载 Excel 文档,则可以设置 响应头 Content-Disposition 的值为 attachment;filename=xxx.xls

三、重定向和转发

①、一般情况下,控制器方法返回字符串类型的值会被当成逻 辑视图名处理

②、如果返回的字符串中带 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) throwsException {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 newInternalResourceView(forwardUrl);

}else{return super.createView(viewName, locale);

}

}

}

java 视图解析器_SpringMVC——视图和视图解析器相关推荐

  1. jsp springmvc 视图解析器_Springmvc中多视图解析器解析问题

    最近被问到过几次关于springmvc多视图解析器解析的问题:总结一下. 1.问题: 假设我有两个jsp: WEB-INF/html/a.jsp WEB-INF/report/b.jsp 且我配置了视 ...

  2. springmvc如何使用视图解析器_SpringMVC的工作原理

    SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMapp ...

  3. jsp springmvc 视图解析器_SpringMVC学习笔记

    Springmvc springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合. springmvc是一个基于mvc的web框架. 基本概念和执行过程 ...

  4. springmvc如何使用视图解析器_SpringMVC工作原理

    SpringMVC工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMappi ...

  5. springmvc视图解析器_SpringMVC视图及REST风格

    什么是视图解析器? springMVC用于处理视图最重要的两个接口是ViewResolver和View. ViewResolver的主要作用是把一个逻辑上的视图名称解析成一个真的的视图,而Spring ...

  6. jsp springmvc 视图解析器_SpringMVC工作原理

    SpringMVC的工作原理图: SpringMVC流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherServlet收到请求调用HandlerMapp ...

  7. SwiftUI之深入解析如何创建列表展示视图和列表如何导航跳转新页面

    一.前言 地标详情页视图已经创建完成,我们需要提供一种方式让用户可以查看完整的地标列表,并且可以查看每一个地标的详情.地标详情页视图的创建,请参考我的博客:SwiftUI之深入解析如何创建和组合视图. ...

  8. java查看sql视图_数据库的查询与视图

    第4章 数据库的查询和视图 4.1.1 选择列 通过SELECT语句的项组成结果表的列. ::= SELECT [ ALL |DISTINCT ] [ TOP n [ PERCENT ] [ WITH ...

  9. SwiftUI之深入解析如何创建和组合视图

    一.创建项目并体验画布 ① 系统要求 创建 SwiftUI 项目工程,体验画布.预览模式和 SwiftUI 模板代码: 要想在 Xcode 中预览画布中的视图,或者与画布中的视图进行交互,需要 Mac ...

最新文章

  1. 执行游戏时出现0xc000007b错误的解决方法
  2. Windows环境下多个tomcat启动,CATALINA_HOME配置(大坑)
  3. Git学习总结(14)——Git使用前的注意事项
  4. java list实现九九乘法表梯形_JavaScript实现梯形乘法表的方法
  5. 经典排序算法 - 耐心排序Patience Sorting
  6. Thinkphp新增字段无法插入到数据库问题
  7. ruby 基础知识(一)
  8. clickhouse: A股bar数据与物化视图尝试
  9. 峰度的意义_李德荃关于偏度与峰度的讲解
  10. Mac安装port(port:command not found解决办法)
  11. python:实现牛顿法算法(附完整源码)
  12. html5星空效果图,HTML5 canvas炫酷星空背景特效
  13. python3计算md5_python 计算文件的md5值实例
  14. centos7是linux内核,在CentOS 7上用源代码编译最新的Linux内核
  15. 【C++面试宝典】C++11新特性知识总结
  16. HTML常用基础知识归纳
  17. 2017年搜狗校招Java研发笔试编程题
  18. C语言程序设计#成绩查询系统
  19. Babylongjs-高度图,天空盒,图片精灵及K帧动画
  20. 接口测试之代码实例21讲--附录2电商系统设计

热门文章

  1. ROS开发时的服务器启动命令
  2. mysql判断是否为null_MySQL如何判断字段是否为null
  3. oracle标量子查询的优势,标量子查询
  4. 扫地机器人返充原理_扫地机器人全解析
  5. 博达3956交换机配置手册_网络设备维保浅谈之交换机维保
  6. plsql视图添加表字段_Oracle-单表多字段查询(不使用*)
  7. 请给出计算231-1的python表达式_【填空题】计算2 32 -1的Python表达式可以书写为____...
  8. Xtrabackup备份与恢复
  9. 谈谈我对MYSQL乱码的解决办法
  10. 猫哥教你写爬虫 005--数据类型转换-小作业