美文网首页
Live-Server-3-WebMvcConfigurerAd

Live-Server-3-WebMvcConfigurerAd

作者: G63HH | 来源:发表于2019-07-30 17:30 被阅读0次

    刚刚查了一下WebMvcConfigurerAdapter这个类,发现两点知识需要更新:

    1. WebMvcConfigurerAdapter是Springboot的一个配置类,不仅仅解决了资源拦截、各种拦截器,还解决了跨域、视图解析、信息拦截、指定页面跳转等问题。
    2. 这个类在Spring 5中已经不建议使用。

    看来鄙人还是太久没看Spring了,有点孤陋寡闻。但是谁让我的项目中用到了他呢,还是来描述一下。

    WebMvcConfigurerAdapter定义及常用方法

    WebMvcConfigurerAdapter是一个抽象类,实现了WebMvcConfigurer接口。类定义如下:

    public abstract class WebMvcConfigurerAdapter implements WebMvcConfigurer {
        /** 配置路径匹配参数 */
        @Override
        public void configurePathMatch(PathMatchConfigurer configurer) {}
        /** 配置内容裁决的一些选项 */
        @Override
        public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}
        /** 使得springmvc在接口层支持异步 */
        @Override
        public void configureAsyncSupport(AsyncSupportConfigurer configurer) {}
        /** 默认静态资源处理器  */
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
        /** 注册参数转换和格式化器 */
        @Override
        public void addFormatters(FormatterRegistry registry) {}
        /** 添加拦截器 */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {}
         /**静态资源处理  */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {}
        /** 解决跨域问题 */
        @Override
        public void addCorsMappings(CorsRegistry registry) {}
        /** 视图跳转控制器 */
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {}
        /** 配置视图解析器  */
        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {}
        /** 注册自定义控制器(controller)方法参数类型 */
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {}
        /** 注册自定义控制器(controller)方法返回类型 */
        @Override
        public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {}
        /** 信息转换器*/
        @Override
        public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
        /** 仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter */
        @Override
        public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
        /** 注册异常处理 */
        @Override
        public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}
        /** 多个异常处理,可以重写次方法指定处理顺序等 */
        @Override
        public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}
    
        @Override
        public Validator getValidator() {
            return null;
        }
    
        @Override
        public MessageCodesResolver getMessageCodesResolver() {
            return null;
        }
    }
    

    WebMvcConfigurerAdapter的实现

    在项目中主要是对错误页面的拦截和项目静态资源的放行。
    创建一个类,继承WebMvcConfigurerAdapter,添加@Configuration注解,随后实现拦截、资源放行等方法。

    @Configuration
    public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {
    
        /**
         * 静态资源处理
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            // 不过滤templates/js、img、fonts文件下的文件
            registry.addResourceHandler("/css/**").addResourceLocations("classpath:/templates/css/");
            registry.addResourceHandler("/fonts/**").addResourceLocations("classpath:/templates/fonts/");
            registry.addResourceHandler("/img/**").addResourceLocations("classpath:/templates/img/");
            registry.addResourceHandler("/js/**").addResourceLocations("classpath:/templates/js/");
            registry.addResourceHandler("/error/**").addResourceLocations("classpath:/templates/error/");
    
            // 后台
            registry.addResourceHandler("/admin/lib/**").addResourceLocations("classpath:/templates/admin/lib/");
            registry.addResourceHandler("/admin/images/**").addResourceLocations("classpath:/templates/admin/images/");
            registry.addResourceHandler("/admin/js/**").addResourceLocations("classpath:/templates/admin/js/");
            registry.addResourceHandler("/admin/stylesheets/**")
                    .addResourceLocations("classpath:/templates/admin/stylesheets/");
        }
    
        /**
         * 拦截器处理
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(errorPageInterceptor());
        }
        /**
         * 错误页面404 500
         * @return
         */
        @Bean
        public ErrorPageInterceptor errorPageInterceptor() {
            return new ErrorPageInterceptor();
        }
    }
    

    ErrorPageInterceptor实现:该类主要是实现了HandlerInterceptor拦截器,对HttpServletRequest和HttpServletResponse进行拦截处理。

    public class ErrorPageInterceptor implements HandlerInterceptor {
        private static final Logger log = LoggerFactory.getLogger(ErrorPageInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            log.debug("ErrorPageInterceptor.preHandle()");
            return true;
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                ModelAndView modelAndView) throws Exception {
            log.debug("ErrorPageInterceptor.postHandle()");
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            int status = response.getStatus();
            switch (status) {
            case 500:
                request.getRequestDispatcher("500").forward(request, response);
                break;
            case 404:
                 request.getRequestDispatcher("404").forward(request, response);
                break;
            case 403:
                request.getRequestDispatcher("403").forward(request, response);
                break;
            default:
                break;
            }
        }
    }
    

    Spring 5中MVC配置文件

    在文章的开头讲到在Spring5中已经不推荐使用WebMvcConfigurerAdapter,那么要如何实现MVC配置呢?答案很简单,就是通过创建一个实现了WebMvcConfigure接口的类来完成拦截器、静态资源处理、页面跳转、跨域等功能。相对于上述的实现方式,Spring 5中减少了WebMvcConfigurerAdapter类的开销。

    相关文章

      网友评论

          本文标题:Live-Server-3-WebMvcConfigurerAd

          本文链接:https://www.haomeiwen.com/subject/hovnrctx.html