DispatchServlet的分析

給個簡單的sequence diagram,原圖見github.前端

    首先要說明下,咱們發送到服務器端的get、post等請求,都轉到doDispatch方法,進行處理。git

  1. DispatchServlet中存有不少HandlerAdapter,這些adapter事從ApplicationContext中獲得的——初始化的時候,會從ApplicationContext中獲取全部HandlerAdapter類型的bean,這也就是爲何DispatchServlet能夠拿到咱們本身定義在spring xml配置文件中的HandlerAdapter的緣由。
  2. DispatchServlet的doDispatch中首先經過HttpServletRequest來獲得HandlerExecutionChain。經過debug能夠發現這個HandlerExecutionChain中的handler實際上是HttpServletRequest中url對應的那個Controller。
  3. 以後,經過HandlerExecutionChain中的handler獲得HandlerAdapter(循環遍歷DispatchServlet中的HandlerAdpater,找到第一個能支持處理handler的HandlerAdapter)。
  4. 調用HandlerAdapter的applyPreHandle,是調用各類interceptors的preHandle方法。
  5. 調用HandlerAdapter的handle,間接的,會經過反射的方式,調用controller的方法,以後就是咱們熟知的controller到service...
  6. 若是controller返回的不是view,即不是用於前端展現的(如jsp之類的話)。則在HandlerAdapter中會對從controller返回的結果進行處理。值得注意的是,這裏選用哪一種converter,是根據HttpServletRequest頭部的accept的值來判斷的。經過獲得的converter將controller返回的實體用converter進行轉換,然後直接寫入HttpServletResponse。
  7. 若是controller的返回值上有ResponseBody註解,則DispatchServlet的applyDefaultViewName不會進行什麼處理。
  8. DispatchServlet的applyPostHandle中是調用HandlerInterceptor的postHandle方法。
  9. 最後DispatchServlet會調用processDispatchResult,這裏面,
  • 若是以前的處理有拋出異常,則處理異常;
  • 若是是要渲染頁面調用render進行頁面渲染;

 

    注意上面的分析爲了描述總體流程,跳過了不少細節,建議讀者去看看源碼,每一個人的收穫是不同的。大致就是如此,以後就是細節上的問題,好比Spring-webmvc怎麼將HttpServletRequest中的數據轉爲Controller方法上的實體對象;頁面渲染具體怎麼實現。代碼不少,封裝的較深,調用關係複雜,若是要細細分析,仍是要點時間的。github

    將HttpServletRequest中的請求數據轉換爲Controller方法上的實體對象這點,就分好多種狀況。不只支持它已定義的方式,咱們本身還能夠本身定義轉換方式,從這些中能夠看出Spring中的抽象思想層次很深,Spring做者站的角度很高。web

相關文章
相關標籤/搜索