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 数据转为我们的某个对象,使用这个对象更加方便我们后续的编码。
javapublic 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
javapublic 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 之前执行的拦截器对象。