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 有三個方法可以重寫
-
preHandle()在業務請求之前呼叫
如果返回false 從當前的攔截器往回執行所有攔截器的afterCompletion(),再退出攔截器鏈
如果返回true 執行下一個攔截器,直到所有的攔截器都執行完畢
再執行被攔截的Controller
然後進入攔截器鏈,
從最後一個攔截器往回執行所有的postHandle()
接著再從最後一個攔截器往回執行所有的afterCompletion() -
postHandle()
在業務處理器處理請求執行完成後,生成檢視之前執行的動作 -
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