SpringBoot 配置靜態資源映射
(嵌入式servlet容器)先決知識
- request.getSession().getServletContext().getRealPath("/"),這個很重要,將其稱為 docBase,即 “文檔基目錄”
- 在單模塊項目中,如果不存在 src/main/webapp 目錄,則 docBase 被設置為C盤下臨時的隨機目錄,例如 C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.2872246570823772896.8080\
- 在多模塊項目中,要留意jvm啟動路徑。無論該啟動路徑是位於父模塊的路徑下還是子模塊的,如果jvm啟動路徑下不存在 src/main/webapp 目錄,則 docBase 被設置為C盤下臨時的隨機目錄
綜上,如果想要依照傳統方式通過“文檔基目錄”去定位文檔資源(html、css、js),則要確保存在 src/main/webapp 目錄,即 docBase 不會被設置為隨機目錄;否則,建議直接設置 SpringBoot 將其定位至 classpath 下的資源(即 src/main/resource 目錄下的資源),具體配置如下
1.當不存在 @EnableWebMVC 時
- SpringBoot 的 @EnableAutoConfiguration 會啟用自動配置類 WebMvcAutoConfiguration,該類配置了一些默認的靜態資源映射
- 自動映射 localhost:8080/** 為以下路徑
- classpath:/resources/
- classpath:/static/
- classpath:/public/
- classpath:/META-INF/resources/
- 自動映射 localhost:8080/webjars/** 為以下路徑
- classpath:/META-INF/resources/webjars/
- 自動映射 localhost:8080/** 為以下路徑
- 此時,我們不需要多做什么,只要將靜態資源放入 src/main/resources 目錄下的 resources、static 或 public 文件夾下,即可通過 url 定位相關資源,例如 localhost:8080/index.html 可定位至 src/main/resources/static/index.html
- 注意:如果編寫了以下的自定義配置,則以上默認配置將被取消。更確切的說,一旦自定義的配置不為空,則默認配置將不被采用。
@Configuration
public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置靜態資源處理
registry.addResourceHandler("/**")
.addResourceLocations("classpath:/resources2/", "classpath:/static2/",
"classpath:/public2/", "file:///tmp/webapps/");
}
}
如果不喜歡代碼配置,也可采取以下屬性配置方式:
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,\
classpath:/static/,classpath:/public/,file:D://hehe
附,有一個不常用的相關屬性如下
//默認值,URL訪問采用 /**
spring.mvc.static-path-pattern=/**
//URL訪問必須采用 /pomer/** 的形式
spring.mvc.static-path-pattern=/pomer/**
//URL訪問必須采用 /12345/** 的形式
spring.mvc.static-path-pattern=/12345/**
2.當存在 @EnableWebMVC 時
- 如果使用了 @EnableWebMvc,則自動配置類 WebMvcAutoConfiguration 會失效,因此默認映射路徑 /static, /public, META-INF/resources, /resources 都將失效
- 這種情況下,只能設置自定義配置
- 無任何前綴 -> “文檔根目錄”(一般指代 src/main/webapp 目錄), 例如 localhost:8080/index.html 定位至 src/main/webapp/static/index.html
- 存在前綴 classpath -> 類路徑(一般指代 src/main/resources 目錄)
- 存在前綴 file:// -> 文件系統路徑(“絕對路徑”)
@Configuration
public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//配置靜態資源處理
registry.addResourceHandler("/**")
.addResourceLocations("resources/", "static/", "public/",
"META-INF/resources/")
.addResourceLocations("classpath:resources/", "classpath:static/",
"classpath:public/", "classpath:META-INF/resources/")
.addResourceLocations("file:///tmp/webapps/");
}
}
