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 之前执行的拦截器对象。

相关推荐
Adolf_19931 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥1 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
海里真的有鱼1 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
工业甲酰苯胺2 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
新知图书2 小时前
Rust编程的作用域与所有权
开发语言·后端·rust
wn5313 小时前
【Go - 类型断言】
服务器·开发语言·后端·golang
bjzhang753 小时前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j
flying jiang3 小时前
Spring Boot 入门面试五道题
spring boot
小菜yh3 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存
希冀1233 小时前
【操作系统】1.2操作系统的发展与分类
后端