Tomcat迷你版实现

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 中通过来进行指定哪个 URL 交给哪个 servlet 进行处理。

六、启动类




这里,你能够看到 Tomcat 的处理流程,即把 URL 对应处理的 Servlet 关系形成,解析 HTTP 协议,封装请求/响应对象,利用反射实例化具体的 Servlet 进行处理即可。

七、测试


实现一个简易版的 Tomcat 就这么 7 大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对 Tomcat 就没那么陌生了。