springboot怎么訪問靜態資源


springboot工程,是沒有webapp文件夾的,靜態文件放在src/main/resources/static文件夾下即可,模板文件放在src/main/resources/templates下。

 

1. 通常有的文件夾

在resources文件夾下建立三個文件夾:
1、public
2、static
3、templates
實驗結果一:
在public文件夾下的html文件可以通過瀏覽器中輸入文件+后綴名的方式直接訪問的。static和templates中不能直接訪問。
實驗結果二:
在配置了相應的視圖解析器以后,templates中的文件可以通過控制器進行訪問的。並且不同的視圖解析器只能訪問對應的視圖。比如:thymeleaf視圖解析器,只能訪問.html的頁面。velocity的解析器只能訪問.vm的頁面。
實驗結論推測:
一、public文件夾,就相當於在eclipse的web項目中的web-inf文件夾外的文件,是不需要通過服務器內部進行訪問的。
二、templates文件夾,是放置模板文件的,因此需要視圖解析器來解析它。所以必須通過服務器內部進行訪問,也就是要走控制器--服務--視圖解析器這個流程才行。
三、static文件夾,既不能直接訪問,也不能通過服務器訪問到。因此,這個文件夾,可能是放一些css、圖片這樣的文件供服務器內部引用。

 

2. 通常的訪問方式

通常來說,不可以通過文件名.后綴的方式來直接訪問web靜態資源,至少目前我還沒發現怎么這樣來直接訪問。
因此,我們通常是通過控制器的跳轉來實現頁面的訪問。
通常頁面會被放在templates、static、public這樣的靜態目錄下。
我們跳轉頁面的時候,需要用到@Controlller注釋,在方法中返回一個頁面名稱的字符串。
通常,要跳轉html頁面的話,我們在pom.xml加入thymeleaf的dependency。
SpringBoot就會為我們配置thymeleaf的ViewResolver來解析html后綴結尾的頁面。
而如果,我們加入velocity這樣的dependency,那么SpringBoot就會為我們自動配置velocity模板的ViewResover。
就可以解析以vm結尾的視圖。
當然,這幾種視圖解析器是不能混用的比如velocity的視圖解析器並不能解析html的頁面。同樣thymeleaf的視圖
解析器也並不能解析html頁面。

 

3. 總結

  第一,我在項目里吧html文件放到了  springboot 的 resource 文件夾下的 templates 文件夾下,這是因為我想在 此文件夾下的 html 代碼當中引用 th等標簽,

所以如果我們放在這里了,記得要在pom.xml 當中引入  thymeleaf  的依賴 : 否則界面的標簽解析不了,會報錯

  

  

  第二,我在項目當中 也吧 css,js 放在 static 文件夾下,然后我運行項目發現 訪問不了 html 跟 html 當中的css,這個時候我很清除我的文件夾沒放錯位子,那么就

可能是系統的自身指定策略了,首先,我們訪問頁面可能被攔截器攔住了,所以第一去掉攔截器,第二看 application.properties 當中是否寫了一些奇怪的設置,第三,

是不是我們在代碼的MVC的配置上又指定了策略,下面我就貼圖給大家看看,若是為了測試需要,到底要注意哪些東西 : 

  1. 是否被攔截器 攔截了 : 

  

  如上圖我就被攔截到了沒有傳入 header 對應的信息,所以不能繼續了。

  2. 是否是 application.properties 指定錯了 : 

  

  3. 是否是 我們寫了關於 nvc 的 configuration類,從而改變了策略,在這里提一下可以有2種方式來改變: 

  第一種可以繼承WebMvcConfigurerAdapter,當然如果是1.8+WebMvcConfigurerAdapter這個類以及過時了,可以直接實現WebMvcConfigurer接口,然后重寫addInterceptors來添加攔截器:

   

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor()).addPathPatterns("/user/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }
 
}

  或者還是繼承WebMvcConfigurationSupport,然后重寫addResourceHandlers方法:

  

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
 
    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new UserInterceptor()).addPathPatterns("/user/**");
        super.addInterceptors(registry);
    }
     
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        super.addResourceHandlers(registry);
    }
     
}

  看看我這里,其實被人家改了,看我這里代碼:

  

  

主要是我這里為了app打包,就改了這里的策略,而我現在做實驗,改static的就OK了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM