1. 程式人生 > >10.7、spring boot的web應用——訪問靜態資源

10.7、spring boot的web應用——訪問靜態資源

一、原理
之前建立web工程的時候,直接把靜態資源,比如html檔案、圖片等放在src/main/webapp目錄下,在瀏覽器中是直接可以訪問到這些靜態資源的。但是在建立spring boot工程中,預設是沒有建立webapp目錄的,如果要把靜態資源放在webapp目錄下,需要手動在src/main/目錄下建立一個webapp目錄,然後把靜態資源放在該目錄下就可以,此時從瀏覽器中是可以直接訪問到spring boot工程中的這些資源的。
但是現在在spring boot工程中,我們沒必要去建立webapp,因為spring boot已經為我們建立好了預設的目錄,只需要把靜態資源放在預設目錄下,瀏覽器就可以直接訪問到。預設的靜態資源目錄配置在spring-boot-autoconfigure

jar包下的org.springframework.boot.autoconfigure.web包下ResourceProperties類,下面是原始碼

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

從原始碼中可以看出,靜態資源存放的預設位置由4個目錄,分別在根目錄,即/src/main/resources/

目錄下的/META-INF/resources//resources//static//public/目錄下。下面以/static/為例演示。

二、示例
建立目錄如圖所示
這裡寫圖片描述
在/src/mian/resources/目錄下建立ststic目錄,該目錄為靜態資源預設存放位置。然後在static目錄下分別建立一個css目錄和一個js目錄,以及一個login.html,然後在css目錄下建立login.css,在js目錄建立login.js。

login.html內容為:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"
>
<title>Insert title here</title> <!-- 匯入login.css和login.js --> <link rel="stylesheet" href="css/login.css"> <script src="js/login.js"></script> </head> <body> <h1>This is login page</h1> </body> </html>

login.css內容為:

body{color: red;}

只是把login.html檔案中的body體中內容全部變為紅色。

login.js內容為:

alert("Spring Boot!");

只是在顯示login.html網頁時,彈出一個警告。

spring boot的啟動類為:

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

從上面的一個示例中,可以看出,靜態資源放在/static/目錄下,瀏覽器可以直接訪問。

三、自定義靜態資源預設儲存位置
spring boot工程預設情況下,瀏覽器可以直接訪問到4個目錄下的靜態資源,但是若想瀏覽器訪問自定義的目錄,我們也可以手動指定。
還是從spring-boot-autoconfigurejar包下的org.springframework.boot.autoconfigure.web包下ResourceProperties類中看,

@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties implements ResourceLoaderAware {

    private static final String[] SERVLET_RESOURCE_LOCATIONS = { "/" };

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

    private static final String[] RESOURCE_LOCATIONS;

    static {
        RESOURCE_LOCATIONS = new String[CLASSPATH_RESOURCE_LOCATIONS.length
                + SERVLET_RESOURCE_LOCATIONS.length];
        System.arraycopy(SERVLET_RESOURCE_LOCATIONS, 0, RESOURCE_LOCATIONS, 0,
                SERVLET_RESOURCE_LOCATIONS.length);
        System.arraycopy(CLASSPATH_RESOURCE_LOCATIONS, 0, RESOURCE_LOCATIONS,
                SERVLET_RESOURCE_LOCATIONS.length, CLASSPATH_RESOURCE_LOCATIONS.length);
    }

    /**
     * Locations of static resources. Defaults to classpath:[/META-INF/resources/,
     * /resources/, /static/, /public/] plus context:/ (the root of the servlet context).
     */
     /*staticLocations 陣列變數指定了靜態資源預設儲存的位置,如果我們想自定義其它目錄,只需要需要修改該變數指定的位置就可以*/
    private String[] staticLocations = RESOURCE_LOCATIONS;

staticLocations 陣列變數指定了靜態資源預設儲存的位置,如果我們想自定義其它目錄,只需要需要修改該變數指定的位置就可以。我們可以在application.properties配置檔案中修改靜態資源儲存位置,如下指定:

spring.resources.staticLocations=classpath:/mysources/

spring boot工程啟動時,會預設載入該配置檔案,然後修改靜態資源預設儲存位置,以後靜態資源要放在/mysources/目錄下。