怎么实现一个 tomcat 呢?
想要自己搞个简化版的Tomcat,可以这么一步步来:
搞懂Tomcat是啥:
- Tomcat就是用Java写的一个开源服务器,能跑Java写的网页程序。
- 它用的是Java语言,所以得有点Java基础。
搭建个基础的HTTP服务器:
- 用Java写个类,作为服务器的启动点。
- 用Java的
ServerSocket
来监听网上的连接请求。 - 一旦有人连上,就读他们的请求,分析他们想要啥。
- 根据他们要的,给回相应的回答。
实现Servlet的功能:
- 写个类来处理网页请求,这个类得实现Servlet接口。
- 实现接口得写几个特定的方法,比如初始化(
init()
)、服务(service()
)和销毁(destroy()
)。 - 在
service()
方法里,看是哪种请求(比如GET或POST),然后调用对应的处理方法。
搞定静态文件:
- 对于图片、网页、样式表这些静态文件,直接从硬盘上读出来,然后发给请求的人就行。
- 收到请求后,看看人家是要静态文件还是动态网页。
处理动态网页:
- 对于需要服务器实时生成的网页,比如JSP,就得在服务器上现做。
- 有人请求这种网页,就根据请求的信息,现场编个网页,然后发回去。
处理基本的请求:
- 能处理基本的网页请求,比如GET和POST。
- 能读懂请求的信息,知道人家要访问哪个网页,还带了什么参数。
启动和关闭服务器:
- 写个方法来控制服务器的开和关。
- 开服务器的时候,得准备好要用的东西,比如端口号、线程池。
- 关服务器的时候,得把资源清理干净,把网络连接关了。
测试你的服务器:
- 写几个简单的Servlet和静态文件,然后在浏览器里试试你的服务器。
- 确保服务器能正确处理各种请求,返回正确的结果。
要做出完整的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
测试
servlet: http://127.0.0.1:8080/my
html: http://127.0.0.1:8080/index.html
开源地址
开源地址:https://github.com/houbb/minicat
开源不易,欢迎 fork+star~~~ 鼓励一下作者