1. 程式人生 > >Spring MVC實現靜態資源訪問,viewcontroller,攔截器,路徑匹配等配置

Spring MVC實現靜態資源訪問,viewcontroller,攔截器,路徑匹配等配置

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