SpringBoot第八集:靜態資源與首頁定制(2021最新最易懂)


SpringBoot第八集:靜態資源與首頁定制(2021最新最易懂)

問題

  SpringBoot構建的項目結構如下:沒有webapp目錄,沒有WEB-INF等目錄,那么如果開發web項目,項目資源放在那里呢?

WEB項目資源:靜態資源/動態資源。例如:css,圖片,jsp,模板引擎等。

一.SpringBoot工程靜態資源處理

  實際上,我們新建的SpringBoot工程默認提供的兩個目錄就是存放靜態資源的

  src/main/resources/static:靜態資源默認存放目錄(img,css,js,html等)

  src/main/resources/templates:模板引擎資源默認存放目錄(freemarker,Thymeleaf等)

  當然遠不止於此:查看SpringBoot源碼WebMvcAutoConfiguration類(上一集附錄中說到,所有自動裝配的源碼類都是以XxxAutoConfiguration命名的,WEB開發自動裝配類就是WebMvcAutoConfiguration)Eclipse快捷鍵:Ctrol+Shift+T搜索類WebMvcAutoConfiguration源碼如下:

 1 /**
 2 * 添加資源的處理器方法(參數registry:資源處理器對象)
 3 */
 4 @Override
 5 public void addResourceHandlers(ResourceHandlerRegistry registry) {
 6     // 判斷資源地址是否被自定義(在核心配置文件中這樣配置就可以自定義靜態資源地址:spring.mvc.static-path-pattern=/xsge/)
 7     if (!this.resourceProperties.isAddMappings()) {
 8         // 如果自定義資源地址后,則禁用默認資源配置:就不用看下面的源碼了
 9         logger.debug("Default resource handling disabled");
10         return;// 結束
11     }
12     // 利用resourceProperties(資源配置屬性對象)獲取緩存控制(在這里可以查看resourceProperties源碼可以看到自動裝配的默認資源地址)
13     CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();
14     // 如果存在映射地址/webjars/**(簡單來說,SpringBoot可以識別/webjars/**目錄下的所有資源)
15     if (!registry.hasMappingForPattern("/webjars/**")) {
16         customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**")
17                 // 當訪問/webjars/**地址下的文件時,實際將地址映射到/META-INF/resources/webjars/目錄下
18                 /**
19                 * 例如:http://localhost:8080/webjars/...
20                 * 實際加載的地址:http://localhost:8080/META-INF/resources/webjars/....
21                 */
22                 .addResourceLocations("classpath:/META-INF/resources/webjars/")
23                 .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
24                 /**
25                 * webjars是個啥?是一種靜態資源的Mavne引入方式。
26                 * 例如JQuery引入時,可以選擇離線文件,在線引入,也可以使用Mavne依賴引入。
27                 * 打開webjars官網:https://www.webjars.org/,即可選擇想引入的web依賴
28                 * 例如:需要引入JQuery,修改pom,加如依賴如下。
29                 * <dependency>
30                 * <groupId>org.webjars</groupId>
31                 * <artifactId>jquery</artifactId>
32                 * <version>3.5.1</version>
33                 * </dependency>
34                 * 頁面請求地址:http://localhost:8080/webjars/jquery/3.5.1/jquery.js就可以請求到
35                 * 當然實際的訪問地址為:http://localhost:8080/META-INF/resources/webjars/jquery/3.5.1/jquery.js
36                 */
37     }
38     // 獲取靜態路徑路徑(在這里可以查getStaticPathPattern源碼獲取的靜態資源路徑是什么/**:項目資源下的任意路徑)
39     String staticPathPattern = this.mvcProperties.getStaticPathPattern();
40     // 判斷是否存在靜態資源路徑映射
41     if (!registry.hasMappingForPattern(staticPathPattern)) {
42         // 如果不存在,則添加靜態資源映射
43         customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern)
44                 //添加資源映射地址(this.resourceProperties獲取resourceProperties配置的可用靜態資源地址)
45                 .addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations()))
46                 .setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));
47     }
48 }
49 
50 
51 @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
52 public class ResourceProperties {
53     // 資源屬性配置,可自動裝配讀取的地址有:resources,static,public等
54     private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/",
55     "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
56     /**
57      * 這些默認資源地址
58      * classpath:/META-INF/resources/:這個地址當以Maven方式引入webjars依賴時,Maven依賴中存在(這個不屬於我們手動配置的,可以暫忽略不計)
59      * classpath:/resources/:在項目src/main/resources還可以在生成目錄resources,屬於靜態資源可識別目錄(需手動新建)
60      * classpath:/static/:在項目src/main/resources還可以在生成目錄static,屬於靜態資源默認目錄(項目新建后默認已創建的目錄)
61      * classpath:/public/:在項目src/main/resources還可以在生成目錄public,屬於靜態資源可識別目錄(需手動新建)
62      * 當每個目錄都存在時,加載的優先級如下:
63      *   resources > static(默認目錄) > public
64      * 通常:
65      * resources:存放上傳下載的文件
66      * static:存放項目靜態資源(img/js/css等)
67      * public:存放公共資源(比如離線方式導入的JQuery)
68      */

總結:

  1.靜態資源可以放的目錄有:

    classpath:/resources/:實際地址為src/main/resources/resources,目錄須手動建立

    classpath:/static/:實際地址為src/main/resources/static,目錄由項目默認新建

    classpath:/public/:實際地址為src/main/resources/public,目錄須手動建立

    classpath:/**:實際地址為src/main/resources/下,新增任意目錄作為資源地址,通常用於自定義地址

新增自定義靜態資源地址xsge后,要求必須在application.yml配置文件中聲明:

#修改默認的靜態資源目錄(properties文件配置時多值使逗號分隔,yml配置多值即可參考第二集
spring. resour ces.static-locations = classpath:/static/, classpath:/site/

 

需要注意的是,一旦自定義了靜態資源地址,那么默認的資源地址resources/static/public會立即失效。

  2.訪問方式:靜態資源默認訪問的根路徑都為http://localhost:8080/……

    例如:在resources/static/public任意目錄下存放xsge.jpg

    訪問地址都是:http://localhost:8080/xsge.jpg

防止有些人基礎不扎實,在這里提示,默認的訪問路徑是http://localhost:8080/xsge.jpg,即applicaiton.yml配置文件沒有自定義url是前提。如果你在applicaiton.yml配置文件中定制了訪問地址(server.servlet.context-path: /web),那么就需要靈活變動了(http://localhost:8080/web/xsge.jpg)。

當然也可以通過修改匹配方式實現路徑的不一樣:

#在yml配置文件中修該靜態文件請求匹配方式
spring. mvc. static-path-pattern=/image/**

例如:

默認訪問地址:http://localhost:8080/xsge.jpg

修改默認請求匹配方式后:http://localhost:8080/image/xsge.jpg

  3.如果三個靜態資源地址中存在相同的文件時。

    加載優先級:resources > static(默認目錄) > public

2.首頁定制

  在沒有整合SpringBoot之前,我們新建的WEB項目,在WEB-INF目錄下都會有一個核心配置文件web.xml。我們可以在web.xml中配置標簽<welcome-list>,通過該配置定制默認首頁。然后SpringBoot項目中沒有webapp目錄更沒有WEB-INF/web.xml文件的,那么該如何定制項目的默認首頁呢?

  SpringBoot框架在整合時,幫我們默認提供了首頁處理器方法。同上查看WebMvcAutoConfiguration源碼如下:

 1 /**
 2  * 歡迎頁面映射處理器方法
 3  */
 4 @Bean    // 交給Spring容器管理,即:Spring容器加載,該程序也執行了
 5 public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
 6         FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
 7     WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
 8             new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
 9             this.mvcProperties.getStaticPathPattern());
10     welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
11     welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
12     return welcomePageHandlerMapping;
13 }
14 /**
15  * 獲取歡迎首頁的方法
16  */
17 private Optional<Resource> getWelcomePage() {
18     String[] locations = getResourceLocations(this.resourceProperties.getStaticLocations());
19     return Arrays.stream(locations).map(this::getIndexHtml).filter(this::isReadable).findFirst();
20 }
21 /**
22  * 獲取加載的首頁地址。
23  * 返回值為:資源地址/index.html(資源地址默認為resource/static/public)
24  */
25 private Resource getIndexHtml(String location) {
26     return this.resourceLoader.getResource(location + "index.html");
27 }

  總結:

  1.SpringBoot定制默認首頁,將首頁文件命名為index.html,且放入到resource/static/public的任意目錄下即可。

  2.SpringBoot-2.1.0版本以前還可以自定義網站主題圖標ico。只要在appliction.yml中配置開啟默認圖標(spring.mvc.favicon.enabled : false),並將命名為favicon.ico的圖標放在resource/static/public的任意目錄下即可實現。

ICO圖標定制說明:出於安全考慮,SpringBoot2.1.0版本后就舍棄了自定義網站主題圖標ico的功能。(除此之外個人理解頁面中直接使用鏈接方式更好一些)

首頁定制說明:一般情況下,我們很少直接使用html文件作為模板,往往都是JSP,freemarker,Thymeleaf等,當然使用這些模板文件時,通常將文件放在templates目錄下(除JSP外,因為SpringBoot默認不支持JSP模板),需要注意的是該目錄下的資源,不能像靜態資源地址一樣直接訪問,必須提供控制器跳轉和模板引擎支持。(所以請看后續)

 


免責聲明!

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



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