教你寫一個迷你版的Tomcat

作者:張豐哲
原文:https://www.jianshu.com/p/dce1ee01fb90

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 已經爲你做好了!

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

一、封裝請求對象

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

二、封裝響應對象

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

三、Servlet 請求處理基類

前文說Tomcat是滿足Servlet規範的容器,那麼自然Tomcat需要提供API。這裏你看到了Servlet常見的doGet/doPost/service方法。

四、Servlet 實現類

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

五、Servlet 配置

你應該有些感覺了吧?

我們在servlet開發中,會在 web.xml 中通過 <servlet></servlet> 和 <servlet-mapping></servlet-mapping> 來進行指定哪個 URL 交給哪個 servlet 進行處理。

六、啓動類

這裏,你能夠看到 Tomcat 的處理流程,即把 URL 對應處理的 Servlet 關係形成,解析 HTTP 協議,封裝請求/響應對象,利用反射實例化具體的 Servlet 進行處理即可。

七、測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章