2004 年春節假期,忽然心血來潮,想自己開發一個類似於tomcat(一個很好用的JSP運行平台)的Servlert/jsp(SUN企業級應用的首選)容器,實現Servlet2.3 和 jsp(SUN企業級應用的首選) 1.2 規范,
同時把開發過程的心得及體會寫成手記供各位網友和程序員參考及指正,歡迎大家提供寶貴意見。開發完成後,將所有開發文檔及
源碼與大家分享。謝謝!
ESoftWind
2004/2/4
ServletInputStream
HTTP/1.1協議的請求包由一個請求行(RequestLine),多個請求頭(Header),數據內容(BodyContent)組成,請求頭與數據內容以 分開,請求頭的Cotent-Length屬性說明了BodyContent的長度。如果請求頭中不包含Content-Length屬性,說明請求包中不包含BodyContent
ServletInputStream實現讀取BodyContent的輸入流
read 方法的實現:
必須返回 -1 以表示流的結束,對底層來自Socket的輸入流(底層流),除非客戶端關閉了Socket,底層流是永遠不會返回 -1 的,如果底層流的數據已讀完,此時再調用底層流的 read 方法時,將造成當前線程的阻塞,因此,想依靠底流來返回 -1 來表明 ServletInputStream 的結束是不可行的。
因此,只能依靠Content-Length屬性來判斷流是否結束,如果已讀取的數據總量超過Content-Length時,則返回 -1 。
對於Content-Type 等於 application/x-www-form-urlencoded 請求,Container 必須從底層流讀取以解析request parameter , 對這種情況, ServletInputStream 不能簡單通過讀取底層流的數據來實現 read 方法(因為BodyContent已被讀取了),而只能通過緩存讀取 request parameter 時的數據來實現 ServletInputStream