SpringBoot處理靜態資源

_X先生發表於2020-12-06

靜態資源

WebMvcAutoConfiguration.class配置類中的addResourceHandlers方法的原始碼

WebMvcAutoConfiguration.java原始碼中找到addResourceHandlers方法

   	public void addResourceHandlers(ResourceHandlerRegistry registry) {
   		//this.resourceProperties.isAddMappings()如果對resourceProperties進行配置,那麼就會禁用預設資源處理
   		//resourceProperties.isAddMappings() 預設為true
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			//獲取快取配置的資源處理程式提供的資源快取週期。
			Duration cachePeriod = this.resourceProperties.getCache().getPeriod();
			//getCache().getCachecontrol()快取控制HTTP頭配置
			//以下一段是將classpath:/META-INF/resources/webjars/對映為/webjars/**
			//只要存在/META-INF/resources/webjars/都可以通過/webjars/**進行訪問
			CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
			if (!registry.hasMappingForPattern("/webjars/**")) {
				customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
						.addResourceLocations("classpath:/META-INF/resources/webjars/")
						.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
			}
			//預設值
			//staticPathPattern = "/**"
			//String[] staticLocations ={ "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" }
			//以下這段程式碼可以通過"/**"訪問staticLocations包含 的路徑下去找資源
			//資源訪問存在優先順序
			String staticPathPattern = this.mvcProperties.getStaticPathPattern();
			if (!registry.hasMappingForPattern(staticPathPattern)) {
				customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
						.addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
						.setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
			}
		}
123456789101112131415161718192021222324252627282930

springboot中使用webjars載入靜態資源

首先需要去webjars(https://www.webjars.org/)網站,然後搜maven依賴,把maven依賴加入到springboot專案的pom.xml檔案中,
網站如下圖
在這裡插入圖片描述
然後成功把座標加入到pom.xml檔案中的依賴後會在專案中出現以下的這個包如圖

然後去WebMvcAutoConfiguration.class配置類中addResourceHandlers方法,如下圖

在這裡插入圖片描述

在這裡插入圖片描述

這樣我們訪問下面圖片中的路徑的時候,

在這裡插入圖片描述

比如想訪問jquery.js靜態資源,那麼可以直接寫介面localhost:8080/webjars/jquery/3.4.1/jquery.js,需要注意的是我們原始碼中是把/webjars路徑代替classpath:/resources/webjars路徑,並沒有連同後面的/jquery/3.4.1路徑,因此後面的寫介面的時候webjars/後面一定要加上/jquery/3.4.1即localhost:8080/webjars/jquery/3.4.1/jquery.js。

用webjars處理靜態資源的這種方式不常用,常用的是通過靜態位置staticLocations來處理靜態資源,也即是把靜態資源直接放進特定名稱的目錄裡面,然後就可以直接訪問了。

springboot中使用staticLocations載入靜態資源

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

從上面的5張圖片可以得出一個結論,路徑/可以代替classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,

classpath:/public這四個靜態路徑。

這四個靜態路徑的優先順序:/META-INF/resources/>/resources>/static(預設)>/public

在這裡插入圖片描述

如上圖是resources根目錄下的四個靜態目錄,這四個靜態目錄裡面都有一個名字為hello.js的靜態檔案,然後通過瀏覽器訪問介面

localhost:8080/hello.js訪問的是優先順序最高的靜態目錄裡面的檔案,也即是META-INF/resources/hello.js

使用靜態資源注意事項

使用靜態資源的目錄的時候,假設把所有的靜態檔案都放入了classpath:/static靜態資料夾下,加入有一個靜態檔案是hello.js,然後正常情況下,

在這裡插入圖片描述

即沒有對resourceProperties進行配置的時候,可以在瀏覽器中使用localhost:8080/hello.js介面可以生效,但是如果在配置檔案中對resourceProperties進行了配置,如下圖

在這裡插入圖片描述

那麼再次訪問靜態資源時就要用localhost:8080/static/hello.js介面了,如果仍是用localhost:8080/hello.js介面會出錯。

WebMvcAutoConfiguration都可以在配置檔案中配置什麼資訊怎麼看

找到WebMvcAutoConfiguration.class配置類中@EnableConfigurationProperties({WebMvcProperties.class})註解,然後點選WebMvcProperties.class類,結合這個類裡面的@ConfigurationProperties(prefix=“spring.mvc”)和這個類中的屬性的名字可以知道

配置檔案中能配置的與Web模組相關的配置資訊就是spring.mvc…

其中WebMvcProperties.class類中有一個屬性就是spring.mvc.static-path-pattern如果此屬性在配置檔案中配置了,如上圖中的情況,那麼訪問靜態資源的介面就不再是localhost:8080/了。

在這裡插入圖片描述

在這裡插入圖片描述

相關文章