zoukankan      html  css  js  c++  java
  • WebMvcConfigurer

    1 WebMvcConfigurer是一个接口,提供很多自定义的拦截器,例如跨域设置、类型转化器等等。可以说此接口为开发者提前想到了很多拦截层面的需求,方便开发者自由选择使用。由于Spring5.0废弃了WebMvcConfigurerAdapter,所以WebMvcConfigurer继承了WebMvcConfigurerAdapter大部分内容。

    2.configureContentNegotiation(ContentNegotiationConfigurer configurer)

    这个东西直译叫做内容协商机制,主要是方便一个请求路径返回多个数据格式。ContentNegotiationConfigurer这个配置里面你会看到MediaType,里面有众多的格式。此方法不在多赘述。

    3.configureAsyncSupport(AsyncSupportConfigurer configurer)

    顾名思义,这是处理异步请求的。只能设置两个值,一个超时时间(毫秒,Tomcat下默认是10000毫秒,即10秒),还有一个是AsyncTaskExecutor,异步任务执行器。

    4.configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)

    这个接口可以实现静态文件可以像Servlet一样被访问。

    5.addFormatters(FormatterRegistry registry)

    增加转化器或者格式化器。这边不仅可以把时间转化成你需要时区或者样式。还可以自定义转化器和你数据库做交互,比如传进来userId,经过转化可以拿到user对象。

    6.addInterceptors(InterceptorRegistry registry)

    盼望着,盼望着,你一个常用的方法来了。这个方法可以自定义写拦截器,并指定拦截路径。来,咱们写一个拦截器。

    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request,
                                 HttpServletResponse response, Object handler) throws Exception {
            System.out.println("preHandle,ok,假设给你一个true,运行去吧");
            return true;
        }
        @Override
        public void postHandle(HttpServletRequest request,
                               HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("postHandle,ok,看看我什么时候运行的。");
        }
        @Override
        public void afterCompletion(HttpServletRequest request,
                                    HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("afterCompletion,ok,看完不点个赞再走吗?");
        }
    }

    然后配置一下:

    @Configuration
    public class MyConfigurer implements WebMvcConfigurer {
        @Bean
        public MyInterceptor getMyInterceptor(){
            return  new MyInterceptor();
        }
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(this.getMyInterceptor())
            .addPathPatterns("/abc","/configurePathMatch");
        }
    }

    可以看出addPathPatterns()里面可以尝试添加多个路径,或者写成”/**“,包含所有路径都需要尝试拦截一下。

    测试一下,输出

    preHandle,ok,假设给你一个true,运行去吧
    ===》执行业务逻辑===》
    postHandle,ok,看看我什么时候运行的。
    afterCompletion,ok,看完不点个赞再走吗?

    7.addResourceHandlers(ResourceHandlerRegistry registry)

    自定义资源映射。这个东西也比较常用,业务场景就是自己的服务器作为文件服务器,不利用第三方的图床,就需要一个虚拟路径映射到我们服务器的地址。值得一提的是,如果你的项目是war包启动,一般都是再Tomcat中配置一下(配置方法请百度);如果是jar包启动(SpringBoot经常用这种方式启动),就可以用到这个方法了。例如:

     public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/my/**")
        .addResourceLocations("file:E:/my/");
        super.addResourceHandlers(registry);
    }

    真实路径,wndows当服务器的情况下,前面一定要加上一个file:。

    8.addCorsMappings(CorsRegistry registry)

    这个是设置跨域问题的,几乎是每个后台服务器都需要配置的东西。我曾写过一篇文章,专门讲跨域问题和SpringBoot怎么配置的,请查询:
    https://juejin.im/post/5cfe6367f265da1b9163887f

    9.addViewControllers(ViewControllerRegistry registry)

    这个方法可以实现,一个路径自动跳转到一个页面。不过现在多为前后端分离的项目,是不是可以把跳转路由的问题直接扔给前端。

    后面还有七个:configureViewResolvers、addArgumentResolvers、addReturnValueHandlers、configureMessageConverters、extendMessageConverters、configureHandlerExceptionResolvers、extendHandlerExceptionResolvers。是在用的太少了,就不再看了。

    package org.springframework.web.servlet.config.annotation;
    /**
     * 篇幅原因,我们先只介绍Spring mvc常用的一些方法
     */
    public interface WebMvcConfigurer {
    
        void addFormatters(FormatterRegistry registry);
    
        void configureMessageConverters(List<HttpMessageConverter<?>> converters);
    
        void extendMessageConverters(List<HttpMessageConverter<?>> converters);
    
        Validator getValidator();
    
        /* 配置内容裁决的一些选项*/
        void configureContentNegotiation(ContentNegotiationConfigurer configurer);
    
        void configureAsyncSupport(AsyncSupportConfigurer configurer);
    
        /* @since 4.0.3 */
        void configurePathMatch(PathMatchConfigurer configurer);
    
        /*参数解析*/
        void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers);
    
        /*返回值解析*/
        void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers);
    
        /*异常处理*/
        void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers);
    
        void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers);
    
        void addInterceptors(InterceptorRegistry registry);
    
        MessageCodesResolver getMessageCodesResolver();
    
        void addViewControllers(ViewControllerRegistry registry);
    
        /**
         * 这里配置视图解析器
         */
        void configureViewResolvers(ViewResolverRegistry registry);
    
        /**
         *静态资源处理
         */
        void addResourceHandlers(ResourceHandlerRegistry registry);
    
        void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
    
        void addCorsMappings(CorsRegistry registry);
    }
  • 相关阅读:
    Nodejs中的流
    Openstack Havana的两个排错过程
    Mongoose入门
    Promise
    CSS3中的动画
    MySql学习笔记(一)--安装配置
    应用Dubbo框架打造仿猫眼项目(二) 影片模块开发
    应用Dubbo框架打造仿猫眼项目(一) 用户模块开发
    4种事务的隔离级别
    JAVA面试题解惑系列(一)——类的初始化顺序
  • 原文地址:https://www.cnblogs.com/xzjf/p/11847075.html
Copyright © 2011-2022 走看看