1. 程式人生 > >SpringMVC原始碼--控制器Handler處理請求過程

SpringMVC原始碼--控制器Handler處理請求過程

      DispatcherServlet類的doDispatch()方法中,真正去處理請求的關鍵步驟是:

           HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

           ModelAndView   mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

 在第一步中根據我們已經獲得的HandlerExecutionChain物件中包含的控制器Handler得到一個HandlerAdapter

介面實現類的介面卡物件,第二步呼叫HandlerAdapter 介面的handle()方法。HandlerAdapter介面有多個實現類,對handle()方法的實現中都有最重要的一行程式碼:

      ((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);         }     }