SpringBoot中的WebMvcConfigurer
- 一、WebMvcConfigurer
- 二、页面跳转控制器
- 三、数据格式化
- 1.Formatter\<T>
- 2.内容转换器
- 四、拦截器
一、WebMvcConfigurer
- WebMvcConfigurer 作为配置类,采用 JavaBean 的形式来代替传统的 XML 配置文件形式,进而针对框架个性化定制。就是 SpringMVC 的 XML 配置文件的 JavaConfig(编码)实现方式。自定义 Interceptor、ViewResolver、MessageConverter。WebMvcConfigurer 就是 JavaConfig 形式的 SpringMVC 的配置文件。
- WebMvcConfigurer 是一个接口,需要自定义一个对象,实现接口并覆盖某个方法。
public interface WebMvcConfigurer {// 帮助配置 HandlerMappingdefault void configurePathMatch(PathMatchConfigurer configurer) {}// 处理内容协商default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}// 异步请求default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}// 配置默认 Servletdefault 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) {}// 配置 HttpMessageConvertersdefault void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}// 配置 HttpMessageConvertersdefault void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}// 配置异常处理器default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}// 扩展异常处理器default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {}// JSR303 的自定义验证器@Nullabledefault Validator getValidator() {return null;}// 消息处理对象@Nullabledefault MessageCodesResolver getMessageCodesResolver() {return null;}
}
二、页面跳转控制器
- SpringBoot 中使用页面视图,比如 Thymeleaf。要跳转显示某个页面,必须通过 Controller 对象。也就是我们需要创建一个 Controller,转发一个视图才行。如果我们现在需要显示多个页面,可以无需这个 controller。addViewControllers() 完成请求到视图跳转。
- ① 创建一个视图:login.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 配置类
@Configuration public class MvcSetting implements WebMvcConfigurer {// 跳转页面视图@Overridepublic 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 数据转为我们的某个对象,使用这个对象更加方便我们后续的编码。
public interface Formatter<T> extends Printer<T>, Parser<T> { }
- Formatter<T> 是一个组合接口,没有自己的方法。内容来自 Printer<T> 和 parse<T> 两个接口。
-
Printer<T>:将 T 类型转为 String,格式化输出。
@FunctionalInterface public interface Printer<T> {String print(T object, Locale locale); }
-
Parser<T>:将 String 类型转为期望的 T 对象。
@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
public class DeviceInfoFormatter implements Formatter<List<String>> {@Overridepublic List<String> parse(String text, Locale locale) throws ParseException {String[] infos = text.split(";");List<String> stringList = Arrays.asList(infos);return stringList;}@Overridepublic String print(List<String> object, Locale locale) {return object.toString();} }
- ② 登记内容转换器
@Configuration public class MvcSetting implements WebMvcConfigurer {// 跳转视图页面控制器@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/login").setViewName("/login");}// 登记内容转换器@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addFormatter(new DeviceInfoFormatter());} }
- ③ 创建 Controller 接收请求
@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 之前执行的拦截器对象。