1. 程式人生 > 實用技巧 >SpringMVC學習筆記(四)-異常處理與攔截器

SpringMVC學習筆記(四)-異常處理與攔截器

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作用域中,對檢視執行轉發