SpringMVC静态资源处理源码分析

本文详细分析了SpringMVC处理静态资源的流程,从DispatcherServlet开始,介绍了SimpleUrlHandlerMapping如何管理静态资源,重点讲解了resourceHandlerMapping和addResourceHandlers方法。SpringMVC默认的静态资源位置为/resources/, /static/, /public/,可以通过配置改变路径。同时,文章还提醒了读者注意区分SpringMvc视图解析、静态资源urlPattern和静态资源目录位置的配置差异。" 114495609,10536926,自定义Element-Table无数据提示,"['前端开发', 'Vue', 'Element-UI']
摘要由CSDN通过智能技术生成

概述

当我们在浏览器发起一个请求时,例如http://xxxx/home 跟http://xxxx/home.html时,后者会直接访问到相应的资源,而前者则会走Controller处理逻辑,最后再经过视图渲染(详情见:SpringMVC视图View解析源码分析)返回视图真正的资源,那么这其中的差别是什么?是哪里的代码来分别处理了这种不同的请求的?资源放置的位置又应该在哪里?
这一系列的问题在接下来的源码分析中将会得到解答。

请求处理流程

所有的被SpringMVC管理的资源在请求处理流程上首先都是通过DispatcherServlet,然后在这个servlet中获取Handler,然后再获取handlerAdapter,最后调用到真正的handler或者资源。这一块的详情逻辑可以查看:SpringMVC从配置初始化到HTTP请求全流程解析,这里就不再累述这个过程,我们直接进入代码的关键点DispatcherServlet->getHandler。

	@Nullable
	protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
   
		if (this.handlerMappings != null) {
   
		    /***普通的Controller请求与静态资源请求处理的不同点就再这个地方被分开
		    即:根据request匹配到的Handler是不同的。***/
			for (HandlerMapping mapping : this.handlerMappings) {
   
				HandlerExecutionChain handler = mapping.getHandler(request);
				if (handler != null) {
   
					return handler;
				}
			}
		}
		return null;
	}

根据Debug代码发现:在handlerMappings列表里面依次有RequestMappingHandlerMapping, BeanNameHandlerMapping,SimpleUrlHandlerMapping。对于第一个我相信大家都不陌生,它就是处理Controller请求的入口,第二个很少会用到可以先不管,而最后一个就是帮助我们处理静态资源的HandlerMapping,因为静态资源是基于URL,所以统一由它来管理并返回对应的Handler. handlerMappings的初始化是在ApplicationContext中获取所有的实现了HandlerMapping的bean,所以我们可以预见到SimpleUrlHandlerMapping会在SpringMVC的某个配置类中被注入到Spring的容器中。 那么按照SpringMVC的配置风格,所有的配置应该会在WebMvcAutoConfiguration中完成,按照这个思路最终整理得到如下的类关系图。

类图
在WebMvcConfigurationSupport中通过resourceHandlerMapping()方法配置并返回了HandlerMapping(这里其实就是SimpleUrlHandlerMapping),而该方法依赖于addResourceHandlers() 注入进来的handler。addResourceHandlers的具体实现是由DelegatingWebMvcConfiguration实现的,而它委托于WebMvcConfigurerComposite来完成用户自定义的resourceHandler配置,用户自定义配置之一就是WebMvcAutoConfigurationAdapter。
所以总结一下静态资源配置最核心的两个方法就是WebMvcConfigurationSupport中的resourceHandlerMapping和WebMvcAutoConfigurationAdapter中的addResourceHandlers。接下来进行代码分析。

代码分析

	@Bean
	@Nullable
	public HandlerMapping resourceHandlerMapping(
			@Qualifier("mvcUrlPathHelper") UrlPathHelper urlPathHelper,
			@Qualifier("mvcPathMatcher") PathMatcher pathMatcher,
			@Qualifier("mvcContentNegotiationManager") ContentNegotiationManager contentNegotiationManager,
			@Qualifier("mvcConversionService") FormattingConversionService conversionService,
			@Qualifier("mvcResourceUrlProvider"
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值