探索SpringMVC-组件之ViewResolver

news2024/9/22 21:30:47

前言

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上下文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个想活得简单的程序猿的2022年终总结!

前言 今年的总结相比以往来说,可写的太少了,但看到我17年开始写的年终总结,已定下每年写下的承诺,因此即便可写的不多,但是还是写下吧,毕竟又过了一年,总有东西会留下! 今年事件 疫…

【Linux杂篇】Windows远程登陆Linux、Linux静态IP配置

前言 如果要长期连接Linux环境,就需要给Linux配置一个静态IP,否则可能每次连接的IP都不一样而且还很麻烦。 除此之外,我们使用ssh远程登录的时候,每次都要输入密码,也很麻烦,所以建议配置ssh密钥&#xff…

执行 java -jar xxx.jar 的时候底层到底做了什么?

大家都知道我们常用的 SpringBoot 项目最终在线上运行的时候都是通过启动 java -jar xxx.jar 命令来运行的。那你有没有想过一个问题,那就是当我们执行 java -jar 命令后,到底底层做了什么就启动了我们的 SpringBoot 应用呢?或者说一个 Sprin…

Redis删除了大量数据后,为什么内存占用还是很高?

前言 上周刚来了个应届小师弟,组长说让我带着,周二问了我这样一个问题:师兄啊,我用top命令看了下服务器的内存占用情况,发现Redis内存占用严重,于是我就删除了大部分不用的keys,为什么内存占用…

文件操作【C语言】

目录 一、为什么使用文件 二、什么是文件 1、程序文件 2、数据文件 3、文件名 三、文件的打开和关闭 1、文件指针 2、文件的打开和关闭 四、文件的顺序读写 五、文件的随机读写 1、fseek 2、ftell 3、rewind 七、文件读取结束的判定 1、被错误使用的feof 1、文…

unocss原子化

文章目录1. 安装2. 配置3. Unocss预设3.1 presetUno3.2 presetAttributify3.3 presetIcons了解什么是UnoCSS请看:重新构想原子化CSS - 知乎 github地址:UnoCSS UnoCSS搜索引擎 1. 安装 npm i -D unocss2. 配置 vite.config.ts import { defineConf…

分享微信抽奖小程序制作步骤_微信抽奖小程序怎么开发

各位商家在节日期间做活动的时候,都希望用更少的费用去或者更好的宣传和推广的效果。比较常见的就是抽奖活动小程序。无须玩家下载,通过微信扫码或者指定入口就可以参与。方便,效果又好。那么,性价比高的抽奖活动小程序怎么做? 来…

LabVIEW使用VI脚本重新排列对象

LabVIEW使用VI脚本重新排列对象VI脚本可用来重新排列前面板和程序框图的对象。该教程以程序框图对象重新排列为例。按照下列步骤,使用VI脚本重新排列程序框图对象。创建VI前,需先了解VI脚本的基本内容。必须启用VI脚本,才能显示VI脚本选板&am…

solr-cloud集群

Zookeeper集群搭建完成,下面开始构建solr-cloud从复制四个tomcat实例开始将配置好的单机版solr复制到tomcat实例下修改tomcat端口号vim tomcat01/conf/server.xmlvim tomcat02 /conf/server.xml使用配置好的单机版solrhome关联solr和solrhomevim tomcat01/webapps/s…

数据库系统概念 | 第三章:SQL介绍

文章目录📚SQL语言概览📚SQL数据定义🐇基本数据类型🐇基本模式定义🥕create table🥕create domain🥕drop table🥕delete table🥕alter table📚SQL查询的基本结…

Transformer模型详解

1. 前言 transformer结构是google在2017年的Attention Is All You Need论文中提出,在NLP的多个任务上取得了非常好的效果,可以说目前NLP发展都离不开transformer。最大特点是抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。 …

VESC操作入门——控制霍尔电机、无感电机和AS5047P

目录一、设备说明二、VESC4驱动霍尔电机2.1、硬件准备2.2、硬件连接2.3、打开软件2.4、连接2.5、校准电机2.6、主界面操作三、VESC4驱动无感电机3.1、硬件准备3.2、硬件连接3.3、打开软件3.4、校准电机四、VESC4驱动AS5047P4.1、软硬件修改4.2、硬件准备4.3、硬件连接4.4、校准…

Win32解决透明字体改变时重叠的问题,GetClientRect与GetWindowRect的使用

透明字体,改变时发生文本重叠,解决办法是刷新窗体局部区域,该区域是文本或者按钮等控件的区域 Win32 API中使用InvalidateRect函数使指定区域失效,意味着要刷新该区域,再用UpdateWindow函数强迫窗体立即刷新 RECT rc; ... InvalidateRect(hWnd,&rc,true); UpdateWind…

Python操作文件及其内容的常用方式

Python操作文件及其内容的常用方式 文章目录Python操作文件及其内容的常用方式1:修改文件名1.1:修改指定文件名1.2:修改目录下的所有文件的文件名2:读取文件2.1:读取文件内容2.1.1:按行读取2.1.2&#xff1…

[Arduino]环境安装与配置

最近着迷与Arduio,可以连接控制各种器件帮助人类降低负担,如室内外温度动态采集、声控灯、自动给绿植浇水等各种应用,感觉挺有意思;随着最近两年物联网的推广及“万物互联”的普及,个人觉得物联网还是有点花样的&#…

认证授权功能分析

1 模块需求分析 1.1 什么是认证授权 截至目前,项目已经完成了课程发布功能,课程发布后用户通过在线学习页面点播视频进行学习。如何去记录学生的学习过程呢?要想掌握学生的学习情况就需要知道用户的身份信息,记录哪个用户在什么…

1949-2020年各省全要素生产率(年度)

1949-2020年各省全要素生产率(年度) 1、时间:1949-2020年 2、计算说明:产出为实际GDP,投入要素为从业人员数、固定资产(永续盘存法) 3、范围:包括31省 4、指标说明: 全要素生产率&#xf…

TiCDC 源码阅读(三)TiCDC 集群工作过程解析

内容概要 TiCDC 是一款 TiDB 增量数据同步工具,通过拉取上游 TiKV 的数据变更日志,TiCDC 可以将数据解析为有序的行级变更数据输出到下游。 本文是 TiCDC 源码解读的第三篇,主要内容是讲述 TiCDC 集群的启动及基本工作过程,将从…

MSR 5660设备进行流量整形和带宽保证的实现案例

组网及说明现场客户使用MSR5660设备替换客户处原有华为的设备,之前华为的设备做了GTS流量整形和WFQ的带宽保证,需求见下面图片描述配置步骤一、针对G1/0/1口入方向进行本地优先级的映射:(1)对进入设备G1/0/1口的流量进…

机器学习(二):人工智能发展历程

文章目录 人工智能发展历程 一、人工智能的起源 1、图灵测试 2、达特茅斯会议 二、发展历程 人工智能发展历程 一、人工智能的起源 1、图灵测试 测试者与被测试者(一个人和一台机器)隔开的情况下,通过一些装置(如键盘&…