java路徑問題:springboot的前段靜態資源路徑、java後端讀取文件路徑、直接訪問html

路徑問題!路徑問題!路徑問題!

這個問題坑我兩次了,這次必須整理一下。杜絕在此入坑,也祝各位碼農們出坑。

不過需要說的地方還挺多的,我儘量精簡着說。

 

來,TMD走起。

 

大概內容:

1、相對路徑和絕對路徑

2、springboot項目web中前段靜態資源的路徑配置

3、靜態文件路徑配置(包括java後端讀取文件路徑)

 

走:

一、相對路徑和絕對路徑(簡單一說)

絕對路徑:絕對路徑就是完整的路徑。如:F:\workspace\idea\diamond

相對路徑:由這個文件所在的路徑引起的跟其它文件(或文件夾)的路徑關係。如:idea\diamond

提一下,斜槓“/”和反斜槓“\”:

    在 java 中,文件的路徑一般用 /
    如果是 windows 系統環境,那麼路徑一般使用 \,但是 \ 又需要轉義,所以我們會看到很多使用 \\ 的情況
    windows 系統也可以使用 /,混用 \\ 和 / 也是可以的
    如果是 linux、unix 或 macOS 等系統,路徑一般用 /
    總結:由於 / 在不同系統環境中都可以生效,所以最好使用這個。

二、web中前段靜態資源的路徑配置(springboot爲例)

先來一段配置代碼,以yml爲例。(properties相同,只是回車換位點.了而已)

spring:
  thymeleaf:
    mode: HTML5
    encoding: UTF-8
    suffix: .html
    prefix: classpath:/templates/
    cache: false
    servlet:
      content-type: text/html
  mvc:
    static-path-pattern: /static/** #添加後靜態資源必須以/static開頭

目錄結構:

1、配置controller返回html的前綴後綴
   配置文件中的“ suffix: .html ”是來配置controller中返回值得後綴;

                           “prefix: classpath:/templates/”是配置前綴,也是配置返回值的起始路徑的。

如上配置,則controller返回值如果爲字符串“hello"的話,就相當於返回了,classpath:/templates/hello.html,控制層會找到這個文件並返回給前段。

2、前段靜態資源路徑格式配置。(這裏管的是靜態資源路徑啊)

spring:
  mvc:
    static-path-pattern: /static/** #添加後靜態資源必須以/static開頭

配製了static-path-pattern: /static/**之後,前段資源的路徑必須以static開頭才能訪問到,如下

<script src="static/layui/layui.all.js"></script>
<script src="/static/js/qrcode.js"></script>

以上兩種寫法(加上static/或者/static/)均可以。

當把這個配置項除掉時,則不加static進行訪問。測試如下:

註釋配置項:

#  mvc:
#    static-path-pattern: /static/** #添加後靜態資源必須以/static開頭

測試內容及結果:(加上static/或者/static/則訪問不到,路徑應從static下開始寫)

<script src="/layui/layui.all.js"></script><!--可以反問-->
<script src="layui/layui.all.js"></script><!--可以反問-->
<script src="static/layui/layui.all.js"></script><!--不可以反問-->
<script src="/static/layui/layui.all.js"></script><!--不可以反問-->

重點來了!

三、靜態文件路徑配置

配置項(如下配置其實不用配置):

spring:
  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
 

 

以上配置沒有任何意義,爲啥囊,往下走↓↓↓↓↓↓↓

1、spring boot默認加載文件的路徑:

  1. /META-INF/resources/
  2. /resources/
  3. /static/
  4. /public/

可以從一下springboot源碼看出來,

這個與我們上述配置結果是一樣的,但我們不添加spring.resource.static-locations配製時,springboot默認文件加載路徑就是上述4個地方,springboot會依次去4個目錄下找文件。先找到爲準,就不在往下找了。

那麼,還要這個配置文件幹啥:

當然是特殊情況存在的時候啊,對吧。

比如:

2、應用

注意:spring.resources.static-locations與spring.mvc.static-path-pattern是搭配使用的。比如spring.mvc.static-path-pattern配置爲/static/**則url地址也一樣要多加上static。以下①、②適用。③沒去驗證。

①訪問項目外的文件。如:我在4個默認項後添加了“,file:C:/Users/groot/Desktop/image/”

spring:
  thymeleaf:
    mode: HTML5
    encoding: UTF-8
    suffix: .html
    prefix: classpath:/templates/
    cache: false
    servlet:
      content-type: text/html
  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:C:/Users/groot/Desktop/image/

我就可以通過瀏覽器輸入url:http://localhost:8080/timg.jpg直接訪問到C:/Users/groot/Desktop/image/下的文件了。

注意:如果前面配製了spring.mvc.static-path-pattern: /static/**的話url地址就要輸入http://localhost:8080/static/timg.jpg纔行。

圖片存放位置:

 

②訪問項目內的文件(比如不需要controller直接訪問html或者圖片等),還是很實用的。

實現方法:

Ⅰ 、直接把文件放在resources/static下。(springboot默認的路徑)

Ⅱ、增加static-locations配置項。如,我想直接訪問resources\templates下的html我就在配置項中增加了,classpath:/templates/。

spring:
  thymeleaf:
    mode: HTML5
    encoding: UTF-8
    suffix: .html
    prefix: classpath:/templates/
    cache: false
    servlet:
      content-type: text/html
  resources:
    static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/templates/

目錄結構:

訪問地址:http://localhost:8080/reportDetail.html

效果:

③java代碼中獲取文件地址怎麼寫

Ⅰ 、獲取靜態文件配置下的文件

配置文件中spring.resources.static-locations項直接不配。或者配置默認的4項。

讀取目標文件的位置:

java代碼中位置的寫法和結果如下:(這裏是在導出excel是輸入模板的路徑,其他情況下完全相同)

        params = new TemplateExportParams("\\templates\\excel\\B-N-Fuji.xls", true);//√可以讀到
//        params = new TemplateExportParams("/templates/excel/B-N-Fuji.xls", true);//x讀不到
//        params = new TemplateExportParams("templates/excel/B-N-Fuji.xls", true);//√可以讀到

Ⅱ、獲取src下的文件

竟然可以直接獲取src下的文件,並且還是相對路徑的寫法。0.0太黑了。難道是java默認src就是根?如D:盤一樣前邊不需要斜槓/?沒研究過。望大俠告知。

目標文件:

 

java代碼中位置的寫法和結果如下:(這裏是在導出excel是輸入模板的路徑,其他情況下完全相同)

//        params = new TemplateExportParams("/excelsrc/B-N-Fuji.xls", true);//x找不到
//        params = new TemplateExportParams("\\excelsrc\\B-N-Fuji.xls", true);//x找不到
//        params = new TemplateExportParams("/src/excelsrc/B-N-Fuji.xls", true);//x找不到
        params = new TemplateExportParams("src/excelsrc/B-N-Fuji.xls", true);//√可以找到

Ⅲ、獲取自定義位置的文件

     可以寫絕對路徑、也可以項上邊配置靜態文件路徑一樣配置好了之後,使用相對路徑。就不囉嗦了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章