一.文件上傳
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
- 攔截器是基於java的反射機制的,而過濾器是基於函數回調的。
- 攔截器不依賴於Servlet容器,而過濾器依賴與Servlet容器。
- 攔截器只能對action請求起做用,而過濾器則能夠對幾乎全部的請求其做用。
- 攔截器能夠訪問action的上下文、值棧裏面的對象,而過濾器不能訪問。
- 在action的聲明週期中,攔截器能夠屢次被調用,而過濾器只能在容器初始化時被調用一次、(這裏的調用一次,是對於構造函數而言的,而doFilter會對匹配的請求作持續的處理。)
- 攔截器能夠獲取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的運行流程
- 請求到達Spring DispatcherServlet的url-pattern。
- 判斷SpringMVC中是否存在對應的映射
- 若是不存在判斷是否配置了
- 若是配置了就去找目標資源,若是沒有配置,返回404頁面。
- 若是存在則從HandlerMapping獲取handlerExecutionChain對象。
- 獲取HandlerAdapter對象。
- 調用攔截器的preHandle方法。
- 調用目標Handler的目標方法獲得ModelAndView對象。
- 調用攔截器的postHandle方法。
- 判斷是否存在異常
- 存在異常,由HandlerExceptionResolver組件處理異常獲得新的ModelAndView對象。
- 不存在異常,由ViewResolver組件根據ModelAndView對象獲得實際的View
- 渲染視圖
- 調用攔截器的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對比
- SpringMVC的入口是Servlet,而Struts2是Filter.
- SpringMVC會比Struts2快點,SpringMVC是基於方法設計的,而Struts2是基於類,每次發一個請求都會實實例一個Action
- SpringMVC使用更加簡潔,開發效率高。
- Struts2的OGNL表達式使頁面開發效率相比SpringMVC要高一點。