浅谈SpringMVC中的视图(View)和视图解析器(ViewResolver)

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模板引擎的视图

VelocityLayOutViewVelocityToolBoxViewVelocityView:几个使用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模板技术的模板文件

VelocityViewResolverVelocityLayoutViewResolver:解析为基于Velocity模板技术的模板文件

内容协商:

ContentNegotiatingViewResolver:该解析器不负责具体的视图解析,而是作为一个中间人的角色根据请求所要求的MIME类型,从上下文中选择一个适合的视图解析器,再将视图解析工作委托其负责


     用户可以选择一种或多种视图解析器或混合多种视图解析器,每个视图解析器都是些了Ordered接口并开放出一个orderNo的属性,可以通过orderNo属性指定解析器的优先顺序,orderNo的值越小优先级越高。有些视图解析器默认为最高(如ContentNegotiatingViewResolver),而有些视图解析器默认为最低(如InternalResourceViewResolver、XsltViewResolver等)

     SpringMVC会按照视图解析器的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出ServletException异常。

猜你喜欢

转载自blog.csdn.net/pingweicheng/article/details/80559200
今日推荐