前兩章咱們分享了Spring boot對Restful 的支持,不過Restful的接口一般僅僅返回數據。而作web開發的時候,咱們每每會有不少靜態資源,如html、圖片、css等。那如何向前端返回靜態資源呢?之前作過web開發的同窗應該知道,咱們之前建立的web工程下面會有一個webapp的目錄,咱們只要把靜態資源放在該目錄下就能夠直接訪問。可是,基於Spring boot的工程並無這個目錄,那咱們應該怎麼處理?css
1、最笨的方式html
咱們首先來分享一種最笨的辦法,就是將靜態資源經過流直接返回給前端,咱們在maven工程的resources的根目錄下創建一個html的目錄,而後咱們把html文件放在該目錄下,而且規定任何訪問路徑以/static/開頭的即訪問該目錄下的靜態資源,其實現以下:前端
@Controller public class StaticResourceController { @RequestMapping("/static/**") public void getHtml(HttpServletRequest request, HttpServletResponse response) { String uri = request.getRequestURI(); String[] arr = uri.split("static/"); String resourceName = "index.html"; if (arr.length > 1) { resourceName = arr[1]; } String url = StaticResourceController.class.getResource("/").getPath() + "html/" + resourceName; try { FileReader reader = new FileReader(new File(url)); BufferedReader br = new BufferedReader(reader); StringBuilder sb = new StringBuilder(); String line = br.readLine(); while (line != null) { sb.append(line); line = br.readLine(); } response.getOutputStream().write(sb.toString().getBytes()); response.flushBuffer(); } catch (IOException e) { e.printStackTrace(); } } }
其實現過程很簡單,就是先從路徑中分離出來資源uri,而後從static目錄下讀取文件,並輸出到前端。由於只作簡單演示,因此這裏只處理了文本類型的文件,圖片文件能夠作相似的處理。固然,咱們在實際中確定不會這麼作,Spring boot也確定有更好的解決辦法。不過這個辦法雖然有點笨,但確是最本質的東西,不管框架如何方便的幫咱們處理了這類問題,可是拋開框架,咱們依然要可以熟練的寫出一個web項目,只有知道其實現原理,你纔會在遇到問題時能駕輕就熟。如今咱們再來看看Spring boot對靜態資源的支持。java
2、Spring boot默認靜態資源訪問方式web
Spring boot默認對/**的訪問能夠直接訪問四個目錄下的文件:spring
classpath:/public/mvc
classpath:/resources/app
classpath:/static/框架
classpath:/META-INFO/resouces/webapp
咱們如今就在資源文件resources目錄下創建以下四個目錄:
注意藍色條下的資源文件夾resources與類路徑下的文件夾classpath:/resources是不一樣的,藍色條下的resources表明的是該目錄下的文件爲資源文件,在打包的時候會將該目錄下的文件所有打包的類路徑下,這個名稱是能夠改的,在pom.xml指定資源目錄便可:
<resources> <resource> <directory>src/main/resources</directory> </resource> </resources>
而類路徑下的resources是spring boot默認的靜態資源文件夾之一,和public、static以及MEAT-INFO/resources的功能相同。如今咱們重啓Spring boot就能夠經過
http://localhost:8080/1.html
http://localhost:8080/2.html
http://localhost:8080/3.html
http://localhost:8080/4.html
四個URL訪問到四個目錄下的靜態資源了。
3、自定義靜態資源目錄
經過第二節內容咱們已經知道了Spring boot默承認以訪問的靜態資源的目錄,可是你們確定會想,這個目錄是固定的嗎?咱們可不能夠本身定義靜態資源目錄?答案是確定的,咱們如今就來自定義一個靜態資源目錄,咱們定義一個images的目錄來存放圖片,全部/image/**的路徑都會訪問images目錄下的資源:
@Configuration public class ImageMvcConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/image/**") .addResourceLocations("classpath:/images/"); } }
這段代碼應該比較簡單,@Configuration標識一個配置類,這個在前面的文章中提到過屢次。WebMvcConfigurerAdapter是Spring提供的一個配置mvc的適配器,裏面有不少配置的方法,addResourceHandlers就是專門處理靜態資源的方法,其餘方法後續咱們還會講到。如今咱們在驗證上面的配置是否有效。我在images目錄下放了一張spring.jpg的圖片,如今咱們經過http://localhost:8080/image/spring.jpg來訪問圖片:
其實除了上面的辦法還有一種更簡單的辦法,就是直接在application.yml中配置便可:
spring: mvc: static-path-pattern: /image/** resources: static-locations: classpath:/images/
static-path-pattern:訪問模式,默認爲/**,多個能夠逗號分隔
static-locations:資源目錄,多個目錄逗號分隔,默認資源目錄爲classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
注意,這個配置會覆蓋Spring boot默認的靜態資源目錄,例如若是按示例中配置,則沒法再訪問static、public、resources等目錄下的資源了。
4、總結
本文主要給你們分享了Spring boot 對靜態資源的處理方式,Spring boot 默承認以訪問classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/四個目錄下的靜態資源,咱們也能夠根據本身的須要進行個性化配置。最後,須要說明一點的是,若是這四個目錄中存在相同名稱的資源,那會優先返回哪一個目錄下的資源呢?你們經過static-locations的默認值順序應該能猜到,默認狀況下,Spring boot會優先返回/META-INF/resources下的資源。固然,由於咱們能夠自定義static-locations的值,因此這個優先順序也是能夠調整的。