SpringBoot中的WebMvcConfigurer

SpringBoot中的WebMvcConfigurer


一、WebMvcConfigurer

  • WebMvcConfigurer 作为配置类,采用 JavaBean 的形式来代替传统的 XML 配置文件形式,进而针对框架个性化定制。就是 SpringMVC 的 XML 配置文件的 JavaConfig(编码)实现方式。自定义 Interceptor、ViewResolver、MessageConverter。WebMvcConfigurer 就是 JavaConfig 形式的 SpringMVC 的配置文件。
  • WebMvcConfigurer 是一个接口,需要自定义一个对象,实现接口并覆盖某个方法。
java 复制代码
public interface WebMvcConfigurer {
	// 帮助配置 HandlerMapping
	default void configurePathMatch(PathMatchConfigurer configurer) {}
	// 处理内容协商
	default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}
	// 异步请求
	default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}
	// 配置默认 Servlet
	default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
	// 配置内容转换器
	default void addFormatters(FormatterRegistry registry) {}
	// 配置拦截器
	default void addInterceptors(InterceptorRegistry registry) {}
	// 处理静态资源
	default void addResourceHandlers(ResourceHandlerRegistry registry) {}
	// 配置全局跨域
	default void addCorsMappings(CorsRegistry registry) {}
	// 配置视图页面跳转
	default void addViewControllers(ViewControllerRegistry registry) {}
	// 配置视图解析器
	default void configureViewResolvers(ViewResolverRegistry registry) {}
	// 自定义参数解析器,处理请求参数
	default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {}
	// 自定义控制器方法返回值处理器
	default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {}
	// 配置 HttpMessageConverters
	default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
	// 配置 HttpMessageConverters
	default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
	// 配置异常处理器
	default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
	// 扩展异常处理器
	default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}
	// JSR303 的自定义验证器
	@Nullable
	default Validator getValidator() {
		return null;
	}
	// 消息处理对象
	@Nullable
	default MessageCodesResolver getMessageCodesResolver() {
		return null;
	}
}

二、页面跳转控制器

  • SpringBoot 中使用页面视图,比如 Thymeleaf。要跳转显示某个页面,必须通过 Controller 对象。也就是我们需要创建一个 Controller,转发一个视图才行。如果我们现在需要显示多个页面,可以无需这个 controller。addViewControllers() 完成请求到视图跳转。

  • ① 创建一个视图:login.html

    html 复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录页面</title>
    </head>
    <body>
      <h1 style="color: red; text-align: center">欢迎来到登录页面!!!</h1>
    </body>
    </html>
  • ② 创建 SpringMVC 配置类

    java 复制代码
    @Configuration
    public class MvcSetting implements WebMvcConfigurer {
    	// 跳转页面视图
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/login").setViewName("/login");
        }
    }

③ 结果展示


三、数据格式化

1.Formatter<T>

  • Formatter<T> 是数据转换接口,将一种数据类型转换为另一种数据类型。与 Formatter<T> 功能类似的还有 Converter<S, T>。Formatter<T> 只能将 String 类型转为其他数据类型。 这点在 Web 应用中适用广泛。因为 Web 请求的所有参数都是 String 类型的,我们需要把 String 转为 Integer、Long、Date 等等。

  • Spring 中内置的一些 Formatter<T>:

    • DateFormatter:String 和 Date 之间的解析与格式化。
    • InetAddressFormatter:String 和 InetAddress 之间的解析与格式化。
    • PercentStyleFormatter:对百分数进行一个格式化。
    • NumberFormatter:String 和 Number 之间的解析与格式化。
  • 我们在使用 @DateTimeFormat、@Numberformat 注解时,就是通过 Formatter<T> 解析 String 类型到我们期望的 Date 或 Number 类型。

  • Formatter<T> 也是 Spring 的扩展点,我们处理特殊格式的请求数据时,能够自定义合适的 Formatter<T>,将请求的 String 数据转为我们的某个对象,使用这个对象更加方便我们后续的编码。

    java 复制代码
    public interface Formatter<T> extends Printer<T>, Parser<T> {
    }
  • Formatter<T> 是一个组合接口,没有自己的方法。内容来自 Printer<T> 和 parse<T> 两个接口。

    • Printer<T>:将 T 类型转为 String,格式化输出。

      java 复制代码
      @FunctionalInterface
      public interface Printer<T> {
      	String print(T object, Locale locale);
      }
    • Parser<T>:将 String 类型转为期望的 T 对象。

      java 复制代码
      @FunctionalInterface
      public interface Parser<T> {
      	T parse(String text, Locale locale) throws ParseException;
      }

2.内容转换器

  • 我们在实际的项目开发中,可能面对多种类型的项目,复杂程度有简单,有复杂的。特别是和硬件打交道的项目,数据的格式与一般的 name:jack,age:20 不同。数据有可能是一串数据 "1345;46;dfd;ASDS;12DF;df&12"

  • ① 自定义 Formatter

    java 复制代码
    public class DeviceInfoFormatter implements Formatter<List<String>> {
    
        @Override
        public List<String> parse(String text, Locale locale) throws ParseException {
            String[] infos = text.split(";");
            List<String> stringList = Arrays.asList(infos);
            return stringList;
        }
    
        @Override
        public String print(List<String> object, Locale locale) {
            return object.toString();
        }
    }
  • ② 登记内容转换器

    java 复制代码
    @Configuration
    public class MvcSetting implements WebMvcConfigurer {
        // 跳转视图页面控制器
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
    
            registry.addViewController("/login").setViewName("/login");
    
        }
        // 登记内容转换器
        @Override
        public void addFormatters(FormatterRegistry registry) {
            registry.addFormatter(new DeviceInfoFormatter());
        }
    }
  • ③ 创建 Controller 接收请求

    java 复制代码
    @Controller
    public class DeviceController {
        @ResponseBody
        @PostMapping("/device/postInfo")
        public String postDeviceInfo(@RequestParam("deviceInfo")List<String> list){
            return list.toString();
        }
    }
  • ④ 测试与结果展示


四、拦截器

  • HandlerIntercepter 接口和它的实现类被称为拦截器,是 SpringMVC 的一种对象。拦截器是 SpringMVC 框架提供的对象与 Servlet 无关。拦截器能够预先处理发给 Controller 的请求。可以决定请求是否被 Controller 处理。用户请求是先由 DispatchServlet 接收后,在 Controller 之前执行的拦截器对象。

相关推荐
AI多Agent协作实战派3 分钟前
AI多Agent协作系统实战(四十九):它说唤醒了agent,agent却还在睡觉
后端
用户7813667114454 分钟前
对象存储(RGW)架构详解
后端
Python私教5 分钟前
软件开发报价为什么能差 3 倍:需求范围、验收标准和变更成本怎么算
后端·python·架构
苏三说技术6 分钟前
为什么越来越多人用gRPC?
后端
渣渣盟6 分钟前
Nginx 从零到上手:Windows & Linux 双环境教程
linux·windows·nginx
MacroZheng8 分钟前
程序员看文档神器,装上它,看Spring官方文档就一目了然了!
java·人工智能·后端
想风9 分钟前
Claude Code 实用技巧工作坊 —— Boris Cherny
前端·后端·github
长栎10 分钟前
Java 17 的模式匹配,正在杀死访问者模式
后端
骇客野人12 分钟前
SpringBoot 接入 Kafka 完整实操步骤
spring boot·kafka·linq
风曳丷15 分钟前
# 03|恶意文本如何一路摸到工具按钮
后端