用代码解释 Tomcat 运行原理
点击蓝色“泥瓦匠BYSocket”,关注我哟 加个“星标”,不忘签到哦
“切记:要求越多,规定越多,标准越多,
问题越多,越描越黑,越理越乱,聪明反被聪明误。”
来源:http://t.cn/EfQhj2t
前言
Write MyTomcat
2.1 MyRequest
2.2 MyResponse
2.3 MyServlet
2.4 ServletMapping 和 ServletMappingConfig
2.5 MyTomcat
2.6 Test MyTomcat
前言
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
![Tomcat](https://filescdn.proginn.com/3d7f7f9ff6d3be2349afd3f882ad29f8/89f3a7727a7a2101c498093c358db3e3.webp)
Write MyTomcat
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已经为你做好了!
话不多说,先来看一眼工程截图:
![工程结构](https://filescdn.proginn.com/c72f61e1fc4e2db9d75de3efc8c6803f/a4f2e7f7efa5fd3723b79f042882f75c.webp)
2.1 MyRequest
![封装请求对象](https://filescdn.proginn.com/85b57f21b8d45cd947be8a924629b846/152ff66de080bffad4eaac9d173d6472.webp)
这里,你可以清楚的看到,我们通过输入流,对HTTP协议进行解析,拿到了HTTP请求头的方法以及URL。
2.2 MyResponse
![img](https://filescdn.proginn.com/85585de9d81611e2b83e5873b5d7b84f/0468cbbadc0265895cb9fe8815f833df.webp)
封装响应对象
基于HTTP协议的格式进行输出写入。
2.3 MyServlet
![提供Servlet](https://filescdn.proginn.com/e2865428e5d42fcf229034f3a50dd8c1/1f5ae13532270bffefb1ce9a32a4178e.webp)
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里你看到了Servlet常见的doGet/doPost/service方法。
FindGirlServlet和HelloWorldServlet
![FindGirlServlet](https://filescdn.proginn.com/ca6d217090053d075893e966b19bc372/7004cbb6f5e195da83917ec8a9210efb.webp)
![HelloWorldServlet](https://filescdn.proginn.com/bb8e5d66e069fa2302b091b1e0b244a8/263e0889b77552f27a6679092aad80aa.webp)
提供这2个具体的Servlet实现,只是为了后续的测试!
2.4 ServletMapping 和 ServletMappingConfig
![servlet配置](https://filescdn.proginn.com/b8dbad9895015d22c240d45e6e10d427/aa774197f93dda06ad36ec59ffcb358e.webp)
![servlet配置](https://filescdn.proginn.com/57609078077d475c884502c530fbef9a/9e48a85f197493cf47721f45a6aef04f.webp)
你应该有些感觉了吧?
我们在servlet开发中,会在web.xml中通过和来进行指定哪个URL交给哪个servlet进行处理。
2.5 MyTomcat
![端口](https://filescdn.proginn.com/d7c970ca368d1d006e085b9f2a49654f/54b4dae15e018bfbd5d4a41a1d6b6111.webp)
start 方法
![start](https://filescdn.proginn.com/958caf2bd374af64f0ded996b30d2deb/8afde4a93a4f0f6748f7c93f6189433e.webp)
![dispatch](https://filescdn.proginn.com/07fedcc77eaa111ca38e4ca9eeb39348/d902edfe194df1e725f04b7955e773b6.webp)
这里,你能够看到Tomcat的处理流程:把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
2.6 Test MyTomcat
![running!](https://filescdn.proginn.com/22657d84514061355d6851c6a7e11fa6/7013270691895f27221ebe27bc2a5ce1.webp)
Ok,MyTomcat is so urgly,but i like it!
下方二维码关注我
![](https://filescdn.proginn.com/88fd5420caa1b8e88185760319831063/e04fcdf2c026ec23d97e76abe359f508.webp)
互联网草根,坚持分享技术、创业、产品等心得和总结~
点击“阅读原文”,领取 2020 年最新免费技术资料大全