Spring Boot實戰:靜態資源處理

  前兩章咱們分享了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的值,因此這個優先順序也是能夠調整的。

相關文章
相關標籤/搜索