手寫實現乙個迷你版的Tomcat

2021-09-14 06:47:38 字數 1441 閱讀 6994

tomcat,這只3腳貓,大學的時候就認識了,直到現在工作中,也常會和它打交道。這是乙隻神奇的貓,今天讓我來抽象你,實現你!

tomcat是非常流行的web server,它還是乙個滿足servlet規範的容器。那麼想一想,tomcat和我們的web應用是什麼關係?

從感性上來說,我們一般需要把web應用打成war包部署到tomcat中,在我們的web應用中,我們要指明url被哪個類的哪個方法所處理(不論是原始的servlet開發,還是現在流行的spring mvc都必須指明)。

由於我們的web應用是執行在tomcat中,那麼顯然,請求必定是先到達tomcat的。tomcat對於請求實際上會進行下面的處理:

第一:提供socket服務

tomcat的啟動,必然是socket服務,只不過它支援http協議而已!

這裡其實可以擴充套件思考下,tomcat既然是基於socket,那麼是基於bio or nio or aio呢?

第二:進行請求的分發

要知道乙個tomcat可以為多個web應用提供服務,那麼很顯然,tomcat可以把url下發到不同的web應用。

第三:需要把請求和響應封裝成request/response

我們在web應用這一層,可從來沒有封裝過request/response的,我們都是直接使用的,這就是因為tomcat已經為你做好了!

話不多說,先來看一眼工程截圖:

myrequest

這裡,你可以清楚的看到,我們通過輸入流,對http協議進行解析,拿到了http請求頭的方法以及url。

myresponse

基於http協議的格式進行輸出寫入。

myservlet

前文說tomcat是滿足servlet規範的容器,那麼自然tomcat需要提供api。這裡你看到了servlet常見的doget/dopost/service方法。

findgirlservlet和helloworldservlet

提供這2個具體的servlet實現,只是為了後續的測試!

你應該有些感覺了吧?

mytomcat

start方法

start

dispatch

這裡,你能夠看到tomcat的處理流程:把url對應處理的servlet關係形成,解析http協議,封裝請求/響應物件,利用反射例項化具體的servlet進行處理即可。

test mytomcat

running!

ok,mytomcat is so urgly,but i like it!

good night!

實現乙個迷你版的vue

專案位址 其實vue1和vue2最大的區別就是vue2多了乙個虛擬dom,其他的區別都是很小的。所以理解了vue1的原始碼,就相當於理解了vue2,中間差了乙個虛擬dom的diff演算法 先來科普一下mvvm的概念及原理 mini vuex 全域性方法 繼承minivue 產生乙個新的子類建構函式 ...

迷你版Vue 學習如何造乙個Vue輪子

專案位址 其實vue1和vue2最大的區別就是vue2多了乙個虛擬dom,其他的區別都是很小的。所以理解了vue1的原始碼,就相當於理解了vue2,中間差了乙個虛擬dom的diff演算法 先來科普一下mvvm的概念及原理 mini vuex 全域性方法 繼承minivue 產生乙個新的子類建構函式 ...

手寫乙個簡化版Tomcat

我們啟動tomcat時雙擊的startup.bat檔案的主要作用是找到catalina.bat,並且把引數傳遞給它,而catalina.bat中有這樣一段話 bootstrap.class是整個tomcat 的入口,我們在tomcat原始碼裡找到這個類,其中就有我們經常使用的main方法 這個類有兩...