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
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-autoconfigure
jar包下的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/目錄下。