# \/ ]" K' X3 s( Y- g$ ~
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
: Q1 i" \+ {* b6 J; Q% G5 r0 |+ ~. ~2 W T" b! }0 P
目录
5 n+ U6 d+ j. O5 O1 W* D2 ~1 s3 m c
从零开始写一个迷你版的Tomcat; [8 c/ D; a) Z. @* E. A) S$ T- F
" l! x$ W: d g9 t' M2 x
第一,提供Socket服务
9 j8 u% y1 W: H5 m$ c/ W7 Q. G2 N$ \1 B3 K( }- [
第二,进行请求的分发7 E8 d( r N9 e; O$ k
2 ~7 K6 o: ]* F ?第三,需要把请求和响应封装成request/response" k! D) e! {. x2 @: e
5 @( w% V5 A+ X- f( G一、封装请求对象
( R; O' P f+ G. ~) K0 H$ @7 |, x' ~; o- N6 ?/ `
二、封装响应对象 T/ D3 `* I7 P9 w$ G: r7 {$ M
' R- e+ d V2 [+ Y0 s! p% q三、Servlet 请求处理基类
6 g- X! @9 Z6 O3 b0 f, B/ s$ k& X7 n; |8 n" f! v# i
四、Servlet 实现类1 F" s$ d3 H. t) u
! `# U. l9 Q5 A五、Servlet 配置
8 B* ]. y% m$ p0 k7 B! o" n, a9 G/ X' N j" r8 T
六、启动类/ u% e4 _ p; z3 v
5 {+ [! c$ m" F2 D
七、测试2 U- L- ?8 d9 b
. v5 v. _2 P5 w4 T4 _& o5 Q' PTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
0 p' P/ T& r9 m2 E3 B* o: ^
9 X( U1 Z4 ^8 @# m- x3 a) I9 YTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
; m. W) P9 n. @' r# s( _7 O
, D l [+ O5 U, `1 N {# h9 R
, M+ y8 w* ` K+ C0 g
" i. |$ `* i1 w' s9 F从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。- @7 V" I) u; G" z0 @1 j
( z1 U) O9 L; P6 e" i
/ q: K0 d1 s& p" {
, m# J# h6 O0 a! e由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。 e. Q& }$ \9 g% Q+ `" V: B
; t( Z& E' t" M) r3 m/ X7 H
2 Q- }1 m* U- Q7 I+ w! P
# s. S' M& X* \! I0 C第一,提供Socket服务
: f+ B' P. b7 G
* U/ a7 b5 I/ r8 T( f: v* d4 q( j* P, G; D
n. ^+ ^3 O3 [+ v) E3 I3 o
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
5 j0 d( H0 j6 E7 i3 H n* `
( s X/ X: \" x( _( T q" P
# v. X) R; T `% n8 f1 o4 I# B0 {( I* ?+ C+ H d+ D
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
9 c% L9 X; K" m( x) ^: E8 e% ?1 ~# b/ }! Z* S1 j, {
1 F0 @, r# i2 T- i
5 W; v- V* K$ W) d/ t( M
第二,进行请求的分发: }. d+ E H% ^! H* S Z
2 ?9 O5 E l; E5 V9 Y$ i
7 }: F! c7 g. {6 ~; |- q
$ F/ i# ]0 @% } G6 S: {" E要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
& m3 G' Y, H9 p! X8 v: P
5 P0 | i d$ M- W( I4 [8 `
9 T5 o; u3 i @* X* V- Z @# s4 P+ a; I6 T4 D9 I* g: K- T
第三,需要把请求和响应封装成request/response& h5 a& y3 q2 c' \& F1 R
5 ]( {( P- x$ z `" j
- _- a2 w- y: q) s1 x( V1 _& N
& c7 @8 {' g9 L我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!; s8 q: t5 m0 F% K! F
. _; P+ V) Y. [+ \$ j" H' s
9 v: h* k- k+ e7 N3 d
话不多说,先来看一眼工程截图。
9 \ e% z% Y. Z3 r1 G
4 `# q. H' U! ^- w* y一、封装请求对象
?0 K1 l& ], I9 [2 L# w0 w
% x% ?- C5 W- D9 U& E
6 s' s9 Z# w! b/ g1 K. N这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
9 y- A* I9 `( w: ]: G二、封装响应对象9 y& b6 v0 a: z2 j* K6 b
2 G( s' I" c" v
: G/ P7 h3 i( M* q
基于HTTP协议的格式进行输出写入。
% V* E1 j8 k4 S# v! X6 z2 l4 `* [三、Servlet 请求处理基类' L M9 _( {) \% g$ _
a% C, c* F9 Q
+ Z" O2 l* ~) z/ H5 l8 R$ [ e/ _
3 p( \2 F7 B% ]" C
5 r5 H8 ]+ ^: M( N# x" c" P3 g前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
( e$ l0 q2 G! R& F5 p( @/ g1 K3 u
( [8 j5 B9 X0 u1 [
9 ?7 f$ n# e. ^% N/ H& o
1 x5 x9 A+ R2 \1 Z8 H9 J0 B- c* Q9 {+ f# z. U. B' ?% s9 g
* a3 O7 y9 N2 ~# q( k3 p+ M: L& G提供这2个具体的Servlet实现,只是为了后续的测试!
/ G" a/ ~0 z- R五、Servlet 配置
9 Z$ ~: M V% `( A6 V- ]
' @$ H9 F8 X# p) u, G2 ?/ ]$ ]6 R( b3 S) T
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
8 m1 i4 ^0 X7 T' }0 D& s六、启动类
4 I; u" m9 t( w% r
4 O6 T s# N/ U6 c9 c! u4 O
2 a0 T* b" } {- ^& O+ C3 `4 n
这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 " o' ]: @0 B3 L& j* I" z
七、测试
2 s: K8 Z: v! R& f# s& [0 y7 P# `
. ?8 e# Z+ j) r+ T$ f; s
8 | D L4 F/ y# W0 A9 L' P+ @6 U2 ]
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
0 Q# }& W5 e2 G K+ L) w* z8 f! b————————————————
3 J" a7 G2 v& K2 t版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* R4 M) a5 b" H- U- ?, ^) |+ u" ? K/ f
原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274807 I D$ Q0 U3 q0 f* i- o7 {
/ Y1 k. C1 g. O6 @7 c. _ g/ \
6 Z3 Q" A8 r: W
|