[SpringBoot-07]大白话源码解析静态资源的处理

1、web开发探究

  回忆前面学过的使用SpringBoot的步骤:
  1、创建一个SpringBoot应用,选择我们需要的模块,SpringBoot就会默认将我们的需要的模块自动配置好;
  2、手动在配置文件中配置部分配置项目就可以运行起来了;
  3、专注编写业务代码,不需要考虑以前那样一大堆的配置了。
  其中最关键的是:
  1、向容器中自动配置组件 :XXXAutoconfiguration
  2、自动配置类,封装配置文件的内容:XXXProperties
  当要搞什么应用时,就去找对应的XXXAutoconfigurationXXXProperties,就知道怎么配置了。

2、静态资源处理

  写请求非常简单,那我们要引入我们前端资源,我们项目中有许多的静态资源,比如css,js等文件,这个SpringBoot怎么处理呢?
  如果我们是一个web应用,我们的main下会有一个webapp,我们以前都是将所有的页面导在这里面的,对吧!但是我们现在的pom呢,打包方式是为jar的方式,那么这种方式SpringBoot能不能来给我们写页面呢?当然是可以的,但是SpringBoot对于静态资源放置的位置,是有规定的!
  跟着我思路,现在我是要知道如何放置静态资源(html\js\css等),那么我肯定是要开发web应用,这些静态资源属于表现层的东西,那么我要找的就是MVC相关的Autoconfiguration。
  打开spring.factories,看里面有没有跟MVC相关的自动配置类,果然有!
在这里插入图片描述
  进入这个类,可以看到这个方法:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
	if (!this.resourceProperties.isAddMappings()) {
		logger.debug("Default resource handling disabled");
	} else {
		Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
		CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
		if (!registry.hasMappingForPattern("/webjars/**")) {
			this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{"/webjars/**"}).addResourceLocations(new String[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
		}
		
		String staticPathPattern = this.mvcProperties.getStaticPathPattern();
		if (!registry.hasMappingForPattern(staticPathPattern)) {
			this.customizeResourceHandlerRegistration(registry.addResourceHandler(new String[]{staticPathPattern}).addResourceLocations(WebMvcAutoConfiguration.getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
		}
	}
}

2.1 webjar

  上面方法就定义了SpringBoot的静态资源的映射规则,读一下上面的源码,比如第8行意思是如果静态资源是以webjar的形式,那么静态资源就可以放在classpath:/META-INF/resources/webjars/
  那什么是webjar形式的静态资源呢?其实就是把html\js\css等这些静态资源打包成jar包。
  举个例子,我们访问https://www.webjars.org,从里面找一个静态资源:
在这里插入图片描述
  然后我们把这个webjar放到我们的pom.xml中:
在这里插入图片描述
  可以看出,这个jar包的静态资源路径和上面那个方法中的classpath:/META-INF/resources/webjars/是一致的。
  启动应用,浏览器来访问一下:
在这里插入图片描述
  成功访问静态资源。

2.2 默认路径

  那要是我们自己的静态资源又该如何导入呢?其实就是方法里面的另一个if了:
在这里插入图片描述
  因为太长了截图不全,大家可以看源码。这个长长的一行里面调用了this.resourceProperties.getStaticLocations()方法,点进去看这个getStaticLocations()
在这里插入图片描述
  原来默认的静态资源路径是CLASSPATH_RESOURCE_LOCATIONS这个字符串数组保存的:

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = 
    new String[]{"classpath:/META-INF/resources/", 
    			"classpath:/resources/", 
    			"classpath:/static/", 
    			"classpath:/public/"};

  所以WebMVC相关的配置类ResourceProperties中可以设置静态资源的有关参数,上面四个类路径指向了SpringBoot会去寻找的资源文件夹。
  我们一个个来试试,创建四个静态资源文件分别放在上面的四个类路径:
在这里插入图片描述

  测试结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  注意:classpath:/resources/不是直接放在工程的resources目录下,而是要在这个目录下再创建一级名字叫做resources的目录。

2.3 自定义路径

  除了这四个默认路径,我们可以设置自己喜欢的路径。回忆配置文件的原理,我们直接打开application.yaml。然后设置一下我想要的路径:
在这里插入图片描述
  application.yaml:

spring:
  resources:
    static-locations: classpath:/MyStaticFiles/

  测试访问:
在这里插入图片描述
  这个时候我们再访问之前的file01.html、file02.html、file03.html和file04.html。除了file01.html,其他的都访问不到了。
  一旦自己定义了静态文件夹的路径,原来的自动配置就都会失效了!(classpath:/META-INF/resources/却除外,可能是其他地方有配置它。)
  因此,要么使用默认路径,要么使用自定义路径,千万不要即自定义,然后又放到默认路径下,容易出问题。

3、默认首页

  回忆之前学SpringMVC的时候,会有默认的首页。那么在SpringBoot中有没有呢,答案是肯定的!
  还是刚才那个WebMVC的自动配置类,里面有一个方法:
在这里插入图片描述
  分析:
  1、首先是有个welcomePageHandlerMapping方法是设置欢迎页面的;
  2、方法里调用了this.getWelcomePage()方法;
  3、this.getWelcomePage()方法调用了getIndexHtml()方法;
  4、getIndexHtml()方法返回resourceLoader.getResource(location + "index.html")
  可以知道WebMVC应用开启后,会去location里找index.html,而这个location又是谁呢?
  继续挖掘这个location
在这里插入图片描述
  居然又见到这个resourceProperties.getStaticLocations(),继续点它就可以看到熟悉的一幕:

  其实就是那四个默认路径。在这里插入图片描述
  原来!SpringBoot启动后,会去这四个默认路径找index.html的文件,空的SpringBoot的web工程就是因为没有index.html,所以启动后才会报以下错误:
在这里插入图片描述
  我们随便在四个默认路径放一个index.html:
在这里插入图片描述
  然后再重启服务:

  一种茅塞顿开的感觉!在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值