1. 程式人生 > >tomcat讀書筆記-WEB應用載入篇

tomcat讀書筆記-WEB應用載入篇

Context Config

  1. AFTER_INIT_EVENT 主要負責載入config,載入順序是META-INF/configFileconf/<Engine名稱>/<Host名稱>/congfig.xml.defaultconf/context.xml

  2. BEFORE_START_EVENT 主要是用來更新docBase屬性及是否對原資源目錄進行copy避免加鎖

  3. CONFIGURE_START_EVENT 主要用來載入Web Context,讀取web.xml形成WebXml物件,並根據這個配置進行載入Web Context

StandardWrapper

這個維護了具體的servlet例項,在StandardContext啟動過程中,StandardWrapper處理分成兩個部分

  1. 當ContextConfig完成web容器初始化後,先呼叫StandardWrapper.start,此時StandardWrapper元件狀態變為STARTED,傳送啟動廣播
  2. 對於啟動時載入的Servlet(即load-on-startup > 0),呼叫StandardWrapper.load方法,完成servlet的載入

具體過程如下:

  1. 建立servlet例項,注入所依賴的JNDI資源
  2. 讀取javax.servlet.annotation.MutipartConfig配置。這個配置是用來multipart/form-data請求處理,包括臨時檔案儲存路徑、上傳檔案最大字數、請求最大字數、檔案大小閾值。
  3. 根據javax.servlet.annotation.ServletSecurity()配置新增servlet安全
  4. 呼叫javax.servlet.Servlet.init()進行servlet初始化

請求處理過程

首先要講到的是tomcat通過org.apache.tomcat.util.http.mapper.Mapper維護請求連線與Host、Context、Wrapper等Container的對映。通過通過org.apache.catalina.connector.MapperListener

監聽器監聽所有的Host、Context、Wrapper元件,在相關元件啟動、停止時註冊或者移除

其次要講到的是如何將Connector與Mapper連線起來,這裡用到的就是org.apache.catalina.connector.CoyoteAdapter,當Connector收到請求時,呼叫CoyoteAdapter.service()方法完成請求處理

具體過程如下:

  1. 根據Connector的請求(org.apache.coyote.Request)和響應(org.apache.coyote.Response)物件轉化為Servlet請求(org.apache.catalina.connector.Request)和響應(org.apache.catalina.connector.Response)
  2. 轉換請求引數並完成請求對映。
  3. 請求URI解碼,初始化請求路徑的引數
  4. 請求對映,得到請求結果org.apache.tomcat.util.http.mapper.mapper.MappingData, 然後最終對映為一個有效的Wrapper
  5. 如果當前Connector不允許跟蹤,那麼就設定allowTrace為false。如果當前請求的方法是trace,那麼就返回405響應碼。
  6. 執行聯結器的認證及授權。
  7. 得到Engine的第一個value並執行完成客戶端的處理。
  8. 如果為非同步請求,獲取請求事件監聽器ReadListener,如果資料返回,則觸發ReadListener.onAllDataRead方法。如果是同步請求,直接Flush並關閉請求輸入流,flush關閉響應輸出流

MapperWrapper對映

對映順序為exactWrappers > wildcardWrappers > extendsionWrappers > 歡迎檔案 exact > wildcard > extendsion)

預設的servlet

在${catalina_home}/conf/web.xml自帶了兩個預設的servlet,分別是defaultServlet和jspServlet

defaultServlet主要用於處理靜態資源,例如js,html等

這裡記得比較亂,是因為在讀tomcat這本書的時候。書裡在介紹的時候,寫的像閱讀程式碼一樣沒有太多總結,而太多的具體詳細過程對我沒有一個直接的印象,所以只記錄我覺得涉及到的。