spring mvc源码学习笔记之七

news/2025/1/13 5:34:09/

我们都知道,spring mvc 有处理器适配器、处理器映射器、视图解析器等几个非常重要的核心组件,学习 spring mvc 就是学习这些组件。
本文我们就来简单看下这些组件的默认值。

下面这段代码是从 DispatcherServlet 的源码中拷贝的

static {// Load default strategy implementations from properties file.// This is currently strictly internal and not meant to be customized// by application developers.System.out.println("静态代码块先执行。加载默认的策略。 DispatcherServlet.properties 这个文件的内容非常重要  ---> " +" 这东西是内部用的。不是给开发者拿去自定义的。 ");try {ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);for (Object o : defaultStrategies.keySet()) {System.out.println("DispatcherServlet.properties   ---> key: " + o + " 对应的 value 是 " + defaultStrategies.get(o));}}catch (IOException ex) {throw new IllegalStateException("Could not load '" + DEFAULT_STRATEGIES_PATH + "': " + ex.getMessage());}
}

首先需要注意的是:这段代码是在静态代码块里边的。也就是说,这段代码在加载类的时候就会自动执行了。
然后看下这段代码干了什么事儿:从属性文件(DEFAULT_STRATEGIES_PATH 也就是 DispatcherServlet.properties )中加载默认的策略。
再说的具体点,就是在静态代码块中读取配置文件 DispatcherServlet.properties ,将其中配置的信息存到静态变量 defaultStrategies 中,供后续初始化的策略的时候使用。
啥叫默认的策略,可以简单说下,就是处理器适配器、处理器映射器、视图解析器这些组件的默认值。
接下来就是看下配置文件 DispatcherServlet.properties 的内容了,如下:

# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolverorg.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolverorg.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappingorg.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterorg.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolverorg.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslatororg.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolverorg.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

这个配置文件最上边有一段说明文字。翻译一下:这个文件中的内容定义了 DispatcherServlet 策略接口的默认实现类。
当在 DispatcherServlet 对应的应用上下文中没有找到对应的 bean 的时候,这里边的这些类可用作兜底,也就是作为默认值。
最后一句可以理解为,你就用这里定义的默认实现类就行了,你作为一个应用开发者,不建议你去对这些东西进行自定义。
换句话说,你要是有本领,当然可以自定义了!

  • 第一个策略组件
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

LocaleResolver 这个东西是跟国际化相关的。默认值是 AcceptHeaderLocaleResolver,也就是根据请求头 Accept-Language 来决定给你用哪国语言。

  • 第二个策略组件
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

ThemeResolver 主题解析器。

  • 第三个策略组件
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping

HandlerMapping 处理器映射器。这个就非常重要了。它指定了2个值。BeanNameUrlHandlerMapping 这个我们一般很少用,想知道用法,可以百度下,比较简单。
RequestMappingHandlerMapping 这个重要,我们平时写的 @RequestMapping 就是这个东西来解析的。

  • 第四个策略组件
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter

HandlerAdapter 处理器适配器。这个也非常重要。它指定了3个值。同样,3个里边最重要也是最负责的就是 RequestMappingHandlerAdapter

  • 第五个策略组件
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

HandlerExceptionResolver 处理器异常解析器。忘了说了,一直说处理器映射器、处理器适配器、处理器异常解析器,还没说啥是处理器,其实就是我们写的 controller 。在 spring mvc 中,我们写的 controller 被叫做处理器,我们写在 controller 中的方法被叫做处理器方法 HandlerMethod。这里指定了3个值,都值得点进去看看源码。

  • 第六个策略组件
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
  • 第七个策略组件
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

ViewResolver 视图解析器。默认值是 InternalResourceViewResolver ,看源码的 javadoc 就知道他是用于支持 jsp 以及 jstl 的。这也就是为啥说 spring mvc 默认支持的视图技术是 jsp 了。

  • 第八个策略组件
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

FlashMapManager 这个是跟异步请求相关的。

最后,顺便说一嘴,网上讲 spring mvc 的课程,无不是重点讲 DispatcherServlet 的,这没毛病,博主想说的是,大家可以仔细看看 DispatcherServlet 这个类的成员变量(不管是静态的还是非静态的),看完你就对 spring mvc 有个大概了解了。


http://www.ppmy.cn/news/1562725.html

相关文章

pip工具安装第三方库

使用pipcmd引入第三方库 pip 是 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。 注意:pip 已内置于 Python 3.4 和 2.7 及以上版本,其他版本需另行安装 常规命令: pip install 安装第三方库的库名 &…

在UE5中使用视差贴图

视差贴图是一项不用改动模型顶点,通过对相机向量进行计算、修改通过视差实现模型凹凸感的技术,通常运用于地面,配合法线贴图增强凹凸表现。 UE中封装了视差贴图节点ParallaxOcclusionMapping,可以很方便的制作出效果较好的视差效…

Web前端界面开发

前沿:介绍自适应和响应式布局 自适应布局:-----针对页面1个像素的变换而变化 就是我们上一个练习的效果 我们的页面效果,随着我们的屏幕大小而发生适配的效果(类似等比例) 如:rem适配 和 vw/vh适配 …

幽默的人生

想当年,在高中那会儿,我就像被束缚的风筝,想飞却飞不高,做不了自己心爱的小发明,全被家人那句“好大学才是正道”给拽住了。但大学毕业后,嘿😎,我终于挣脱了束缚,可以自由…

有一台服务器可以做哪些很酷的事情

有一台服务器可以做哪些很酷的事情 今天我也来简单分享一下,这几年来,我用云服务器做了哪些有趣的事情。 服务器推荐 1. 个人博客 拥有个人服务器,你可以完全掌控自己的网站或博客。 与使用第三方托管平台相比,你能自由选择网站…

现代JavaScript开发

现代JavaScript开发 开发 代码的模块化,方便维护和复用。这些模块化可能是我们自己使用的模块也有可能第三方包;第三方包有都可以从npm中下载到(包含开源包,以便我们自己的代码中包含第三方代码,比如react、jQuery&a…

SVM赛道概览:MoveVM落地,SVM能走多远

Sonic SVM、SOON、Eclipse全方位解读。 作者:jk;编辑:郝方舟 出品 | Odaily星球日报(ID:o-daily) 随着高性能与可扩展性的需求愈发迫切,Solana Virtual Machine(SVM)正逐…

项目实战--网页五子棋(用户模块1)

接下来我将使用Java语言,和Spring框架,实现一个简单的网页五子棋。 主要功能包括用户登录注册,人机对战,在线匹配对局,房间邀请对局,积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …