Spring MVC实现静态资源访问,viewcontroller,拦截器,路径匹配等配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_38151745/article/details/83377139

spring mvc 定制配置需要配置类继承 一个webmvcconfigureradapter ,通过重写这个类的方法,来完成常用的配置
包括静态资源 , controller ,拦截器,路径匹配的配置等等
具体代码如下

@Component
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    /**
     * 配置静态资源访问
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /**
         * addResourceHandler 对外暴露的访问路径   addResourceLocations 文件存放的路径
         */
        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/js/");
        super.addResourceHandlers(registry);
    }

    /**
     * 配置拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/test1/**").addPathPatterns("/test2/**");
        super.addInterceptors(registry);
    }

    /**
     * 视图控制器
     *
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("viewUser").setViewName("user/viewUser");
        super.addViewControllers(registry);
    }

    /**
     * 路径匹配设置
     * 在springmvc 中,如果访问路径带有“.” ,则后面的值会被忽略。如果不想忽略的话,可以重写 configurepathmath来来实现
     * @param configurer
     */
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
        super.configurePathMatch(configurer);
    }

//自定义的拦截器
    public class CustomInterceptor implements HandlerInterceptor{
        /**
         * 在业务请求之前调用
         * 如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
         * 如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕
         *    再执行被拦截的Controller
         *    然后进入拦截器链,
         *    从最后一个拦截器往回执行所有的postHandle()
         *    接着再从最后一个拦截器往回执行所有的afterCompletion()
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
            System.out.println("进入业务请求之前拦截器");
            return true;
        }

        /**
         * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o
         * @param modelAndView
         * @throws Exception
         */
        @Override
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
            System.out.println("业务请求完成后,执行的信息");
        }

        /**
         * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
         * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o
         * @param e
         * @throws Exception
         */
        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
            System.out.println("完全处理完请求后被调用");
        }
    }

}

拦截器

拦截器实现对每一个请求处理前后进行相关的业务处理 可以实现 handlerinterceptor 接口 或者继承 handlerinterceptoradapter 类来实现自定义拦截器
handlerinterceptor 有三个方法可以重写

  1. preHandle()在业务请求之前调用
    如果返回false 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
    如果返回true 执行下一个拦截器,直到所有的拦截器都执行完毕
    再执行被拦截的Controller
    然后进入拦截器链,
    从最后一个拦截器往回执行所有的postHandle()
    接着再从最后一个拦截器往回执行所有的afterCompletion()

  2. postHandle()
    在业务处理器处理请求执行完成后,生成视图之前执行的动作

  3. afterCompletion()
    在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
    当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()

快捷的viewcontroller

对于页面转向的controller时,如果没有任务业务处理的时候,只是简单的页面转向,可以通过在webmvc 配置类中重写addviewcontrollers 来简化配置

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("viewUser").setViewName("user/viewUser");
        super.addViewControllers(registry);
    }

需要说明的是 Spring Boot 2.0 已经不再支持使用继承WebMvcConfigurerAdapter 来实现MVC 配置了
github url : springbootwebmvc

猜你喜欢

转载自blog.csdn.net/github_38151745/article/details/83377139