對於路徑問題,是讓我一直感到痛苦的事情,首先是因為我的眼高手低,感覺路徑這么簡單根本沒必要去看,但是昨天項目組長的冷嘲熱諷讓我無地自容:“你竟然連linux和window的路徑的區別都不知道,呵呵”。事情的起因是我在配置日志文件的時候,我不曉得window路徑下的根目錄是什么,於是我打開了cmd,想輸入cd /,但是發現cd /之后的路徑是盤符根目錄,woc這是不是根目錄,接下來就被無情的嘲諷了。言歸正傳,對於springboot的資源目錄我一直是莫名其妙的只有一個Resources目錄,那么它的目錄結構是怎樣的呢?我把我遇到的所有情況都記錄下來作為記憶。
一 、SpringBoot的資源目錄的分類
-1. static 存放靜態資源,比如靜態畫面,圖片,js等等

比如這里我們新建一個static.html,我們可以直接訪問到靜態目錄的資源

也可以使用Controller跳轉
@Controller
public class RedirectController {
@RequestMapping("/stc")
public String stc(){
return "static.html";
}
}

-2. templates 存放動態畫面等
templates下面存放的動態頁面不能通過url中輸入.html的方式直接訪問,需要通過請求服務器,在轉到動態畫面。
我們需要使用一種方式達到目的,就像是jsp一樣,使用數據加模板的形式進行渲染,但是jsp不利於前后端分離的開發(雖然我覺得使用java寫前端很安逸,但是Springboot不建議使用jsp)
官方建議的是使用Thymeleaf來做動態界面,這里我使用的是freemaker,springboot也是集成了freemaker的。
這是我templates下面

首先引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
然后在application.yml進行簡單的配置,這個配置的作用在后面會講
spring:
freemarker:
suffix: .html
配置完成以后,我們先試驗一下直接訪問能否成功

這里報的是404,顯然沒有找到
那我們實驗下通過controller的方式
@RequestMapping("tmplts")
public String tmplts(){
return "template";
}
注意這里的return不可以帶.html,前面我們對freemaker進行的配置中給他添加了后綴名為.html

現在已經訪問成功了。那么到現在為止,最最基本的使用已經掌握了。接下來講解一些其他的。
二、自定義靜態資源訪問路徑以及springboot默認的配置
首先我們講解下springboot資源目錄下的幾種靜態目錄,
/META-INF/resources
resources
static
public

這幾種有什么作用呢?這幾個目錄都是springboot默認提供的靜態資源訪問路徑,他們的根路徑都是“/”
什么意思呢?就是說在訪問這些目錄下面文件的時候,他們的訪問目錄和resources下面文件的訪問目錄是一樣的,就比如我們之前訪問的目錄都沒有加static之類的
那么久大有可為了,我們給不同的目錄分配不同的功能,使代碼看起來更加清晰明了
既然如此,萬一這些目錄下面的文件重名了會如何執行呢?他們之間是有有限順序的,這個順序默認是/META-INF/resources>resources>static>public,但是后面會說如何更改
那么還有一個問題是,如果我想自己創建一個目錄也是可以通過訪問根路徑的方式訪問該目錄下的資源,那我該怎么辦?接下來就是正題。
首先我們有兩種方式進行配置,但他們的本質是一樣的,我這里創建了一個test目錄
-1 配置application.yml的方式
spring:
mvc:
static-path-pattern: /**
resources:
static-locations: classpath:/test/,classpath:/static/js/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
這里我們配置了兩部分,
第一:static-path-pattern,這個配置項是告訴springboot,應該以什么樣的方式去尋找資源。默認配置為 /* 。換句話說,只有靜態資源滿足什么樣的匹配條件,Spring Boot才會處理靜態資源請求,我們也可配置成 /user/**,這樣我們必須輸入/user/index.html才能訪問到這些目錄下的資源,
第二:spring.resources.static-locations,這個配置項是告訴springboot去哪找資源,根據前后關系確定優先級,也就是說如果/META-INF/resources/目錄和/resources都有一個index.html,那么根據默認的優先級,會去訪問/test/下的資源。(tips:當更改了此項配置,默認的項目也需要加上,不然會被覆蓋,詳情可見源碼)
那么我們來實驗一下:我在每個目錄下面都寫了index.html

當我訪問index.html的時候,優先級最高的就是test目錄下的資源

-2 使用配置類的方式
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/test/");
super.addResourceHandlers(registry);
}
}
這種方式需要繼承WebMvcConfigurerAdapter類,並重寫addResourceHandlers方法,這里的設置跟yml配置基本相似的
https://blog.csdn.net/qq_34797335/article/details/80194137這篇文章可以看看更加詳細的源碼講解
