關於SpringMVC攔截器和異常

一.文件上傳

1.文件上傳

  • SpringMVC爲文件上傳提供了直接的支持,這種類型是經過即插即用的MultipartResolver技術的。Spring用Jakarta Commons FileUpload技術實現了一個MultipartResolver實現類:CommonsMultipartResolver.
  • SpringMVC上下文中默認沒有裝配MultipartResolver,所以默認狀況下不能處理文件的上傳工做,若是想使用Spring的文件上傳功能,需如今上下文中配置MultipartResolver。java

    2. 配置MultipartResolver

  • defaultEncoding:必須和用戶JSP的pageEncoing屬性一致,以便正確解析表單的內容。
  • 爲了讓CommonsMulitpartResolver正確工做,必須先將Jakarta Commons FileUpload及Jakarta Commons io的類包添加到類路徑下。程序員

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <propert name="defaultEncoding" value="UTF-8"></property>
    <property name="maxUploadSize" value="524880"></property>
</bean>

二.攔截器

1.自定義攔截器

SpringMVC也可使用攔截器對請求進行攔截處理,用戶能夠自定義攔截器來實現特定的功能,自定義的攔截器必須實現HandlerInterceptor接口。接口中有三個方法:web

  • preHandle():這個方法在業務處理器請求以前被調用,在該方法中對用戶請求request進行處理。若是你決定該攔截器對請求進行攔截處理好還要調用其餘的攔截器,或者是業務處理器去進行處理,則返回true;若是程序員決定不須要再調用其餘的組件去處理請求,則返回false。面試

  • postHandle():這個方法在業務處理器處理完請求後,可是DispatcherServlet向客戶端返回響應前被調用,在該方法中對用戶請求request()進行處理。spring

  • afterCompletion():這個方法在DispatcherServlet徹底處理完請求後被調用,能夠在該方法中進行一些資源清理的操做。mvc

2.攔截器方法執行順序

3.配置自定義攔截器

<mvc:interceptors>
      <!--  攔截全部資源 -->
      <bean class="com.desperado.interceptors.FirstInterceptor"></bean>
      <!--攔截指定資源-->
      <mvc:interceptor>
              <mvc:mapping path="/emps"/>
              <bean class="com.desperado.interceptors.SecondInterceptor"></bean>
      </mvc:interceptor>
      <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
</mvc:interceptors>

4.多個攔截器的執行順序

5.攔截器preHandle()方法返回false時候的執行順序

6.一道經典面試題

攔截器和過濾器有什麼區別:app

  1. 攔截器是基於java的反射機制的,而過濾器是基於函數回調的。
  2. 攔截器不依賴於Servlet容器,而過濾器依賴與Servlet容器。
  3. 攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求其做用。
  4. 攔截器能夠訪問action的上下文、值棧裏面的對象,而過濾器不能訪問。
  5. 在action的聲明週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次、(這裏的調用一次,是對於構造函數而言的,而doFilter會對匹配的請求作持續的處理。)
  6. 攔截器能夠獲取IOC容器中的Bean,而過濾器不行。

執行順序函數

三.異常處理

1.異常處理

  • Spring MVC經過HandlerExceptionResolver處理程序的異常,包括Handler映射、數據綁定以及目標方法執行時發生的異常。
  • SpringMVC提供的HandlerExceptionResolver的實現類
    - AbstractHandlerExceptionResolver
    - AbstractHandlerMethodExceptionResolver
    - ExceptionHandlerExceptionResolver
    - AnnotationMethodHandlerExceptionResolver
    - DefaultHandlerExceptionResolver
    - ResponseStatusExceptionResolver
    - SimpleMappingExceptionResolver
    - HandlerExceptionResolverComposite

2.HandlerExceptionResolver

  • DispatcherServlet默認裝配的HandlerExceptionResolver:
    • 沒有使用
      -AnnotationMethodHandlerExceptionResolver
      -DefaultHandlerExceptionResolver
      -ResponseStatusExceptionResolverpost

    • 使用了
      -ExceptionHandlerExceptionResolver
      -DefaultHandlerExceptionResolver
      -ResponseStatusExceptionResolverurl

3.ExceptionHandlerExceptionResolver

  • 主要處理Handler中用@ExceptionHandler註解定義的方法。
  • @ExceptionHandler註解定義的優先級問題:若是發生的是NullPointerException,可是聲明的異常有RuntimeException和Exception,此時會根據異常的最近繼承關係找到繼承深度最淺的那個@ExceptionHandler註解方法,即標記了RuntimException的方法。
  • ExceptionHandlerMethodResolver內部若找不到@ExceptionHandler註解的話,會找@ControllerAdvice中的@ExceptionHandler註解方法

4.ResponseStatusExceptionResolver

  • 在異常及異常父類中找到@ResponseStatus註解,而後使用這個註解的屬性進行處理。
  • 定義一個@ResponseStatus註解修飾的異常類。
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public class UnAuthorizedException extends RuntimeException{}
  • 若在處理器方法中拋出了上面定義的異常:
    因爲觸發的異常帶有@ResponseStatus註解,所以會被ResponseStatusExceptionResolver解析到。最後響應HttpStatus.UNAUTHORIZED代碼給客戶端。

5.DefaultHandlerExceptionResolver

對一些特殊的異常進行處理,好比:
NoSuchRequestHandlingMethodException
HttpRequestMethodNotSupportedException
HttpMediaTypeNotSupportedException
HttpMediaTypeNotAcceptableException
等。

6.SimpleMappingExceptionResolver

若是但願對全部異常進行統一處理,可使用該解析器,它將異常類名映射爲視圖名,即發生異常是使用對應的視圖報告異常

四.Spring的運行流程

  1. 請求到達Spring DispatcherServlet的url-pattern。
  2. 判斷SpringMVC中是否存在對應的映射
  3. 若是不存在判斷是否配置了
  4. 若是配置了就去找目標資源,若是沒有配置,返回404頁面。
  5. 若是存在則從HandlerMapping獲取handlerExecutionChain對象。
  6. 獲取HandlerAdapter對象。
  7. 調用攔截器的preHandle方法。
  8. 調用目標Handler的目標方法獲得ModelAndView對象。
  9. 調用攔截器的postHandle方法。
  10. 判斷是否存在異常
  11. 存在異常,由HandlerExceptionResolver組件處理異常獲得新的ModelAndView對象。
  12. 不存在異常,由ViewResolver組件根據ModelAndView對象獲得實際的View
  13. 渲染視圖
  14. 調用攔截器的afterCompletion方法。

五.在Spring的環境下使用SpringMVC

1.Bean被建立兩次?

Spring的IOC容器不該該掃描SpringMVC中的Bean,對應的SpringMVC的IOC容器不該該掃描Spring中的Bean。

2.在SpringMVC配置文件中引用業務層的Bean

  • 多個SpringIOC容器之間能夠設置爲父子關係,以實現良好的解耦。
  • SpringMVC WEB層容器可做爲"業務層"Spring容器的子容器,即WEB層容器能夠引用業務層容器的Bean,而業務層容器卻訪問不到WEB層容器的Bean。

6、Spring和Struts2對比

  1. SpringMVC的入口是Servlet,而Struts2是Filter.
  2. SpringMVC會比Struts2快點,SpringMVC是基於方法設計的,而Struts2是基於類,每次發一個請求都會實實例一個Action
  3. SpringMVC使用更加簡潔,開發效率高。
  4. Struts2的OGNL表達式使頁面開發效率相比SpringMVC要高一點。
相關文章
相關標籤/搜索