首页 > 其他分享 > Spring MVC 配置类 WebMvcConfigurerAdapter

Spring MVC 配置类 WebMvcConfigurerAdapter

时间:2023-03-03 15:47:07浏览次数:34  
标签:自定义 Spring void 配置 WebMvcConfigurerAdapter MVC registry public

WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置。因此,在spring boot提倡的基于注解的配置,采用“约定大于配置”的风格下,当需要进行自定义的配置时,便可以继承WebMvcConfigurerAdapter这个抽象类,通过JavaBean来实现需要的配置。

  WebMvcConfigurerAdapter是一个抽象类,它只提供了一些空的接口让用户去重写,比如如果想添加拦截器的时候,需要去重写一下addInterceptors()这个方法,去配置自定义的拦截器。我们可以看一下WebMvcConfigurerAdapter提供了哪些接口来供我们使用。

复制代码
 1 public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
 2     /*配置路径匹配参数*/
 3     public void configurePathMatch(PathMatchConfigurer configurer) {}
 4     /*配置Web Service或REST API设计中内容协商,即根据客户端的支持内容格式情况来封装响应消息体,如xml,json*/
 5     public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}
 6     /*配置路径匹配参数*/
 7     public void configureAsyncSupport(AsyncSupportConfigurer configurer) {}
 8     /* 使得springmvc在接口层支持异步*/
 9     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
10     /* 注册参数转换和格式化器*/
11     public void addFormatters(FormatterRegistry registry) {}
12     /* 注册配置的拦截器*/
13     public void addInterceptors(InterceptorRegistry registry) {}
14     /* 自定义静态资源映射*/
15     public void addResourceHandlers(ResourceHandlerRegistry registry) {}
16     /* cors跨域访问*/
17     public void addCorsMappings(CorsRegistry registry) {}
18     /* 配置页面直接访问,不走接口*/
19     public void addViewControllers(ViewControllerRegistry registry) {}
20     /* 注册自定义的视图解析器*/
21     public void configureViewResolvers(ViewResolverRegistry registry) {}
22     /* 注册自定义控制器(controller)方法参数类型*/
23     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {}
24     /* 注册自定义控制器(controller)方法返回类型*/
25     public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {}
26     /* 重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter*/
27     public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
28     /* 仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter*/
29     public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
30     /* 注册异常处理*/
31     public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}
32     /* 多个异常处理,可以重写次方法指定处理顺序等*/
33     public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}
34 }
复制代码

  WebMvcConfigurerAdapter提供了很多的接口供用户去实现自定义的配置项。下面挑几个比较重要的介绍一下如何使用这些接口来自定义配置。

  1.注册拦截器

  首先,编写拦截器的代码:

复制代码
 1 public class LoginInterceptor extends HandlerInterceptorAdapter {
 2 
 3     private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
 4 
 5     @Override
 6     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 7         logger.info("-----------------------------");
 8         logger.info(request.getRequestedSessionId());
 9         logger.info("-----------------------------");
10         return true;
11     }
12 }
复制代码

  这里只打印相关信息,然后,需要写一个config类去配置这个拦截器:

复制代码
1 @Configuration
2 public class WebConfig extends WebMvcConfigurerAdapter {
3     /*
4     * 拦截器配置*/
5     @Override
6     public void addInterceptors(InterceptorRegistry registry) {
7         registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
8 }
复制代码

  配置类继承了WebMvcConfigurerAdapter这个类,并且重写了addInterceptors这个方法,在方法中,注册了上面编写的拦截器,并且为此拦截器配置了拦截路径,这样一来就算是配置好了这个拦截器。

  2.配置CORS跨域

  只需要在上面的webConfig里重写WebMvcConfigurerAdapter的addCorsMappings方法就可以获得基于spring的跨域支持。

复制代码
 1 /**
 2      * 跨域CORS配置
 3      * @param registry
 4      */
 5     @Override
 6     public void addCorsMappings(CorsRegistry registry) {
 7         super.addCorsMappings(registry);
 8         registry.addMapping("/**")
 9                 .allowedHeaders("*")
10                 .allowedMethods("POST","GET")
11                 .allowedOrigins("http://...")
12                 .allowCredentials(true);
13     }
复制代码

  3.配置ViewController

   当首页或者登陆页的页面对外暴露,不需要加载任何的配置的时候,这些页面将不通过接口层,而是直接访问,这时,就需要配置ViewController指定请求路径直接到页面。

复制代码
1  /**
2      * 视图控制器配置
3      * @param registry
4      */
5     @Override
6     public void addViewControllers(ViewControllerRegistry registry) {
7         super.addViewControllers(registry);
8         registry.addViewController("/").setViewName("forward:/index.html");
9     }
复制代码

 4.配置ViewResolver

  通常在使用jsp的项目中,会基于spring mvc配置的文件去配置视图解析器,通过重写WebMvcConfigurerAdapter里的configureViewResolvers也可以将自己定义的InternalResourceViewResolver配置整合进spring中。

复制代码
 1 /**
 2      * 配置请求视图映射
 3      *
 4      * @return
 5      */
 6     @Bean
 7     public InternalResourceViewResolver resourceViewResolver() {
 8         InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
 9         //请求视图文件的前缀地址
10         internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
11         //请求视图文件的后缀
12         internalResourceViewResolver.setSuffix(".jsp");
13         return internalResourceViewResolver;
14     }
15 
16     @Override
17     public void configureViewResolvers(ViewResolverRegistry registry) {
18         super.configureViewResolvers(registry);
19         registry.viewResolver(resourceViewResolver());
20     }
复制代码

  可以看一下ViewResolverRegistry中的代码:

复制代码
 1     public UrlBasedViewResolverRegistration jsp() {
 2         return this.jsp("/WEB-INF/", ".jsp");
 3     }
 4 
 5     public UrlBasedViewResolverRegistration jsp(String prefix, String suffix) {
 6         InternalResourceViewResolver resolver = new InternalResourceViewResolver();
 7         resolver.setPrefix(prefix);
 8         resolver.setSuffix(suffix);
 9         this.viewResolvers.add(resolver);
10         return new UrlBasedViewResolverRegistration(resolver);
11     }
复制代码

  可以看到,即使不去配置,spring也会新建一个默认的视图解析器。十分方便。

 5.配置Formatter

  当请求的参数中带有日期的参数的时候,可以在此配置formatter使得接收到日期参数格式统一。

复制代码
 1     @Override
 2     public void addFormatters(FormatterRegistry registry) {
 3         registry.addFormatter(new Formatter<Date>() {
 4             @Override
 5             public Date parse(String date, Locale locale) {
 6                 return new Date(Long.parseLong(date));
 7             }
 8 
 9             @Override
10             public String print(Date date, Locale locale) {
11                 return Long.valueOf(date.getTime()).toString();
12             }
13         });
14     }
复制代码

 

  总结一下,本文主要讲了如何通过JavaBean替代xml为springmvc做出自定义的配置,比较符合spring boot的去xml配置的风格。

 

标签:自定义,Spring,void,配置,WebMvcConfigurerAdapter,MVC,registry,public
From: https://www.cnblogs.com/tiancai/p/17175803.html

相关文章

  • springboot 过滤器FilterRegistrationBean详解
    一:基础知识1.通过FilterRegistrationBean实例注册,该方法能够设置过滤器之间的优先级2.为了演示优先级,这里创建2个测试过滤器类:Test1Filter、Test2Filter通过实现javax.serv......
  • Springboot Controller接口默认自动填充 业务实体参数值
    前言今天看有小伙伴求救: 我还是一贯如此,有人不明白,没玩过HandlerMethodArgumentResolver。那么很可能不止他一个人,那么我就有必要出手。不多说,开搞。 正文快速模拟出......
  • SpringMVC_核心组件
    基础的四个组件。  一、DisapatcherServlet前端控制器,接受所有的请求。(配置为/则为所有不包括jsp的请求。/*则为所有请求)配置:在web.xml中配置一个前端控......
  • SpringMVC_编码过滤器
    通过过滤器统一请求与响应的编码格式:<!--字符编码过滤器--><filter><filter-name>encoding</filter-name><filter-class>org.springframewor......
  • spring boot 拦截器
    在interceptor包下创建ApiInterceptor和WebConfigApiInterceptor  ```packagecom.media.weappapi.interceptor;importcom.media.common.po.config.TCmsSite;imp......
  • 18_Spring_事务管理注解方式
    ​ 事务的管理应该放在我们的service层进行处理spring中有两种事务的管理方式1编程式事务管理(了解) 2声明式事务管理(掌握)    基于注解方式实现(掌握)......
  • 18_Spring_事务管理注解方式
    ​ 事务的管理应该放在我们的service层进行处理spring中有两种事务的管理方式1编程式事务管理(了解) 2声明式事务管理(掌握)    基于注解方式实现(掌握)......
  • SSM框架-Spring学习日记4
    代理模式代理模式:静态代理动态代理静态代理抽象角色:一般使用接口或者抽象类来实现真实角色:被代理的角色代理角色:代理真实角色;代理真实角色后,一般会......
  • 7_Spring_使用外部属性配置文件
    ​ spring容器可以读取.properties属性配置文件,可以将文件中的信息注入给bean例如,引入Druid数据源,配置连接池信息1 导入Druid依赖和mysql-connector依赖<d......
  • 7_Spring_使用外部属性配置文件
    ​ spring容器可以读取.properties属性配置文件,可以将文件中的信息注入给bean例如,引入Druid数据源,配置连接池信息1 导入Druid依赖和mysql-connector依赖<d......