springMVC源碼分析--HandlerAdapter(一)

轉載 https://blog.csdn.net/qq924862077/article/details/53843251

HandlerAdapter的功能實際就是執行我們的具體的Controller、Servlet或者HttpRequestHandler中的方法。

類結構如下:

1、SimpleServletHandlerAdapter實際就是執行HttpServlet的service方法 springMVC源碼分析--SimpleServletHandlerAdapter(二)

2、SimpleControllerHandlerAdapter實際就是執行Controller的handleRequest方法  springMVC源碼分析--SimpleControllerHandlerAdapter(三)

3、HttpRequestHandlerAdapter實際就是執行HttpRequestHandler的handleRequest方法 springMVC源碼分析--HttpRequestHandlerAdapter(四)

4、RequestMappingHandlerAdapter實際就是執行@RequestMapping註解的方法。

5、AnnotationMethodHandlerAdapter已結被廢棄,就不做過多介紹

HandlerAdapter的接口中定義了三個方法:

(1)boolean supports(Object handler); 判斷是否支持傳入的Handler

(2)ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)  用來使用Handler處理請求

(3)long getLastModified(HttpServletRequest request, Object handler); 用來獲取資料的Last-Modified值。

public interface HandlerAdapter {
 
	boolean supports(Object handler);
 
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
 
	long getLastModified(HttpServletRequest request, Object handler);
 
}

HandlerAdapter的執行操作,其執行過程在DispatcherServlet的doDispatch中,執行流程如下:

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		........
 
		try {
			
			try {
				
				//獲取合適的HandlerAdapter實現類
				HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
				
			........
				
				if (isGet || "HEAD".equals(method)) {
					long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
					
				}
			........
				//執行真正的請求操作
				mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
 
		........
	}

getHandlerAdapter的操作就是選擇合適的HandlerAdapter來執行,設計模式中的適配器模式,handlerAdapters中的內容就是所有的HandlerAdapter的實現類。

protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
		for (HandlerAdapter ha : this.handlerAdapters) {
			if (logger.isTraceEnabled()) {
				logger.trace("Testing handler adapter [" + ha + "]");
			}
			if (ha.supports(handler)) {
				return ha;
			}
		}
		throw new ServletException("No adapter for handler [" + handler +
				"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
	}


這樣就完成了Handler的真正調用過程,最終調用過程是返回一個ModelAndView對象。接下來我們會用幾篇博客分別介紹一下HandlerAdapter的實現類完成的操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章