探索SpringMVC-组件之ViewResolver

前言

ViewResolver也就是视图解析器,他将是我们《探索SpringMVC》系列要介绍的最后一个常用的组件。其他组件:MultipartResolver、LocaleResolver、ThemeResolver、RequestToViewNameTranslator、FlashMapManager,相对简单,大家可以自行了解。

ViewResolver

我们知道视图技术有很多种,例如:JSP、FreeMarker、Thymeleaf等。如果直接操作这些技术,那简直不要太糟糕。为了统一操作,SpringMVC抽象出来两个接口:ViewResolver和View。任何视图技术都需要实现这两个接口。

Spring源码中的定义

  • ViewResolver,即视图解析器,可以通过将viewName解析为View。
  • View,即视图,是Web交互的MVC的View。他的实现者负责渲染内容、暴露Model。(所谓暴露model,其实就是把model数据在页面中展示)

从上述定义,视图解析器需要创建View。而这意味着两个重要使命实例化初始化。实例化,当然是创建对应的View实现对象。而初始化则负责将View与对应的实现技术进行绑定/衔接。

与视图技术的衔接

前面我们知道View才是真正渲染页面内容的,这意味着View才是视图技术的真正操作者。因此必须通过某种手段获得响应的配置或者重要的组件。而Spring提供的是WebApplicationObjectSupport。不管是ViewResolver,还是View都是基于该抽象类来实现获取ApplicationContext。

Spring的设计

为了便于各个视图技术厂商对接,Spring实际上构建了一套完整的体系(一系列抽象实现类),按需实现。
FreeMarkerViewResolver
这里重点提一下

  • UrlBaseViewResolver#applyLifecycleMethods
    这个方法是初始化View的关键方法,他通过ApplicationContext获取到AutowireCapableBeanFactory,并且直接调用其initializeBean方法进行初始化。而该方法就是我们bean生命周期中的关键方法,包括:Aware接口、BeanPostProcessor、InitializingBean都是由他负责。

FreeMarker的实现

前面我们说了,WebApplicationObjectSupport是重要的初始化接口。同样我们也说,是按需实现。

FreeMarkerViewResolver
从上面的类图看,FreeMarkerViewResolver似乎并没有使用到这个接口,但是其父类UrlBaseViewResolver使用到了。UrlBaseViewResolver通过WebApplicationObjectSupport才能获取到ApplicationContext。才有了后面对FreeMarkerView的初始化。

FreeMarkerView
通过该WebApplicationObjectSupport实现了与FreeMarker的衔接。

重点方法:

  • FreeMarkerView#initServletContext
    这个方法实际上是Aware接口扩展过来的,因此会被前面说的UrlBaseViewResolver#applyLifecycleMethods调用到。这里会通过ApplicationContext获取到FreeMarkerConfig。该类是SpringMVC与Freemarker衔接的类,他会持有FreeMarker的Configuration对象。通过Configuration对象,就能获得FreeMarker的Template类。
  • FreeMarkerView#buildTemplateModel
    该方法将Model转换为FreeMarker要求的数据格式。
  • FreeMarkerView#processTemplate
    该方法则是实际调用FreeMarker的Template,通过HttpServletResponse将视图渲染并响应了。

想看源码的同学,这里送一张简化版调用流程图
在这里插入图片描述
注意,该图不涉及分支流程,例如:缓存逻辑、重定向逻辑。

总结

  1. Spring为了统一视图技术的操作,抽象了ViewResolver和View。并提供了许多抽象接口,以便不同的视图技术进行实现。
  2. UrlBaseViewResolver通过WebApplicationObjectSupport获取到ApplicationContext对AbstractUrlBasedView进行初始化。AbstractUrlBasedView则通过InitializingBean实现对View的url进行校验。
  3. FreeMarkerView通过WebApplicationObjectSupport从容器中获取FreeMarkerConfig,实现与FreeMarker的衔接。

后记

ViewResolver相对简单。但我们重点要学会设计思想。SpringMVC设计了一层中间层,做了一层接口转换,换取统一接口、统一操作的便利,以及更多的扩展可能。
下一次,我们终于回到了DispatcherServlet了。忘记的同学,可以回去看看。

上一篇:
探索SpringMVC-组件之HandlerExceptionResolver
第一篇:
探索SpringMVC-web上下文
下一篇:
探索SpringMVC-DispatcherServlet

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值