Springboot—靜態資源

  • **什麼是webjars呢**
  • **第二種方法,就是獲得靜態資源的路徑。**
  • 總結


我們如何導入我們的靜態資源呢?例如js、css等,首先看項目結構:

add service沒有springboot_#後端


這裏有一個static文件夾,這裏可以存放我們的靜態資源,但遠遠不止這些

我們來分析源碼
打開WebMvcAutoConfiguration.class,這個是WebMvc的自動配置類
我們找到WebMvcAutoConfigurationAdapter,它的裏面有一個方法,叫addResourceHandlers,添加資源處理器。

public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
                this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                    if (this.servletContext != null) {
                        ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                        registration.addResourceLocations(new Resource[]{resource});
                    }

                });
            }
        }

我們來分析一下,首先進行判斷,如果自定義的東西生效了,那麼直接returen,如何自定義呢,就是在springboot的配置文件配置,如果沒有自定義呢,那麼就去webjars去找,webjars在哪呢?
路徑:“classpath:/META-INF/resources/webjars/”

但是我們看項目結構中,並沒有發現webjars

什麼是webjars呢

https://www.webjars.org/

我們發現webjars可以以maven的方式來引入靜態資源的。

add service沒有springboot_#後端_02

那麼我們來試一試。

<dependency>
            <scope>org.webjars</scope>
            <groupId>jquery</groupId>
            <version>3.4.1</version>
        </dependency>

我們原本是手動加入script代碼段來進行導入或者下載源碼,現在我們引入webjars來導入jquery,這個引入的結構是完全符合上面的路徑結構的並且可以映射到項目中去,當然這樣並不好。

第二種方法,就是獲得靜態資源的路徑。

我們點擊getStaticLocations()

然後點擊StaticLocations,發現,只要在下面這些路徑下的都能被掃描到。

private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};

也就是説,在這些目錄下面的靜態資源文件都會被掃描識別到,並且直接localhost/8081/xxxx就可以找到這些文件。

add service沒有springboot_jar_03


但是,這些文件夾裏的文件也有優先級

一旦出現靜態文件名字相同的情況下,就會產生優先級的差異。

優先級:resource>static>public

所以一般public放一些公共的資源,static可以放一些圖片資源,resource就放一下上傳的文件。

但是,假設你自定義了一些配置,那麼,其他的配置都會失效

if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");

這是我們看源碼的出來的結論,所以我們一般我們不會這麼去做。

總結

  1. 在springboot中,我們可以使用以下方式來處理靜態資源
    webjars ocalhost:8080/webjars/
    public,static,/**,resource localhost:8080/
  2. resource>static>public
  3. 我們默認使用static,不使用webjars
  4. 如何失效呢,假設我們在yaml文件中自定義靜態文件目錄,那麼我們的靜態文件一定失效。