SpringMVC原始碼--控制器Handler處理請求過程
DispatcherServlet類的doDispatch()方法中,真正去處理請求的關鍵步驟是:
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
ModelAndView mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
在第一步中根據我們已經獲得的HandlerExecutionChain物件中包含的控制器Handler得到一個HandlerAdapter
((Controller) handler).handleRequest(request, response);
可以看出來,是將handler強轉為Controller介面的實現後呼叫其handleRequest()方法了,該方法實現在AbstractController類中,程式碼如下:
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// Delegate to WebContentGenerator for checking and preparing. checkAndPrepare(request, response, this instanceof LastModified);
// Execute handleRequestInternal in synchronized block if required. if (this.synchronizeOnSession) { HttpSession session = request.getSession(false); if (session != null) { Object mutex = WebUtils.getSessionMutex(session); synchronized (mutex) { return handleRequestInternal(request, response);
return handleRequestInternal(request, response); }
紅色程式碼是由AbstractController類的子類實現的,針對不同的請求有不同的處理方法。
比如MultiActionController類用來處理同一控制器類中多個請求方法的情況,程式碼如下:
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { try { String methodName = this.methodNameResolver.getHandlerMethodName(request); return invokeNamedMethod(methodName, request, response); } catch (NoSuchRequestHandlingMethodException ex) { return handleNoSuchRequestHandlingMethod(ex, request, response); } }