1、认识视图(View)
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户端。视图对象可以是常见的JSP,还可以是Excel或PDF等形式不一的媒体。为了实现视图模型和具体实现技术的解耦,Spring在org.springframework.web.servlet包中定义了一个抽象的View接口,该接口定义了两个方法:
- String getContentType():视图对应的MIME类型,如text/html,image/jpeg等等;
- void render(Map model,HttpServletRequest request,HttpServletResponse response):将模型数据以某种MIME类型渲染出来。
视图对象是一个Bean,通常情况下,视图对象由视图解析器负责实例化。由于视图Bean是无状态的,所以它们不会有线程安全的问题。
不同类型的视图实现技术对应不同的View实现类,这些视图实现类都位于org.springframework.web.servlet.view的包中
View视图实现类
Url资源视图:
InternalResourceView: 将jsp获取其他资源封装成一个视图,这是InternalResourceViewResovler视图解析器默认使用的视图实现类
JstlView:如果jsp文件中使用到了jstl国际化标签的功能,则需要使用该视图类,而非InternaleResourceView视图类
XSTL视图:
XstlView :XSTL驱动的视图
Tiles视图:
TilesView :基于Tiles页面布局的视图
TilesJstlView:如果Tiles模板的jsp组成文件中使用到了jstl,需要使用该视图替换TilesView
文档视图:
AbstractExcelView : Excel文档视图的抽象类,开发者可以通过该抽象类实现自己的Excel文档视图。该实现类基于POI构造Excel文档
AbstractJExcelView:和Abstract类似,只不过它是基于JExcelApi实现的.
AbstractPdfStamperView: PDF文档视图的抽象类,通过AcroForm技术对PDF文档进行操作
AbstractPdfView:PDF文档视图的抽象类,可以通过该抽象类实现自己的PDF文档视图。该视图实现类基于iText构造的PDF文档。
模板视图:
FreeMarkerView:使用FreeMarker模板引擎的视图
VelocityLayOutView、VelocityToolBoxView、VelocityView:几个使用Velocity模板引擎的视图
报表视图:
ConfigurableJasperReportsView
JasperReportsCsvView
JasperReportsHtmlView
JasperReportsMultiFormatView
JasperReportsPdfView
JasperReportsXlxView
几个使用JasperReport报表技术的视图
XML和JSON视图:
MarshallingView:通过oxm的Marshaller技术将模型数据以XML方式输出
MappingJacksonJsonView:将模型数据通过Jackson开源框架的ObjectMapper以JSON方式输出
其他视图:
RedirectView:进行重定向的视图,可以重定向到上下文的绝对路径或相对路径下,也可以重定向到当前请求的相对路径下。
2、认识视图解析器(ViewResolver)
SpringMVC为逻辑视图名的解析提供了不同的策略,可以在Spring Web上下文中配置一种或多种视图解析器,并指定它们之间的先后顺序。视图解析器的工作比较单一:将逻辑视图名解析为一个具体的视图对象。所有视图解析器都实现了ViewResolver接口,该接口仅有一个方法:
- View resolverViewName(String viewName,Locale locale)
resolverViewName()的签名清楚地向我们传达了视图解析器的工作含义:根据逻辑视图名和本地化对象得到一个视图对象。Spring拥有众多的视图解析器实现类。
视图解析器实现类
解析为Bean名字:
BeanNameViewResolver :将逻辑视图名解析为一个Bean,Bean的id等于逻辑视图名。
XmlViewResolver:和BeanNameViewResolver类似,只不过目标视图Bean对象定义在一个独立的XML文件中,而非定义在DispatcherServlet上下文的主配置文件中
国际化解析:
ResourceBundleViewResolver:在国际化资源文件中定义视图实现类以及相关的信息。使用该视图解析器可以为不同本地化类型提供不同的解析结果。解析为URL文件:
InternalResourceViewResovlver:将视图名解析为一个URL文件,一般使用该解析器将视图名映射为保存在WEB-INF目录中的程序文件(如JSP)
XsltViewResolver:将视图名解析为一个指定XSLT样式表的URL文件
JasperReportsViewResolver:JasperReports是一个基于java的开源报表工具,该解析器将视图名解析为报表文件对应的URL
模板文件视图:
FreeMarkerViewResolver:解析为基于FreeMarker模板技术的模板文件
VelocityViewResolver和VelocityLayoutViewResolver:解析为基于Velocity模板技术的模板文件
内容协商:
ContentNegotiatingViewResolver:该解析器不负责具体的视图解析,而是作为一个中间人的角色根据请求所要求的MIME类型,从上下文中选择一个适合的视图解析器,再将视图解析工作委托其负责
用户可以选择一种或多种视图解析器或混合多种视图解析器,每个视图解析器都是些了Ordered接口并开放出一个orderNo的属性,可以通过orderNo属性指定解析器的优先顺序,orderNo的值越小优先级越高。有些视图解析器默认为最高(如ContentNegotiatingViewResolver),而有些视图解析器默认为最低(如InternalResourceViewResolver、XsltViewResolver等)
SpringMVC会按照视图解析器的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。