% A8 g* n' q7 k1 h. f7 G& o从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
& z8 j% I- Y$ p% n( k* G+ U
. O4 I! s7 M& G( Y" I; ]目录0 w2 E7 X7 f9 L, D- C3 y0 d% h/ q
4 c. u5 ~8 s. D" q' S% b# f* p: z s& H从零开始写一个迷你版的Tomcat9 K+ P3 a, ^, a& X# h
& V) F3 w b1 N! }
第一,提供Socket服务- e8 K; v3 m. e; Q- ~/ c7 N
/ b$ L m; G5 ^! M5 f U3 }* q第二,进行请求的分发: n3 {7 U' {/ i, B0 W/ V
! _( u/ n0 [+ _ i" i
第三,需要把请求和响应封装成request/response- t$ ^8 V# J. J; g: f* l* d! r
/ N! @# V- _% M( g4 v3 v一、封装请求对象+ D$ M0 y7 i& ~0 a
1 z1 p' b5 g! k1 n4 K" q5 @% N% S二、封装响应对象
: y7 \9 l9 H9 ^+ u4 \! ?" |9 P' Z8 i5 r) d+ x4 g$ L& r
三、Servlet 请求处理基类! E: S s8 `% W( s8 p6 S, m& z
- P6 @9 H3 M$ Y, T' ]四、Servlet 实现类
+ a2 Y, y/ @" ?1 H
0 h; ?# p# A. h五、Servlet 配置
' p# \( F4 }) ]9 U$ R+ ~
% s# V% z$ A( n+ m六、启动类6 _2 T5 S3 L0 F
, s: h6 M- ~ b8 r x) i" y/ Z7 \七、测试, F K j) }" e2 o8 d
F9 ~. }7 S- n8 s
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!3 l' M9 ?! b4 m5 E; }3 d
2 C; |8 u2 b; S$ R% m. w2 [0 ]
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
/ r4 O# E" w* f) N; q: h
$ ?* L9 k% y) b* p, U) w
9 s2 f2 u! v7 U* D( s7 T# Q
6 ?0 N$ M6 _9 H+ u$ ~从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。$ O- A' f [$ U5 N
" e& b! a! w" n' Z# O
7 d* e) C5 C3 S; |, S- h7 k
' P1 b1 I- t" t' g1 u# y) [& q
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。" C {. L- n1 t- {' U
1 {( D/ z8 u/ x% Z. \. N: I4 G
. l; p- u' r( b8 s% T1 G( q
" y4 C2 B( i) G% a; G. Q/ [- U8 ]第一,提供Socket服务
9 `) t* l0 e3 Y+ m
+ z: u8 l! A6 b, R3 r$ @0 \' U/ K5 \! a, g5 R, U+ ^
( i/ }4 n+ n" P* g- E7 ~ ^Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
- `$ b) @, x: C* \) n5 [1 {' D t1 r5 W4 | n: w. R% j) I |
0 g$ l9 i6 h! ^8 \/ m
) [2 b$ L2 O/ V/ f* q, w* W& J1 u2 e这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?: \8 Z, t/ t2 U, J4 i6 u" }% x
, m7 t. ]: q+ w
$ H6 O, l- R! Y, j& y4 t h; e
3 P5 Q8 t7 Z* P9 g第二,进行请求的分发( D7 V0 U, m, I8 K( i
( h+ x- v7 C* R3 f) N. }- Z) v' v- p: u6 x: q
% F; T, U$ c* y1 F. B7 W: r
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
. t- Q# h/ ~" R! U+ F; p9 C R
0 ?# v s; R! V' X) E1 W1 Q6 b0 j+ X. ]5 |! l; T) P
# x; f: h. v' y, j1 \
第三,需要把请求和响应封装成request/response
' N+ ]% N8 j9 @! B+ X0 o
) s; L( I5 \+ C$ v% U
! r; D l. h5 X0 m7 Z0 l1 f. B6 ]; V
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
8 ]% ~) f2 p8 Q, }' T5 D$ K" K; r1 F. q
6 |0 d- a: T# s2 W6 ]话不多说,先来看一眼工程截图。
9 Q4 r! q, ]" F: u
' z$ h- E" l5 J v9 [, }
一、封装请求对象! \; f0 D: L% K5 @: }0 b+ }' d
) v+ t2 V7 _2 \; P
' c/ Y3 m ?+ n4 }; @0 }
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
$ R& K) M9 _7 Q% ?二、封装响应对象. m) a8 n/ q* t
# f. R; v% V4 R! Y/ a) Z& |8 D& L) c( v. k8 U
基于HTTP协议的格式进行输出写入。 / H8 i) ?/ q" L4 ^: U( `
三、Servlet 请求处理基类
- Z' d. h3 g8 F2 z
0 i8 f% b" `; g3 o- J h
4 ^$ y6 K+ j- ~& m, d* {4 e. C6 Y, I8 [0 H" Y, o
6 u4 ^. O _% I. M
% f8 n& w X0 O7 L4 h前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
`+ j r# `, R) `9 K( o" a, e7 T3 O
: B# W; B% C, b/ V: \. k
: U+ P3 i0 I. _6 C7 I
& p4 V, q8 X, C p' \" R/ t
/ G/ @- q& }. f |提供这2个具体的Servlet实现,只是为了后续的测试! 6 k1 A0 K! o: |1 Z l7 l3 d/ G Z
五、Servlet 配置
% ?7 e7 g7 f7 j3 @. f: F# ]; K& w
+ X7 Y$ Z% C& S! i" P% R- q1 Y
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。 & u: ?; t: z/ X% _
六、启动类
- l! Z' ^9 q$ }, x$ g
: Q8 P* t1 `9 N/ O5 `
M. R; V, L% S/ O8 ~: y这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 1 g) }; d( u/ q( d
七、测试
" j: r1 C1 j7 f. C- G$ r9 |) s
& k" n: F1 {( E5 H5 W# b* ~) j. _, u& z
( k/ K, Q9 ^1 n4 H1 q$ p实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
& R N7 t$ T) J————————————————' C- ?% w+ y; Q5 X) ]5 L4 \
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
( Z! ^4 @6 q3 A% C0 p( W原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480; k" O8 M* j! i1 V p8 F$ L' ]
0 K3 k! h. h6 I: S: k) G
2 p) X/ b1 i1 } r3 M$ x* N
|