iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
Software Development

我在 Spring Boot 3 裡面挖呀挖呀挖系列 第 17

Day16 - customize static content

  • 分享至 

  • xImage
  •  

Day16 - customize static content

前言

昨日我們看到Spring Boot如何幫我們配置相關靜態資源,那麼如自定義組件來符合我們的使用呢,今天就來看看如何做吧

專案建立

create module

https://ithelp.ithome.com.tw/upload/images/20231001/201280849OZIDbUukP.png
https://ithelp.ithome.com.tw/upload/images/20231001/20128084pmkEMKK0kD.png

pom加入jquery webjars

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.7.1</version>
</dependency>

customize static content

配置方式

  1. spring.mvc:靜態資源訪問前綴路徑
  2. spring.web:
    • 靜態資源目錄
    • 靜態資源cache strategy
範例1
spring:
  web:
    resources:
      static-locations: classpath:/a/,classpath:/b/,classpath:/static/ #設定靜態資源文件位置
      use-last-modified: true #使用資源last-modified時間,來比對資源是否異動相同則返回304
      cache:
        cachecontrol:
          cache-public: true #共享緩存
          max-age: '7200'  #此資源最大緩存時間7200秒
        period: 3600  #當有cachecontrol時會失效

在resource資料夾下建立a與b資料夾並放置圖片
https://ithelp.ithome.com.tw/upload/images/20231001/20128084BwApdjYC8d.png
訪問結果
https://ithelp.ithome.com.tw/upload/images/20231001/20128084XwtENoV5OQ.png
https://ithelp.ithome.com.tw/upload/images/20231001/201280843tG1hFFNjq.png

範例2

webjars是將前端資源(ex.jQuery、Bootstrap等)打包成jar,方便我們透過maven進行管理

spring:
  mvc:
    static-path-pattern:  /static/**  #加入訪問靜態資源路徑
    webjars-path-pattern: /james/**   #自訂義webjars路徑前綴,預設webjars
  

https://ithelp.ithome.com.tw/upload/images/20231001/20128084hQ2GMLuWwg.png
https://ithelp.ithome.com.tw/upload/images/20231001/20128084oogur0Llcw.png

代碼配置

容器中只要有WebMvcConfigurer組件,配置底層的行為就會生效

方法1 繼承WebMvcConfigurer
@Configuration //配置類
public class MyConfig implements WebMvcConfigurer {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/a/","classpath:/b/")
                .setCacheControl(CacheControl.maxAge(3333, TimeUnit.SECONDS));
    }
}

https://ithelp.ithome.com.tw/upload/images/20231001/20128084a9BGSbeQc4.png

方法2 @Bean注入WebMvcConfigurer
@Configuration
public class MyConfig  /*implements WebMvcConfigurer*/ {

    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addResourceHandlers(ResourceHandlerRegistry registry) {
                registry.addResourceHandler("/static/**")
                        .addResourceLocations("classpath:/a/", "classpath:/b/")
                        .setCacheControl(CacheControl.maxAge(4567, TimeUnit.SECONDS));
            }
        };
    }

}

為什麼容器放一個WebMvcConfigurer就會配置底層行為

  1. WebMvcAutoConfiguration是一個自動配置類,裡面有一個EnableWebMvcConfiguration
  2. EnableWebMvcConfiguration繼承了DelegatingWebMvcConfiguration
  3. DelegatingWebMvcConfiguration利用@Autowire將容器中所有的WebMvcConfiguration注入近來
  4. 別人調用DelegatingWebMvcConfiguration的方法配置底層規則,而他調用所有的WebMvcConfigurer的配置底層方法

Reference


上一篇
Day15 - Static Content
下一篇
Day17 - Path Matching and Content Negotiation
系列文
我在 Spring Boot 3 裡面挖呀挖呀挖31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言