SpringBoot無(wú)法訪問(wèn)/static下靜態(tài)資源的解決
SpringBoot無(wú)法訪問(wèn)/static下靜態(tài)資源
SpringBoot 訪問(wèn)靜態(tài)資源的規(guī)則
都在WebMvcAutoConfiguration自動(dòng)配置類(lèi)中
在該類(lèi)下有對(duì)資源處理的方法
默認(rèn)按照該加載順序,加載靜態(tài)資源文件,而我嘗試了N次,瀏覽器無(wú)法訪問(wèn)資源;查看官網(wǎng)后,我又修改了默認(rèn)的加載位置。如下:
spring.resources.static-locations=/static/
但是還是沒(méi)有能如期訪問(wèn)! 而回過(guò)頭再回過(guò)頭看Web的自動(dòng)配置類(lèi),我發(fā)現(xiàn)了一個(gè)被忽略的配置
在WebMvcConfigurationSupport.class這個(gè)類(lèi)沒(méi)有的情況下,才會(huì)走SpringBoot的Web自動(dòng)配置,而在==@EnableWebMvc==中,又驚奇的發(fā)現(xiàn)了它
SpringBoot容器里讀到了我們配置的@EnableWebMvc 注解
它通過(guò) @Import 導(dǎo)入了 WebMvcConfigurationSupport 類(lèi),從而導(dǎo)致了 WebMvcAutoConfiguration 類(lèi)沒(méi)有生效,此時(shí)我的問(wèn)題找到了! 最后我又在Spring的官網(wǎng)找到了對(duì)應(yīng)的解釋?zhuān)晒﹨⒖?a rel="external nofollow" target="_blank" >Spring MVC Auto Configuration
小結(jié)一下
如果項(xiàng)目有沒(méi)有非常多的功能,可以使用 @EnableWebMvc 注解,全面接管SpringBoot對(duì)SpringMVC的自動(dòng)注入,自己來(lái)寫(xiě)SpringMVC 運(yùn)行所需的一些配置,這樣會(huì)減少自動(dòng)注入帶來(lái)的一些無(wú)意義性能消耗;
而一般功能比較多的項(xiàng)目,還是使用SpringBoot推薦的對(duì)SpringMVC拓展方法 —— 繼承 WebMvcConfigurer 類(lèi),這樣不僅可以自己實(shí)現(xiàn)想要添加的WEB組件,也保留了SpringBoot底層的自動(dòng)注入
SpringBoot2.*.*無(wú)法訪問(wèn)靜態(tài)資源的坑
遇到的問(wèn)題
在導(dǎo)入靜態(tài)資源(css、js包等)和html頁(yè)面模板時(shí),發(fā)生無(wú)法讀取靜態(tài)資源的情況,總結(jié)是以下兩種情況:
1、輸入訪問(wèn)靜態(tài)資源的url,出現(xiàn)白頁(yè)錯(cuò)誤,無(wú)法訪問(wèn)靜態(tài)資源;
2、輸入訪問(wèn)html頁(yè)面的url,可以訪問(wèn)成功,但是html頁(yè)面布局亂了,無(wú)法讀取樣式;
由于樣式是放在靜態(tài)資源文件夾的,既然無(wú)法訪問(wèn)靜態(tài)資源,那么html頁(yè)面自然就無(wú)法讀取樣式了。所以問(wèn)題歸結(jié)于“無(wú)法訪問(wèn)靜態(tài)資源”。
注:模板引擎采用的是springboot推薦的thymeleaf來(lái)渲染html頁(yè)面
解決的方法
在配置類(lèi)中添加以下方法
主:詳細(xì)參考以下個(gè)人寫(xiě)的配置類(lèi)
@Configuration public class SigninConfig extends WebMvcConfigurationSupport { //增加訪問(wèn)路徑 @Override protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); } //請(qǐng)求與頁(yè)面映射 @Override protected void addViewControllers(ViewControllerRegistry registry) { //urlPath:請(qǐng)求 //setViewName:html頁(yè)面 registry.addViewController("/").setViewName("signin"); } }
粗略的原因
springboot關(guān)于springmvc自動(dòng)配置的機(jī)制主要有以下兩種(目前了解的),其中第一種就是涉及到“為什么無(wú)法訪問(wèn)靜態(tài)資源”的問(wèn)題:
(1)springboot不允許用戶(hù)個(gè)人添加的組件與自動(dòng)配置一起作用,那么用戶(hù)添加的組件會(huì)覆蓋掉自動(dòng)配置。
我的配置類(lèi)繼承WebMvcConfigurationSupport,這是springmvc自動(dòng)配置類(lèi),我猜想這個(gè)類(lèi)涉及到靜態(tài)資源路徑的默認(rèn)配置(沒(méi)有詳細(xì)看源碼不確定),@Configuration又把我的配置類(lèi)添加到容器中,相當(dāng)于我的配置類(lèi)和自動(dòng)配置類(lèi)都在容器中,那么根據(jù)(1),自動(dòng)配置的靜態(tài)資源路徑自然就失效,所以如果我們不指定,自然就無(wú)法訪問(wèn)靜態(tài)資源,所以需要我們重新指定靜態(tài)資源路徑(這也是為什么要重寫(xiě)addResourceHandlers方法)。
(2)springboot允許用戶(hù)個(gè)人添加的組件(如view,也就是上述addViewControllers方法)與自動(dòng)配置一起作用,那么用戶(hù)添加的組件會(huì)和自動(dòng)配置一起存在;
那么重點(diǎn)來(lái)了,以前springboot1.版本的時(shí)候還沒(méi)有對(duì)(1)情況作出修改,也就是說(shuō)即使你添加了相關(guān)的組件,默認(rèn)的靜態(tài)資源路徑仍然是生效的,不需要再重寫(xiě)路徑。
而到了springboot2.時(shí),如果你添加了相關(guān)的組件,默認(rèn)的靜態(tài)資源路徑就會(huì)失效,如果你不重新指明靜態(tài)資源路徑,那么你就無(wú)法訪問(wèn)靜態(tài)資源,所以要多一步重新設(shè)置靜態(tài)資源路徑的步驟,完畢。
————————后續(xù)————————
原本是看著官網(wǎng)文檔,打算按照官方說(shuō)的做一遍,然后好奇就把原配置路徑的代碼刪掉,結(jié)果居然能訪問(wèn)?。。](méi)有報(bào)白頁(yè)錯(cuò)誤?。?!
@Configuration public class SigninConfig extends WebMvcConfigurationSupport { // @Override // protected void addResourceHandlers(ResourceHandlerRegistry registry) { // registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); // } @Override protected void addViewControllers(ViewControllerRegistry registry) { //urlPath:請(qǐng)求 //setViewName:html頁(yè)面 registry.addViewController("/").setViewName("signin"); } }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)
- SpringBoot中的static靜態(tài)資源訪問(wèn)、參數(shù)配置、代碼自定義訪問(wèn)規(guī)則詳解
- springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法
- 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問(wèn)題
- springboot應(yīng)用中靜態(tài)資源訪問(wèn)與接口請(qǐng)求沖突問(wèn)題解決
- SpringBoot2.x過(guò)后static下的靜態(tài)資源無(wú)法訪問(wèn)的問(wèn)題
- SpringBoot如何訪問(wèn)html和js等靜態(tài)資源配置
- springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決
- SpringBoot靜態(tài)資源及原理解析
相關(guān)文章
Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語(yǔ)言支持操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean定義中的SpEL表達(dá)式語(yǔ)言支持操作,結(jié)合實(shí)例形式分析了Bean定義中的SpEL表達(dá)式語(yǔ)言操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-12-12SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08在SpringBoot中實(shí)現(xiàn)一個(gè)訂單號(hào)生成系統(tǒng)的示例代碼
在Spring Boot中設(shè)計(jì)一個(gè)訂單號(hào)生成系統(tǒng),主要考慮到生成的訂單號(hào)需要滿(mǎn)足的幾個(gè)要求:唯一性、可擴(kuò)展性、以及可能的業(yè)務(wù)相關(guān)性,本文給大家介紹了幾種常見(jiàn)的解決方案及相應(yīng)的示例代碼,需要的朋友可以參考下2024-02-02一種類(lèi)似JAVA線(xiàn)程池的C++線(xiàn)程池實(shí)現(xiàn)方法
線(xiàn)程池(thread pool)是一種線(xiàn)程使用模式。線(xiàn)程過(guò)多或者頻繁創(chuàng)建和銷(xiāo)毀線(xiàn)程會(huì)帶來(lái)調(diào)度開(kāi)銷(xiāo),進(jìn)而影響緩存局部性和整體性能。這篇文章主要介紹了一種類(lèi)似JAVA線(xiàn)程池的C++線(xiàn)程池實(shí)現(xiàn)方法,需要的朋友可以參考下2019-07-07解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set)
這篇文章主要介紹了解決springboot啟動(dòng)失敗的問(wèn)題('hibernate.dialect'?not?set),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12Java 日期格式y(tǒng)yyy-MM-dd與YYYY-MM-dd區(qū)別
我們?cè)趈ava中常用的規(guī)范格式為:2023-11-11
yyyy-MM-dd HH:mm:ss:SSS 24小時(shí)制或yyyy-MM-dd hh:mm:ss:SSS 12小時(shí)制,本文就來(lái)介紹一下兩者的區(qū)別,感興趣的可以了解一下Java中的封裝性(包含this關(guān)鍵字,構(gòu)造器等)
這篇文章主要介紹了Java中的封裝性(包含this關(guān)鍵字,構(gòu)造器等)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03怎樣使用PowerMockito 測(cè)試靜態(tài)方法
這篇文章主要介紹了使用PowerMockito 測(cè)試靜態(tài)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07