創作緣由
平時使用 tomcat 等 web 伺服器不可謂不多,但是一直一知半解。
於是想著自己實現一個簡單版本,學習一下 tomcat 的精髓。
怎麼實現一個 tomcat 呢?
Tomcat就像是一個用Java語言搭起來的大舞臺,專門用來演出那些用Java編寫的網頁劇。想要玩得轉Tomcat,你最好對Java語言有所瞭解。
搭建Tomcat的過程,就像是搭積木。首先,你得用Java寫一個啟動類,這個類就是整個伺服器的大腦。然後,用Java的ServerSocket
這個工具來監聽網路上的敲門聲,也就是連線請求。一旦有人來敲門,伺服器就得看看人家想要啥,然後根據需求給出回應。
接下來,我們要讓伺服器學會處理網頁請求。這就需要一個叫做Servlet的小傢伙,它是一個介面,你需要寫一個類來實現這個介面。這個類得有幾個特定的動作,比如準備(init()
)、服務(service()
)和收工(destroy()
)。在服務動作裡,Servlet得判斷人家是用什麼方式來請求的,比如是GET還是POST,然後做出相應的反應。
伺服器還得能處理那些不需要伺服器現場製作的靜態檔案,比如圖片、網頁模板或者CSS樣式表。這些檔案就像是現成的道具,直接從硬碟裡拿出來給人家就行。
當然,對於那些需要伺服器現場製作的動態網頁,比如JSP,伺服器就得根據請求的資訊,現場編個網頁,然後發回去。
此外,伺服器還得能處理基本的網頁請求,比如GET和POST,並且能讀懂人家的請求資訊,知道人家想訪問哪個頁面,還帶了什麼額外的資訊。
控制伺服器的開關也很重要。你得寫個方法來控制伺服器的啟動和停止。啟動時,要準備好要用的東西,比如確定用哪個埠號,設定好執行緒池。關閉時,要確保資源都收拾乾淨,網路連線也都斷開。
最後,你可以透過編寫幾個簡單的Servlet和一些靜態檔案,然後在瀏覽器裡測試你的伺服器。確保伺服器能夠正確處理各種請求,並且返回正確的結果。
雖然這只是Tomcat的入門階段,但要打造一個完整的Tomcat,還有很多東西要考慮,比如怎麼讓多個請求同時處理(多執行緒)、怎麼高效管理資料庫連線(連線池)、怎麼記住每個訪客的身份(會話管理)、怎麼保護伺服器不受壞蛋的攻擊(安全問題)等等。
咱們可以一步步來,先搞定這些基本的,再慢慢增加新的功能。
從零手寫例子
專案簡介
/\_/\
( o.o )
> ^ <
mini-cat 是簡易版本的 tomcat 實現。別稱【嗅虎】(心有猛虎,輕嗅薔薇。)
開源地址:https://github.com/houbb/minicat
特性
-
簡單的啟動實現/netty 支援
-
servlet 支援
-
靜態網頁支援
-
filter/listener 支援
-
wars 支援
快速開始
maven 依賴
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>minicat</artifactId>
<version>0.7.0</version>
</dependency>
啟動測試
執行測試類 MiniCatBootstrapMain#main
MiniCatBootstrap bootstrap = new MiniCatBootstrap();
bootstrap.start();
啟動日誌:
[INFO] [2024-04-03 11:09:15.178] [main] [c.g.h.m.s.s.WebXmlServletManager.register] - [MiniCat] register servlet, url=/my, servlet=com.github.houbb.minicat.support.servlet.MyMiniCatHttpServlet
[INFO] [2024-04-03 11:09:15.180] [Thread-0] [c.g.h.m.b.MiniCatBootstrap.startSync] - [MiniCat] start listen on port 8080
[INFO] [2024-04-03 11:09:15.180] [Thread-0] [c.g.h.m.b.MiniCatBootstrap.startSync] - [MiniCat] visit url http://127.0.0.1:8080
頁面訪問:http://127.0.0.1:8080
響應:
http://127.0.0.1:8080
測試
servlet: http://127.0.0.1:8080/my
html: http://127.0.0.1:8080/index.html
開源地址
開源地址:https://github.com/houbb/minicat
開源不易,歡迎 fork+star~~~ 鼓勵一下作者
系列文章
點選 {閱讀原文},獲得更好的閱讀體驗
手寫實現系列
從零手寫實現 apache Tomcat-01-入門介紹
從零手寫實現 apache Tomcat-02-web.xml 入門詳細介紹
從零手寫實現 tomcat-03-基本的 socket 實現
從零手寫實現 tomcat-04-請求和響應的抽象
從零手寫實現 tomcat-05-servlet 處理支援
從零手寫實現 tomcat-06-servlet bio/thread/nio/netty 池化處理
從零手寫實現 tomcat-07-war 如何解析處理三方的 war 包?
從零手寫實現 tomcat-08-tomcat 如何與 springboot 整合?
從零手寫實現 tomcat-09-servlet 處理類
從零手寫實現 tomcat-10-static resource 靜態資原始檔
從零手寫實現 tomcat-11-filter 過濾器
從零手寫實現 tomcat-12-listener 監聽器
tomcat11 系列文章
如果你對 tomcat 不是很熟,可以閱讀下面的系列。
目前的最新版本, tomcat11:
web server apache tomcat11-01-官方文件入門介紹
web server apache tomcat11-02-setup 啟動
web server apache tomcat11-03-deploy 如何部署
web server apache tomcat11-04-manager 如何管理?
web server apache tomcat11-06-Host Manager App -- Text Interface
web server apache tomcat11-07-Realm Configuration
web server apache tomcat11-08-JNDI Resources
web server apache tomcat11-09-JNDI Datasource
web server apache tomcat11-10-Class Loader
web server apache tomcat11-11-Jasper 2 JSP Engine
web server apache tomcat11-12-SSL/TLS Configuration
web server apache tomcat11-13-SSI
web server apache tomcat11-14-CGI
web server apache tomcat11-15-proxy
web server apache tomcat11-16-mbean
web server apache tomcat11-17-default-servlet
web server apache tomcat11-18-clusting 叢集
web server apache tomcat11-19-load balance 負載均衡
web server apache tomcat11-20-connectors 聯結器
web server apache tomcat11-21-monitor and management 監控與管理
web server apache tomcat11-22-logging 日誌
web server apache tomcat11-23-APR
web server apache tomcat11-24-Virtual Hosting and Tomcat
web server apache tomcat11-25-Advanced IO and Tomcat
web server apache tomcat11-26-maven jars
web server apache tomcat11-27-Security Considerations
web server apache tomcat11-28-Windows Service
web server apache tomcat11-29-Windows Authentication
web server apache tomcat11-30-The Tomcat JDBC Connection Pool
web server apache tomcat11-31-websocket
web server apache tomcat11-32-rewrite
web server apache tomcat11-33-CDI
web server apache tomcat11-34-Ahead of Time compilation support