SpringBoot 配置靜態資源映射


SpringBoot 配置靜態資源映射

(嵌入式servlet容器)先決知識

  1. request.getSession().getServletContext().getRealPath("/"),這個很重要,將其稱為 docBase,即 “文檔基目錄”
  2. 在單模塊項目中,如果不存在 src/main/webapp 目錄,則 docBase 被設置為C盤下臨時的隨機目錄,例如 C:\Users\Administrator\AppData\Local\Temp\tomcat-docbase.2872246570823772896.8080\
  3. 在多模塊項目中,要留意jvm啟動路徑。無論該啟動路徑是位於父模塊的路徑下還是子模塊的,如果jvm啟動路徑下不存在 src/main/webapp 目錄,則 docBase 被設置為C盤下臨時的隨機目錄

綜上,如果想要依照傳統方式通過“文檔基目錄”去定位文檔資源(html、css、js),則要確保存在 src/main/webapp 目錄,即 docBase 不會被設置為隨機目錄;否則,建議直接設置 SpringBoot 將其定位至 classpath 下的資源(即 src/main/resource 目錄下的資源),具體配置如下

1.當不存在 @EnableWebMVC 時

  1. SpringBoot 的 @EnableAutoConfiguration 會啟用自動配置類 WebMvcAutoConfiguration,該類配置了一些默認的靜態資源映射
    • 自動映射 localhost:8080/** 為以下路徑
      • classpath:/resources/
      • classpath:/static/
      • classpath:/public/
      • classpath:/META-INF/resources/
    • 自動映射 localhost:8080/webjars/** 為以下路徑
      • classpath:/META-INF/resources/webjars/
  2. 此時,我們不需要多做什么,只要將靜態資源放入 src/main/resources 目錄下的 resources、static 或 public 文件夾下,即可通過 url 定位相關資源,例如 localhost:8080/index.html 可定位至 src/main/resources/static/index.html
  3. 注意:如果編寫了以下的自定義配置,則以上默認配置將被取消。更確切的說,一旦自定義的配置不為空,則默認配置將不被采用。
@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 時

  1. 如果使用了 @EnableWebMvc,則自動配置類 WebMvcAutoConfiguration 會失效,因此默認映射路徑 /static, /public, META-INF/resources, /resources 都將失效
  2. 這種情況下,只能設置自定義配置
    • 無任何前綴 -> “文檔根目錄”(一般指代 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/");
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM