SpringBoot無法訪問/static下靜態(tài)資源的解決
SpringBoot無法訪問/static下靜態(tài)資源
SpringBoot 訪問靜態(tài)資源的規(guī)則
都在WebMvcAutoConfiguration自動配置類中

在該類下有對資源處理的方法


默認(rèn)按照該加載順序,加載靜態(tài)資源文件,而我嘗試了N次,瀏覽器無法訪問資源;查看官網(wǎng)后,我又修改了默認(rèn)的加載位置。如下:

spring.resources.static-locations=/static/
但是還是沒有能如期訪問! 而回過頭再回過頭看Web的自動配置類,我發(fā)現(xiàn)了一個被忽略的配置

在WebMvcConfigurationSupport.class這個類沒有的情況下,才會走SpringBoot的Web自動配置,而在==@EnableWebMvc==中,又驚奇的發(fā)現(xiàn)了它


SpringBoot容器里讀到了我們配置的@EnableWebMvc 注解
它通過 @Import 導(dǎo)入了 WebMvcConfigurationSupport 類,從而導(dǎo)致了 WebMvcAutoConfiguration 類沒有生效,此時我的問題找到了! 最后我又在Spring的官網(wǎng)找到了對應(yīng)的解釋,可供參考Spring MVC Auto Configuration
小結(jié)一下
如果項目有沒有非常多的功能,可以使用 @EnableWebMvc 注解,全面接管SpringBoot對SpringMVC的自動注入,自己來寫SpringMVC 運(yùn)行所需的一些配置,這樣會減少自動注入帶來的一些無意義性能消耗;
而一般功能比較多的項目,還是使用SpringBoot推薦的對SpringMVC拓展方法 —— 繼承 WebMvcConfigurer 類,這樣不僅可以自己實現(xiàn)想要添加的WEB組件,也保留了SpringBoot底層的自動注入
SpringBoot2.*.*無法訪問靜態(tài)資源的坑
遇到的問題
在導(dǎo)入靜態(tài)資源(css、js包等)和html頁面模板時,發(fā)生無法讀取靜態(tài)資源的情況,總結(jié)是以下兩種情況:
1、輸入訪問靜態(tài)資源的url,出現(xiàn)白頁錯誤,無法訪問靜態(tài)資源;
2、輸入訪問html頁面的url,可以訪問成功,但是html頁面布局亂了,無法讀取樣式;
由于樣式是放在靜態(tài)資源文件夾的,既然無法訪問靜態(tài)資源,那么html頁面自然就無法讀取樣式了。所以問題歸結(jié)于“無法訪問靜態(tài)資源”。
注:模板引擎采用的是springboot推薦的thymeleaf來渲染html頁面
解決的方法
在配置類中添加以下方法

主:詳細(xì)參考以下個人寫的配置類
@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:請求
//setViewName:html頁面
registry.addViewController("/").setViewName("signin");
}
}
粗略的原因
springboot關(guān)于springmvc自動配置的機(jī)制主要有以下兩種(目前了解的),其中第一種就是涉及到“為什么無法訪問靜態(tài)資源”的問題:
(1)springboot不允許用戶個人添加的組件與自動配置一起作用,那么用戶添加的組件會覆蓋掉自動配置。
我的配置類繼承WebMvcConfigurationSupport,這是springmvc自動配置類,我猜想這個類涉及到靜態(tài)資源路徑的默認(rèn)配置(沒有詳細(xì)看源碼不確定),@Configuration又把我的配置類添加到容器中,相當(dāng)于我的配置類和自動配置類都在容器中,那么根據(jù)(1),自動配置的靜態(tài)資源路徑自然就失效,所以如果我們不指定,自然就無法訪問靜態(tài)資源,所以需要我們重新指定靜態(tài)資源路徑(這也是為什么要重寫addResourceHandlers方法)。
(2)springboot允許用戶個人添加的組件(如view,也就是上述addViewControllers方法)與自動配置一起作用,那么用戶添加的組件會和自動配置一起存在;
那么重點來了,以前springboot1.版本的時候還沒有對(1)情況作出修改,也就是說即使你添加了相關(guān)的組件,默認(rèn)的靜態(tài)資源路徑仍然是生效的,不需要再重寫路徑。
而到了springboot2.時,如果你添加了相關(guān)的組件,默認(rèn)的靜態(tài)資源路徑就會失效,如果你不重新指明靜態(tài)資源路徑,那么你就無法訪問靜態(tài)資源,所以要多一步重新設(shè)置靜態(tài)資源路徑的步驟,完畢。
————————后續(xù)————————
原本是看著官網(wǎng)文檔,打算按照官方說的做一遍,然后好奇就把原配置路徑的代碼刪掉,結(jié)果居然能訪問?。。]有報白頁錯誤?。?!
@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:請求
//setViewName:html頁面
registry.addViewController("/").setViewName("signin");
}
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- springboot設(shè)置加載靜態(tài)資源的路徑(spring.resources.static-locations)
- SpringBoot中的static靜態(tài)資源訪問、參數(shù)配置、代碼自定義訪問規(guī)則詳解
- springboot攔截器不攔截靜態(tài)資源,只攔截controller的實現(xiàn)方法
- 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問題
- springboot應(yīng)用中靜態(tài)資源訪問與接口請求沖突問題解決
- SpringBoot2.x過后static下的靜態(tài)資源無法訪問的問題
- SpringBoot如何訪問html和js等靜態(tài)資源配置
- springboot+thymeleaf打包成jar后找不到靜態(tài)資源的坑及解決
- SpringBoot靜態(tài)資源及原理解析
相關(guān)文章
關(guān)于SpringBoot整合Canal數(shù)據(jù)同步的問題
大家都知道canal是阿里巴巴旗下的一款開源工具,純java開發(fā),支持mysql數(shù)據(jù)庫,本文給大家介紹SpringBoot整合Canal數(shù)據(jù)同步的問題,需要的朋友可以參考下2022-03-03
解決Spring Batch框架job任務(wù)只跑一次的問題
這篇文章主要介紹了解決Spring Batch框架job任務(wù)只跑一次的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring中利用SchedulingConfigurer實現(xiàn)動態(tài)定時任務(wù)配置的示例
定時任務(wù)是一項至關(guān)重要的功能,它們使得我們能夠按照預(yù)定的時間執(zhí)行特定的任務(wù),本文主要介紹了Spring中利用SchedulingConfigurer實現(xiàn)動態(tài)定時任務(wù)配置的示例,感興趣的可以了解一下2024-05-05

