對於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)
}