tomcat讀書筆記-WEB應用載入篇
Context Config
-
AFTER_INIT_EVENT 主要負責載入config,載入順序是
META-INF/configFile
,conf/<Engine名稱>/<Host名稱>/congfig.xml.default
,conf/context.xml
-
BEFORE_START_EVENT 主要是用來更新docBase屬性及是否對原資源目錄進行copy避免加鎖
-
CONFIGURE_START_EVENT 主要用來載入Web Context,讀取
web.xml
形成WebXml物件,並根據這個配置進行載入Web Context
StandardWrapper
這個維護了具體的servlet例項,在StandardContext啟動過程中,StandardWrapper處理分成兩個部分
- 當ContextConfig完成web容器初始化後,先呼叫
StandardWrapper.start
,此時StandardWrapper元件狀態變為STARTED,傳送啟動廣播 - 對於啟動時載入的Servlet(即load-on-startup > 0),呼叫
StandardWrapper.load
方法,完成servlet的載入
具體過程如下:
- 建立servlet例項,注入所依賴的JNDI資源
- 讀取
javax.servlet.annotation.MutipartConfig
配置。這個配置是用來multipart/form-data
請求處理,包括臨時檔案儲存路徑、上傳檔案最大字數、請求最大字數、檔案大小閾值。 - 根據
javax.servlet.annotation.ServletSecurity()
配置新增servlet安全 - 呼叫
javax.servlet.Servlet.init()
進行servlet初始化
請求處理過程
首先要講到的是tomcat通過org.apache.tomcat.util.http.mapper.Mapper
維護請求連線與Host、Context、Wrapper等Container的對映。通過通過org.apache.catalina.connector.MapperListener
其次要講到的是如何將Connector與Mapper連線起來,這裡用到的就是org.apache.catalina.connector.CoyoteAdapter
,當Connector收到請求時,呼叫CoyoteAdapter.service()
方法完成請求處理
具體過程如下:
- 根據Connector的請求(org.apache.coyote.Request)和響應(org.apache.coyote.Response)物件轉化為Servlet請求(org.apache.catalina.connector.Request)和響應(org.apache.catalina.connector.Response)
- 轉換請求引數並完成請求對映。
- 請求URI解碼,初始化請求路徑的引數
- 請求對映,得到請求結果
org.apache.tomcat.util.http.mapper.mapper.MappingData
, 然後最終對映為一個有效的Wrapper - 如果當前Connector不允許跟蹤,那麼就設定allowTrace為false。如果當前請求的方法是trace,那麼就返回405響應碼。
- 執行聯結器的認證及授權。
- 得到Engine的第一個value並執行完成客戶端的處理。
- 如果為非同步請求,獲取請求事件監聽器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這本書的時候。書裡在介紹的時候,寫的像閱讀程式碼一樣沒有太多總結,而太多的具體詳細過程對我沒有一個直接的印象,所以只記錄我覺得涉及到的。