springBoot快速訪(fǎng)問(wèn)工程目錄下的靜態(tài)資源
1、牛刀小試
1.1 圖片靜態(tài)資源的訪(fǎng)問(wèn)
先看官方怎么說(shuō),點(diǎn)擊鏈接,打開(kāi)SpringBoot官方文檔
文檔中明確指出:/static(or/publicor/resourcesor/META-INF/resources) ,這幾個(gè)目錄是SpringBoot放置靜態(tài)資源的目錄,只要把靜態(tài)資源放到這幾個(gè)目錄下,就能直接訪(fǎng)問(wèn)到。
新建 Spingboot web項(xiàng)目試下,新項(xiàng)目只有 /static 目錄 ,手動(dòng)創(chuàng)建其他幾個(gè)靜態(tài)資源文件夾,每個(gè)目錄添加1張圖片
啟動(dòng)項(xiàng)目,分別訪(fǎng)問(wèn)這四張圖片:
發(fā)現(xiàn)圖片均可訪(fǎng)問(wèn),
文檔說(shuō)的對(duì),果然沒(méi)騙人,
由此我們認(rèn)定 SpringBoot 訪(fǎng)問(wèn)靜態(tài)資源:當(dāng)前項(xiàng)目根路徑 + / + 靜態(tài)資源名
1.2 為靜態(tài)資源添加訪(fǎng)問(wèn)前綴
By default, resources are mapped on /**, but you can tune that with the spring.mvc.static-path-pattern property. For instance, relocating all resources to /resources/** can be achieved as follows: PropertiesYaml spring.mvc.static-path-pattern=/resources/**
文檔又解釋了一下,說(shuō),默認(rèn)情況下SpringBoot是幫你映射的路徑是/** ,
但是,如果你想加一個(gè)前綴也可以,比如 /res/
技術(shù)圈有句話(huà):先有業(yè)務(wù)才有技術(shù),SpringBoot官方考慮到某些網(wǎng)站添加了登錄驗(yàn)證,一般需要登錄后才能訪(fǎng)問(wèn)項(xiàng)目中的資源,為了登錄頁(yè)樣式也能正常顯示,方便放行靜態(tài)資源,直接給所有靜態(tài)資源添加一個(gè)前綴,既可統(tǒng)一攔截,又可統(tǒng)一放開(kāi)
操作:在配置文件application.properties中添加
spring.mvc.static-path-pattern=/res/**
添加完再去訪(fǎng)問(wèn)原來(lái)的dog圖片鏈接:http://localhost:8080/dog.jpeg
但是訪(fǎng)問(wèn):http://localhost:8080/res/dog.jpeg發(fā)現(xiàn)這才可以
嘿嘿😋
1.3 WelCome Page 的奇妙跳轉(zhuǎn)
7.1.6. Welcome Page
Spring Boot supports both static and templated welcome pages. It first looks for an index.html file in the configured static content locations. If one is not found, it then looks for an index template. If either is found, it is automatically used as the welcome page of the application.
文檔說(shuō)把一個(gè)名稱(chēng)叫 index.html 的文件放到任意的靜態(tài)目錄下,訪(fǎng)問(wèn)http://localhost:8080即可到達(dá),意思就是給你一個(gè)首頁(yè)跳轉(zhuǎn)的快捷方式(注意:需把1.2 的配置路徑去掉,否則會(huì)導(dǎo)致welcome page功能失效,后面源碼分析會(huì)說(shuō)到)
新建html,放到 /static 下,訪(fǎng)問(wèn):
2、那么,SpringBoot是如何做到的呢?
接下來(lái)看源碼探究 SpringBoot 靜態(tài)資源配置原理 》》》》 gogogo
源碼位置在:spring-boot-autoconfigure-2.5.1.jar 這個(gè)jar里面,具體的目錄如下:
/spring-boot-autoconfigure-2.5.1.jar!/org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration.class
WebMvcAutoConfiguration 類(lèi)里面找到addResourceHandlers 方法,顧名思義 添加資源處理器
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 相當(dāng)于一個(gè)開(kāi)關(guān)去控制靜態(tài)資源處理器的加載,默認(rèn)為true,設(shè)置為false就會(huì)禁止所有規(guī)則
if (!this.resourceProperties.isAddMappings()) {
logger.debug("Default resource handling disabled");
return;
}
//第一個(gè)就配置webjars的訪(fǎng)問(wèn)規(guī)則,規(guī)定在類(lèi)路徑的/META-INF/resources/webjars/路徑下,感興趣的同學(xué)可以點(diǎn)進(jìn)方法去,里面還配置了webjars的瀏覽器端緩存時(shí)間,是在application。propertities中的一個(gè)配置項(xiàng) spring.web.resources.cache.period
addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
//這里配置了靜態(tài)資源的四個(gè)訪(fǎng)問(wèn)路徑
addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
registration.addResourceLocations(this.resourceProperties.getStaticLocations());
if (this.servletContext != null) {
ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
registration.addResourceLocations(resource);
}
});
}
第一個(gè)if判斷this.resourceProperties.isAddMappings() 去配置文件獲取
spring.resources 這個(gè)屬性,默認(rèn)是 true , 如果設(shè)置為false 那么就等于禁用掉所有的靜態(tài)資源映射功能,不行就試一下
#springapplication.propertities中配置 spring.web.resources.add-mappings=false
重啟項(xiàng)目,發(fā)現(xiàn)首頁(yè)無(wú)法訪(fǎng)問(wèn)了...
改回 true ,首頁(yè)就又可以訪(fǎng)問(wèn)了
不要停留,繼續(xù)看第二個(gè)addResourceHandler 方法,打斷點(diǎn)看看這個(gè)方法添加了什么規(guī)則
沒(méi)錯(cuò),第二個(gè)addResourceHandler 方法就表明 / **下的所有請(qǐng)求,都在這四個(gè)默認(rèn)的位置去找靜態(tài)資源映射 ,這四個(gè)目錄在官方文檔中提到過(guò)。
另外,訪(fǎng)問(wèn)路徑前綴是在 this.mvcProperties.getStaticPathPattern() 獲取的,配置上:
spring.mvc.static-path-pattern=/res/**
打斷點(diǎn)如下:
注意📢: 所有的請(qǐng)求先去controller控制器找映射,找不到,再來(lái)靜態(tài)資源映射器。
到這里解決了靜態(tài)資源目錄的問(wèn)題。
馬不停蹄,探究 Welcome Page 的事情 》》》》》
還是在 WebMvcAutoConfiguration 這個(gè)類(lèi):搜索 “WelcomePage” :
@Bean
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
this.mvcProperties.getStaticPathPattern());
welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
return welcomePageHandlerMapping;
}
把WelcomePageHandlerMapping 的有參構(gòu)造也拿來(lái)
WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,
ApplicationContext applicationContext, Resource welcomePage, String staticPathPattern) {
if (welcomePage != null && "/**".equals(staticPathPattern)) {
logger.info("Adding welcome page: " + welcomePage);
setRootViewName("forward:index.html");
}
else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {
logger.info("Adding welcome page template: index");
setRootViewName("index");
}
}
根據(jù)有參構(gòu)造可以看出來(lái),只有 歡迎頁(yè)這個(gè)資源存在,并且 靜態(tài)資源訪(fǎng)問(wèn)路徑是 /** ,才能重定向到indes.html ,否則就會(huì)去找 Controller 處理。
這就解釋了,上面為什么配置了靜態(tài)資源訪(fǎng)問(wèn)路徑 為/res/** 后導(dǎo)致首頁(yè)無(wú)法訪(fǎng)問(wèn)到 的問(wèn)題
好了,前面牛刀小試的坑已經(jīng)填完了,關(guān)于SpringBoot 靜態(tài)資源配置原理 這篇總結(jié)就到這了
以上就是SprignBoot訪(fǎng)問(wèn)工程目錄下的靜態(tài)資源的詳細(xì)內(nèi)容,更多關(guān)于SprignBoot訪(fǎng)問(wèn)靜態(tài)資源的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪(fǎng)問(wèn)404問(wèn)題
這篇文章主要介紹了springmvc Controller方法沒(méi)有加@ResponseBody導(dǎo)致api訪(fǎng)問(wèn)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法
這篇文章主要介紹了Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java Swing組件下拉菜單控件JComboBox用法示例
這篇文章主要介紹了Java Swing組件下拉菜單控件JComboBox用法,結(jié)合具體實(shí)例形式分析了Swing組件下拉菜單控件JComboBox的具體定義、使用方法及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下2017-11-11
解決MyBatis中模糊搜索使用like匹配帶%字符時(shí)失效問(wèn)題
Mybatis是我們?nèi)粘m?xiàng)目中經(jīng)常使用的框架,在項(xiàng)目中我們一般會(huì)使用like查詢(xún)作為模糊匹配字符進(jìn)行搜索匹配,下面的Mapper.xml是我們使用like在項(xiàng)目中進(jìn)行模糊匹配的常用方式,感興趣的朋友跟隨小編一起看看吧2021-09-09
一文帶你掌握SpringBoot中常見(jiàn)定時(shí)任務(wù)的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Spring?Boot中定時(shí)任務(wù)的基本用法、高級(jí)特性以及最佳實(shí)踐,幫助開(kāi)發(fā)人員更好地理解和應(yīng)用定時(shí)任務(wù),提高系統(tǒng)的穩(wěn)定性和可靠性,需要的可以參考下2024-03-03

