HandlerExecutionChain、HandlerMapping、HandlerAdapter之間的關係,以及springmvc的請求流程

對於HandlerExecutionChain

public class HandlerExecutionChain {
    //實際的請求處理器,用來控制我們的請求到達哪個對象的哪個方法
    private final Object handler;
    
    public Object getHandler() {
        return this.handler;
    }
	//處理實際請求前的一些操作
    boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {
			.....
			.....
    }
	//請求處理完成後的一些操作
    void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv)
            throws Exception {
			.....
			.....
    }
}

可以看出:HandlerExecutionChain是實際的處理器的一個包裝對象,它包含實際的處理器和一些請求前後的處理流程。

對於HandlerMapping

public interface HandlerMapping {
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

該接口只有一個方法getHandler,它的入參是HttpServletRequest,輸出是HandlerExecutionChain。很明顯,它通過當前請求的request對象,來獲取到一個包含實際請求處理器的HandlerExecutionChain對象

對於HandlerAdapter

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

該接口只有一個方法handle,調用處理器handler,返回一個ModelAndView對象。
由上面的分析我們大概可以寫一個springmvc基本的請求處理流程

void doDispatch(HttpServletRequest request, HttpServletResponse response){

	//容器初始化時會默認加載幾種HandlerMapping,也可自己配置。這裏爲了簡單說明流程,不再說明具體細節。假已經有了一個`HandlerMapping`對象
	HandlerMapping handlerMapping;
	
	//handlerMapping根據請求獲取處理器,幷包裝成HandlerExecutionChain
	//getHandler方法的細節省略
	HandlerExecutionChain handlerExecutionChain =  handlerMapping.getHandler(request)//請求前的處理
	handlerExecutionChain.applyPreHandle(request,response);
	
	//從handlerExecutionChain獲取實際處理器
	Object handler = handlerExecutionChain.getHandler();
	//根據實際處理器獲取處理器的適配器,getHandlerAdapter方法細節省略
	HandlerAdapter handlerAdapter = getHandlerAdapter(handler);
	
	//調用適配器處理請求,返回一個`ModelAndView`對象
	ModelAndView mv = handlerAdapter.handle(HttpServletRequest request, HttpServletResponse response, Object handler)
	
	//請求經適配器處理後的一些操作
	handlerExecutionChain.applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv)
}

原文鏈接

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