SpringMVC學習筆記(四)-異常處理與攔截器
阿新 • • 發佈:2020-12-13
SpringMVC學習筆記(四)-異常處理與攔截器
異常處理
-
Spring將異常層層傳導,從dao、service、controller直到前端控制器中,此時若前端控制器沒有配置異常處理機制,將會把異常輸出到頁面
-
在異常處理器中集中處理異常,使用
@ExceptionHandler
-
@ExceptionHandler:放置於方法上,表示該方法可以處理某個型別的異常,當出現該異常時呼叫對應方法,處理異常的方法與控制器方法使用方式一致
-
@ControllerAdvice:放置於類上,表明這是一個擁有異常處理方法的類,給控制器增強異常處理的功能,AOP的思想實現業務與非業務功能的分離
-
@ControllerAdvice public class MyExceptionHandler{ @ExcepionHandler(value={MyException.class}) //不配置value屬性,則會匹配其他異常 public ModelAndView doMyExeptionHandler(Exception e){ ... ... } //此方法返回的結果為使用者接受的最終結果 }
-
記住配置元件掃描器與註解驅動
攔截器
-
概念:
- SpringMVC框架中的一種物件,需要實現介面HandlerInterceptor
- 攔截使用者請求對請求進行預處理與後處理,可將controller中共用的功能定義至攔截器
- 攔截器分為:系統攔截器與自定義攔截器、可設定多個攔截器
- 常用於登陸檢查、許可權驗證、統計資料... ...
-
使用:
-
自定義攔截器實現HandlerInterceptor介面,其存在三個預設方法
-
preHandle()為預處理方法,引數
Object handler
為配攔截的控制器物件,返回值為false時請求立即階段,不會再執行後續的攔截器方法及控制器方法- 在設定的控制器方法之前執行
-
postHandle()為後處理方法,引數ModelAndView modelAndView為控制器方法的返回值
- 在設定的控制器方法之後執行,可用於改變原執行結果,可修改資料或檢視
-
afterCompletion,引數Object handler為攔截的處理器, Exception ex方法執行過程中丟擲的異常
- 所有請求處理完成之後執行,釋放資源或進行清理
- 方法執行的條件:
- 當前攔截器preHandle()方法必須執行
- preHandle()必須返回true
-
宣告攔截器
-
<mvc:interceptors> <!--宣告一個攔截器--> <mvc:interceptor> <!--指定攔截器的攔截地址,path:攔截的uri地址,使用**萬用字元可以匹配多地址--> <mvc:mapping path="/user/**"/> <!--指定使用的攔截器--> <bean id="xxx" class="xxx.xxx.xxx"/> </mvc:interceptor> </mvc:interceptors>
-
多攔截器
- 多攔截器的執行順序:同一攔截路徑下,mvc配置檔案中配置的順序即為攔截器的執行順序
- 在內層攔截器的預處理返回結果為false是,攔截器鏈截斷,但外層afterCompletion可以執行
- 在外層攔截器預處理結果為false,內層為true時,不會進入內層
- 多層攔截器的意義:
- 將驗證分散至多個獨立的攔截器,每個攔截器執行單一的驗證處理
- 多個攔截器,串於一個鏈條上,多個攔截器和一個控制器物件置於一個鏈條上,框架使用HandlerExecutionChain表示執行鏈
- 通過遍歷HandlerExecutionChain實現攔截器的依次執行
- 攔截器與過濾器的對比:
- 攔截器是SpringMVC框架中的物件,過濾器是Servlet中的物件
- 攔截器物件由框架建立,過濾器由Tomcat建立
- 攔截器側重於對請求進行判斷處理,可以截斷請求,過濾器側重於對request,response物件的屬性,引數進行設定。
- 攔截器存在三個執行時間,過濾器在請求之前
- 攔截器用於攔截對控制器的請求,過濾器可以攔截所有動態靜態資源
- 當攔截器與過濾器一起執行時,先執行過濾器,之後為前端控制器,最後為攔截器
SpringMVC的執行流程
- 使用者請求交予DispatcherServlet統一排程
- DispatcherServlet將請求交予處理器對映器(實現了HandlerMapping,從容器中獲取控制器物件)處理後將控制器與攔截器放入執行鏈中返回至DispatcherServlet
- DispatcherServlet將獲取的控制器物件交予處理器介面卡(實現HandlerAdapter介面,用於執行控制器中的方法)獲得結果
- DispatcherServlet將執行結果交予檢視解析器(實現ViewResolver介面,處理檢視組成檢視的完整路徑,能建立完整的View型別結果)
- DispatcherServlet呼叫View類中的方法將Model中的資料放入Request作用域中,對檢視執行轉發