SpringMVC 之 HandlerAdapter 的作用
HandlerAdapter 字面上的意思就是處理適配器,它的作用用一句話概括就是調用具體的方法對用戶發來的請求來進行處理。當 handlerMapping 獲取到執行請求的 controller 時,DispatcherServlte 會根據 controller 對應的 controller 類型來調用相應的 HandlerAdapter 來進行處理。
1.HandlerAdapter 的注冊
DispatcherServlte 會根據配置文件信息注冊 HandlerAdapter,如果在配置文件中沒有配置,那么 DispatcherServlte 會獲取 HandlerAdapter 的默認配置,如果是讀取默認配置的話,DispatcherServlte 會讀取 DispatcherServlte.properties 文件, 該文件中配置了三種 HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter 和 AnnotationMethodHandlerAdapter。DispatcherServlte 會將這三個 HandlerAdapter 對象存儲到它的 handlerAdapters 這個集合屬性中,這樣就完成了 HandlerAdapter 的注冊。
2.HandlerAdapter 的執行
HandlerAdapter接口方法如下:
public interface HandlerAdapter {
boolean supports(Object handler);
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
DispatcherServlte 會根據 handlerMapping 傳過來的 controller 與已經注冊好了的 HandlerAdapter 一一匹配,看哪一種 HandlerAdapter 是支持該 controller 類型的,這調用的是supports方法,如果支持的話就會返回true.如果找到了其中一種 HandlerAdapter 是支持傳過來的 controller 類型,那么該 HandlerAdapter 會調用自己的 handle 方法,handle 方法運用 java 的反射機制執行 controller 的具體方法來獲得 ModelAndView, 例如 SimpleControllerHandlerAdapter 是支持實現了 controller 接口的控制器,如果自己寫的控制器實現了 controller 接口,那么 SimpleControllerHandlerAdapter 就會去執行自己寫控制器中的具體方法來完成請求。
今天再來看源碼,發現處理器根本就不只有 Controller 這一種。還有 HttpRequestHandler,Servlet 等處理器。下面來介紹一下幾種適配器對應的處理器以及這些處理器的作用
- AnnotationMethodHandlerAdapter 主要是適配注解類處理器,注解類處理器就是我們經常使用的 @Controller 的這類處理器
- HttpRequestHandlerAdapter 主要是適配靜態資源處理器,靜態資源處理器就是實現了 HttpRequestHandler 接口的處理器,這類處理器的作用是處理通過 SpringMVC 來訪問的靜態資源的請求
- SimpleControllerHandlerAdapter 是 Controller 處理適配器,適配實現了 Controller 接口或 Controller 接口子類的處理器,比如我們經常自己寫的 Controller 來繼承 MultiActionController.
- SimpleServletHandlerAdapter 是 Servlet 處理適配器, 適配實現了 Servlet 接口或 Servlet 的子類的處理器,我們不僅可以在 web.xml 里面配置 Servlet,其實也可以用 SpringMVC 來配置 Servlet,不過這個適配器很少用到,而且 SpringMVC 默認的適配器沒有他,默認的是前面的三種。