深入淺出webmvcconfigurer

一、簡介

WebMvcConfigurer是Spring MVC提供的一個接口,在使用Spring Boot構建應用程序時常用到。它提供一種擴展Spring MVC配置的方式,覆蓋默認的Spring MVC自動配置,從而實現更加自定義化的功能。官方文檔中對WebMvcConfigurer的描述如下:

    public interface WebMvcConfigurer {
        default void configureViewResolvers(ViewResolverRegistry registry) {
        }
        default void addResourceHandlers(ResourceHandlerRegistry registry) {
        }
        default void configureMessageConverters(List<HttpMessageConverter>converters) {
        }
        default void extendMessageConverters(List<HttpMessageConverter>converters) {
        }
        default Validator getValidator() { 
            return null;
        }
        default MessageCodesResolver getMessageCodesResolver() {
            return null;
        }
        default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        }
        default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
        }
        default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        }
        default void addFormatters(FormatterRegistry registry) {
        }
        default void addInterceptors(InterceptorRegistry registry) {
        }
        default void addCorsMappings(CorsRegistry registry) {
        }
        default void configurePathMatch(PathMatchConfigurer configurer) {
        }
        default void configureViewHandling(ViewResolverRegistry registry) {
        }
        default void configureRedirectHandling(RedirectViewControllerRegistry registry) {
        }
        default void configureHandlerExceptionResolvers(List resolvers) {
        }
        default void extendHandlerExceptionResolvers(List resolvers) {
        }
        default void addArgumentResolvers(List resolvers) {
        }
        default void addReturnValueHandlers(List handlers) {
        }
        default void configureMessageConverters(List<HttpMessageConverter> converters) {
        }
        default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        }
}

如上所示,接口提供了多個方法,可以實現對Spring MVC的自定義配置,這使得開發者能夠靈活地擴展和改變Spring Boot應用程序的行為。

二、實戰演示

接下來將通過代碼演示,對WebMvcConfigurer的常見用法進行講解。

1. 修改默認的ViewResolver

在Spring Boot中,默認配置的ViewResolver是InternalResourceViewResolver,它的作用是將JSP文件名字映射為物理視圖文件的路徑。

通過實現WebMvcConfigurer接口,可以輕鬆更改該默認配置:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/WEB-INF/views/", ".jsp");
    }
}

舉例的Spring Boot配置文件如下:

spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

以上兩種方法都是實現Spring Boot默認的配置實現技術靈活修改的一種方式。對於修改默認的ViewResolver,可以從上面這兩種方法任選其一。

2. 添加靜態資源目錄

Spring Boot默認讀取靜態文件的目錄是src/main/resources/static,這個可以在application.properties文件中配置,如下:

spring.resources.static-locations=classpath:/static/

但是,如果我們把靜態文檔放在了WEB-INF目錄下的static目錄中,此時使用上述配置時是不能讀取到相關的資源,那麼修改WebMvcConfigurer就是一個核心的實現:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/WEB-INF/static/");
    }
}

以上是在配置類中添加方法addResourceHandlers,配置靜態資源目錄所需的做法。

3. 添加攔截器

當我們需要統計請求數、執行時間等方面的監控指標時,就可以使用Spring Boot提供的攔截器來實現。在WebMvcConfigurer中添加攔截器有兩種方式,一種是創建一個對象,將其加入到Spring容器中,然後將其注入到InterceptorRegistry中;另一種是直接把攔截器加入到InterceptorRegistry中,這裡講解第一種方式:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Bean
    public MyInterceptor myInterceptor() {
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
    }
}

其中,MyInterceptor是一個實現了HandlerInterceptor接口的攔截器類。

4. 配置Content-Type

在RESTful API中,客戶端需要訪問不同的接口返回各種不同的數據格式。 Spring Boot提供了通過Content-Type來處理各種數據格式的方法。如下所示的配置,可以將返回JSON格式的數據:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter> converters) {
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        List mediaTypes = new ArrayList();
        mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
        converter.setSupportedMediaTypes(mediaTypes);
        converters.add(converter);
    }
}

通過上述配置,可以將返回的數據格式設置成JSON形式。

5. 高級類型驗證

在Spring Boot應用程序中,要驗證請求中的參數和對象的正確性,可以使用Spring Boot提供的註解或JSR-303 (@NotBlank、@NotNull等)。還可以擴展高級驗證,例如自定義驗證規則,可以按如下所示進行配置:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private MyValidator myValidator;

    @Override
    public Validator getValidator() {
        return myValidator;
    }
}

這裡的MyValidator類實現了Spring提供的Validator接口。通過實現自定義的驗證規則,可以在應用程序中攔截並報告錯誤。

三、總結

通過WebMvcConfigurer,開發者可以很方便地進行Spring MVC的自定義配置,覆蓋默認配置。這使得實現更加自定義化的功能變得便捷,同時也提高了應用程序的擴展性和靈活性。本文從多個方面對WebMvcConfigurer進行了詳細的解釋,希望對讀者有所幫助。

原創文章,作者:APIQC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/333610.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
APIQC的頭像APIQC
上一篇 2025-02-01 13:34
下一篇 2025-02-01 13:34

相關推薦

  • 深入淺出統計學

    統計學是一門關於收集、分析、解釋和呈現數據的學科。它在各行各業都有廣泛應用,包括社會科學、醫學、自然科學、商業、經濟學、政治學等等。深入淺出統計學是指想要學習統計學的人能夠理解統計…

    編程 2025-04-25
  • 深入淺出torch.autograd

    一、介紹autograd torch.autograd 模塊是 PyTorch 中的自動微分引擎。它支持任意數量的計算圖,可以自動執行前向傳遞、後向傳遞和計算梯度,同時提供很多有用…

    編程 2025-04-24
  • 深入淺出SQL佔位符

    一、什麼是SQL佔位符 SQL佔位符是一種佔用SQL語句中某些值的標記或佔位符。當執行SQL時,將使用該標記替換為實際的值,並將這些值傳遞給查詢。SQL佔位符使查詢更加安全,防止S…

    編程 2025-04-24
  • 深入淺出ThinkPHP框架

    一、簡介 ThinkPHP是一款開源的PHP框架,它遵循Apache2開源協議發布。ThinkPHP具有快速的開發速度、簡便的使用方式、良好的擴展性和豐富的功能特性。它的核心思想是…

    編程 2025-04-24
  • 深入淺出:理解nginx unknown directive

    一、概述 nginx是目前使用非常廣泛的Web服務器之一,它可以運行在Linux、Windows等不同的操作系統平台上,支持高並發、高擴展性等特性。然而,在使用nginx時,有時候…

    編程 2025-04-24
  • 深入淺出arthas火焰圖

    arthas是一個非常方便的Java診斷工具,包括很多功能,例如JVM診斷、應用診斷、Spring應用診斷等。arthas使診斷問題變得更加容易和準確,因此被廣泛地使用。artha…

    編程 2025-04-24
  • 深入淺出AWK -v參數

    一、功能介紹 AWK是一種強大的文本處理工具,它可以用於數據分析、報告生成、日誌分析等多個領域。其中,-v參數是AWK中一個非常有用的參數,它用於定義一個變量並賦值。下面讓我們詳細…

    編程 2025-04-24
  • 深入淺出Markdown文字顏色

    一、Markdown文字顏色的背景 Markdown是一種輕量級標記語言,由於其簡單易學、易讀易寫,被廣泛應用於博客、文檔、代碼注釋等場景。Markdown支持使用HTML標籤,因…

    編程 2025-04-23
  • 深入淺出runafter——異步任務調度器的實現

    一、runafter是什麼? runafter是一個基於JavaScript實現的異步任務調度器,可以幫助開發人員高效地管理異步任務。利用runafter,開發人員可以輕鬆地定義和…

    編程 2025-04-23
  • 深入淺出TermQuery

    一、TermQuery概述 TermQuery是Lucene中最基本、最簡單、最常見的查詢方法之一。它完全符合其名字,意味着只能對一個單詞進行查詢。 TermQuery可以用於搜索…

    編程 2025-04-23

發表回復

登錄後才能評論