Article-No.04 深刻剖析Tomcat

一、如何實現一個簡單的servlet容器(處理靜態資源和簡單的servlet請求)步驟css

    1)建立ServerSocket對象,等待HTTP請求
web

    2)建立一個ServletRequest對象和一個ServletResponse,前者封裝socket獲取到的inputsream輸入流,後者封裝socket獲取到的outputstream輸出流
shell

    3)若是訪問靜態資源,調用StaticResourceProcessor類的process方法,傳遞ServletRequest和ServletResponse實例,並讀取靜態資源,經過輸出流輸出apache

    4)若是訪問的是servlet,經過反射機制加載servlet類,並調用service方法,同時傳遞ServletRequest和ServletResponse實例tomcat

    5)處理完成後,將數據封裝到ServletResponse對象中,返回服務器

二、異常信息管理類StringManagerorg.apache.tomcat.util.res.StringManager):用於處理Tomcat錯誤消息,Tomcat每個包下都有一個對應的存儲錯誤消息在properties文件,每個properties文件都是由StringManager類實例管理cookie

    StringManger管理類是一個單例類,有一個HashTable對象,以包名+語言(Locale爲key,進行存儲
less

三、鏈接器socket

    1)Tomcat的Servlet容器名稱爲Catalina,主要包含兩個模塊:鏈接器(connector)和容器(container)
編碼

    2)鏈接器做用:解析HTTP請求頭,以便servlet能夠獲取到header信息和cookie信息以及請求參數信息等,數據保存到httpservletrequest對象中

    3)實現一個簡單的鏈接器,由兩部分組成:HttpConnector、HttpProcessor

    HttpConnector做用:一、等待一個HTTP請求,二、爲請求建立一個HttpProcessor實例,三、調用HttpProcessor實例的process方法

    HttpProcessor做用:一、建立請求對象(ServletRequest)和響應對象(ServletResponse),二、解析HTTP請求行和請求頭,填充到ServletRequest對象中,三、將ServletRequest和ServletResponse對象建立給Servlet,並調用service方法

    4)解析HTTP請求頭步驟

    a、讀取套接字的輸入流;b、解析請求行;c、解析請求頭;d、解析Cookie;f、解析獲取請求參數

四、Tomcat默認鏈接器

    1)Tomcat使用的鏈接器必須知足一下條件:

  • 實現org.apache.catalina.Connector接口

  • 負責建立實現了org.apache.catalina.Reuqest接口的request對象

  • 負責建立實現了org.apache.catalina.Response接口的response對象

    2)HTTP 1.1新特性

  • 持久鏈接(connection: keep-live):在HTTP 1.1以前,客戶端請求服務器資源,服務器將請求的資源返回給客戶端後,會關閉HTTP鏈接。可是網頁上還有一些其餘資源,諸如:css、js、img等,請求一個頁面,還須要下載這些資源,若是每次請求都建立一個HTTP鏈接,很是的消耗資源和時間。在HTTP 1.1當資源返回後,並不會當即關閉鏈接,它會等到web頁面上全部請求的資源都下載完成後在關閉鏈接,這樣頁面和唄頁面引用的資源都是同一個鏈接下載。同一個鏈接下載全部資源減小了web服務器和web客戶端時間和工做量

  • 塊編碼:在HTTP 1.1中使用一個名爲「tranfer-encoding」的特殊請求頭,來指明字節流將會以分塊發送,每個塊都是【塊的長度(以十六進制表)+ \r\n + 具體的塊數據】,末尾以一個長度爲0的塊標記

//原始內容:I'm as helpless as a kitten up a tree
1D\r\n //1D表示第一塊爲29個字節長度
I'm as helpless as a kitten u
9\r\n
p a tree
0\r\n //表示事務已經完成
  • 狀態碼100:再發送一個較大請求體以前,客戶端不肯定服務器可否處理,在發送請求體以前請求頭裏面添加:Expect: 100-continue,若是服務器返回:HTTP/1.1 100 Continue

        則表示服務器繼續讀取輸入流內容

相關文章
相關標籤/搜索