Tomcat 之手寫連接器

沒有人永遠年輕,但永遠有人年輕

之前手寫了一個能解析Servlet的簡單的Servlet容器,但是我們的目標可不能止於這些,把Tomcat寫出來纔是我們最終的目標~

概述

我們知道Catalina中有兩個主要的板塊,一個是connector,另外一個是container

  • 連接器負責將請求和容器關聯,它爲每一個Http請求創建一個request和response對象。然後把這兩個對象交給容器
  • 容器接收到對象之後,調用request請求的servlet的service方法。之後,把處理的結果以response返回回去

連接器主要類

相對於上一篇博客的服務器,我們把要寫的類分爲以下幾個類型:

  • 啓動類:Bootstrap
  • 連接器類
    • HttpConnectorHttpProcessor 上一章是HttpServer
      1. HttpConnector等待Http請求
      2. HttpProcessor創建HttpRequestHttpResponse實例
    • HttpRequest和其支持類 上一章是Request
    • HttpResponse和其支持類 上一章是Response
    • Http的外觀類(之前已經實現過)
    • 常量類
      1. HttpHeader 主要用於解析請求頭
      2. HttpRequestLine 主要用於解析請求行
      3. Constants 主要是路徑
  • 核心模塊
    • ServletProcessor
    • StaticResourceProcessor

處理流程

本程序的服務器流程是:

  1. 先是Boostrap啓動服務器,然後HttpConnect等待客戶端的請求。
  2. 當請求到達時,服務器會新開一個線程接收該請求,拿到socket後,把socket傳給HttpProcessor,同時HttpProcessor處理該socket。
  3. HttpProcessor會執行四個操作,創建HttpRequest對象和HttpResponse對象,解析Http請求的請求行和請求頭信息,填充HttpRequest對象。
  4. HttpRequest會去獲得參數,而不是通過HttpProcessor來獲取,因爲我們不知道servlet是否需要這些參數,這樣可以減少資源消耗
  5. 之後,將HttpRequest對象和HttpResponse對象傳遞給ServletProcessor或者StaticResourceProcessorprocess()方法。對於前者來說,其process方法會先找到自定義的Servlet類,然後調用其service方法;對於後者說,其process方法會直接讀取靜態文件。
  6. 之後,把內容填充到HttpResponse中,返回給客戶端

UML類圖

其中,

org.apache.catelina.util.StringManager類用於處理不同模塊的錯誤消息和國際化操作

  • 同一個包下的類共用一個StringManager實例 通過單例模式實現
  • 每個包使用一個properties來說明該包中任何類可能出現的異常信息,每個異常信息都是kv的形式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章