1. 程式人生 > >springmvc原理簡單總結,配少量原始碼

springmvc原理簡單總結,配少量原始碼

1、請求到達DispatcherServlet,呼叫方法根據request到HandlerMapping(處理器對映器)中找到合適的處理器和攔截器並封裝成執行鏈,返回給DispatcherServlet細節:在HandlerMapping中找合適的處理器時,其實是遍歷HandlerMapping,HandlerMapping是List<HandlerMapping>集合,返回的執行鏈是HandlerExecutionChain,然後判斷這個鏈和鏈中的處理器是不是null,如果是null,則轉向404處理頁面呼叫getHandler方法獲取執行鏈程式碼
mappedHandler = getHandler(processedRequest, false);//獲取handler
getHandler方法核心程式碼
for (HandlerMapping hm : this.handlerMappings) {
   if (logger.isTraceEnabled()) {
      logger.trace(
            "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
   }
   HandlerExecutionChain handler = hm.getHandler(request);
   if (handler != null) {
      return handler;
   }
}
2、DispatcherServlet拿到鏈中的處理器,然後到HandlerAdapter(處理器介面卡)中去找,找到支援的介面卡,然後返回給DispatcherServlet細節:springmvc如果沒有配置HandlerAdapter,那麼獲取到的就是預設的HandlerAdapter(HttpRequestHandlerAdapter、SimpleControllerHanlerAdapter、AnnotationHandlerAdapter),在獲取HandlerAdapter的時候,也是通過遍歷List<HandlerAdapter>集合方式DispatcherServlet中呼叫getHandlerAdapter方法獲取介面卡程式碼
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
getHandlerAdapter方法核心程式碼
for (HandlerAdapter ha : this.handlerAdapters) {
   if (logger.isTraceEnabled()) {
      logger.trace("Testing handler adapter [" + ha + "]");
   }
   if (ha.supports(handler)) {
      return ha;
   }
}
3、處理器介面卡執行我們的處理器,並返回ModelAndView物件給DispatcherServlet細節:在執行我們的處理器之前,先執行了pre攔截器,攔截器返回true,則繼續往下執行
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
   return;
}
在執行處理器之後,執行post攔截器,處理一些ModelAndView物件裡的內容
mappedHandler.applyPostHandle(processedRequest, response, mv);
4、DispatcherServlet呼叫ViewResolver(檢視解析器),找到對應的檢視,把資料填充進去,通過response響應給瀏覽器細節
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);