一、如何實現一個簡單的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對象中,返回服務器
二、異常信息管理類StringManager(org.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
則表示服務器繼續讀取輸入流內容