. |' J1 ~3 x" V% [ {从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat8 Q+ x# b/ B) L# b; O% C- p
+ v3 {* M- Y$ G; M6 K5 O8 H0 z
目录
6 E5 \* E' M1 V4 D
4 p# T/ K, p! @& e* }5 s; l2 B从零开始写一个迷你版的Tomcat
6 p ^, x6 G) `+ [2 r, L
5 a% v' r( B' R/ z3 C第一,提供Socket服务6 t5 s- S9 W; N
' W5 R* l1 z+ ]" G r% \3 y5 h第二,进行请求的分发
! o! T# h# D+ l3 J
0 p* }- f1 D- Q+ C; z4 n第三,需要把请求和响应封装成request/response. |0 Y3 z$ u! ?) o
5 {& H( M; |; }一、封装请求对象
2 q8 I$ `7 G6 ~( u. X
8 K% x, }* K, ]$ A5 A二、封装响应对象: W! \4 q5 A9 g+ V! Q- D
' M4 K% z7 \ P) V0 W三、Servlet 请求处理基类% c3 q0 K" \. |; Q, l( d- z* d, d c
. a3 F* q) G/ c/ I$ d四、Servlet 实现类; ]3 i; G% E+ Q% k7 \4 P% W
( T6 f8 t0 c3 H' i0 t
五、Servlet 配置
/ t* r( K5 Z: @9 C& \6 X2 V/ I0 y4 h: Z5 V+ s" t' H
六、启动类% D& u5 u- L- B! |" c% c
7 D0 o7 O% V- x七、测试2 d- B; k( }! v. l
6 L6 B$ q. i; \( K+ ZTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
: ?/ [( b! x6 Z$ X w: ?9 p5 E
; X2 s* x0 F8 U( _3 F, rTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?" z* y7 _' X0 z3 Q4 c
5 k# b% q2 W. _
t& R9 S2 h R5 m5 [
5 L" D' g% C/ H: g从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
. I$ E _1 z* H$ s9 R$ F- W1 ~$ g7 u" L6 _4 q# f) @
. `7 \& k& l9 _- N) Z( K
% ?# W/ L: \2 q9 `0 W由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。! G4 @: a, ?) w' \3 b2 V! B
- ]' C; b f" b) J
! m" |' }) _" {" i0 x1 ?* d' m% [
4 W, a6 V8 A) o: J5 x
第一,提供Socket服务
! b2 Y6 u% w4 @# u+ A2 C- n6 Z8 I% }( r; O7 b
/ M t& ~& s1 r& _2 E; `- F5 M
2 @2 Z/ R4 E. o2 n) l
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!" M$ s7 I7 H# M' I% Z
, l* d [7 `$ ~7 }; B; G0 k0 X( C* ~+ t
+ p+ n7 M& c5 N; h% R; O: V1 p g# `
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
3 t; B7 |/ K0 T' l
/ _2 |; l. z- p6 l& `% L9 E4 ?0 H6 U& _. i
& B1 ^9 h4 l) y* G- M. y3 T
第二,进行请求的分发
# F0 a- X& n7 `2 f2 w$ H
( w* M( G8 c r# w
' K0 u1 S5 m* A7 H
7 J- q& s) L `) M要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。# |. |/ T- {* M* }4 H) ?& n
% `% V" i8 d. Y9 [; M/ D
) Q! P* D, C! r4 p B2 I7 f- c8 c! L4 U K: A' X
第三,需要把请求和响应封装成request/response6 ?2 l* ?& W: K
6 B- V: S* Y! L# Q. w! Y1 Z3 O" g) O$ G7 P9 j
' [- v: Y9 a3 i' x% h1 g9 n
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!8 Q7 @1 Z( e, i5 `7 S7 T3 G
. Z7 h) L) J1 f% I; R4 w2 \7 J: i, Q; F
话不多说,先来看一眼工程截图。
8 k. T- A) e- O+ T! V
2 l0 n7 k7 u$ g; W一、封装请求对象" }9 k. L1 j! L+ M$ T5 n6 P
+ A9 Q9 s! m/ S$ q2 t7 ?1 W9 K9 N! Q' p) `+ @
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。 $ x/ J/ x C7 b1 w; Y
二、封装响应对象
Z& I5 D; w* L) G0 F* y' J
[4 E: ~/ c4 I& A: ?# N8 A7 \" C
" s H+ K$ m/ ?; }# _/ l/ B
基于HTTP协议的格式进行输出写入。
8 x. i+ V- ?: K4 N. {8 F6 I, ?三、Servlet 请求处理基类
' h& a' L0 Y* R! r, q
* j' ~& I; J4 e2 I+ ~+ \
$ z& `) a2 {3 S: ?. I0 Z% y: I# h
# G/ T+ z; }8 t! X/ H2 @8 T; { R8 A7 b# J5 c
/ i: \8 X7 g* ~7 I( r* Y
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。# Q# \3 U! _& ~1 \1 ]8 ~! P
9 a4 v4 ^' J: r% k4 ]5 f9 n' L8 A$ A" `1 k
# L( F. H# W; z0 b& S7 z9 s6 H
: O# K: t* S2 ^# N% [- e; m/ ?5 s! ~7 U, v t
提供这2个具体的Servlet实现,只是为了后续的测试! 1 \* V; m! O1 g! O9 T, `
五、Servlet 配置
1 D) u2 @6 u) j4 j
+ N) n5 J2 L E" D$ Y# ^
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
5 P+ {. \' b K4 W1 p$ b% g2 j六、启动类
. R0 Y4 L; v( f6 H( B
0 a' b, I& f, Z3 @7 k
* w5 U2 m; L9 N/ R这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 . I& J9 Q' U" T5 p- k7 j
七、测试
$ h8 F8 t7 ^" X* T
8 o2 e5 }" C$ i. F
9 _, J l: }, ~实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。# K9 ?/ @% P+ r3 O, w4 b
————————————————5 G1 V8 T1 B$ A" R4 Z
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: z/ d6 e! D M# ]- h原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480- c, n7 j; a0 l
g" m( }- x+ n$ N: |) H4 [% n8 k2 f
|