+ A/ R# X5 _& S从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat0 V% {- C H4 n# O
& C# ?- B5 s6 V- F' G, B目录: b( Q/ ^2 O1 y m4 a
$ [* {% ?+ k3 U2 ?4 N3 k3 B2 m从零开始写一个迷你版的Tomcat7 [1 @% ~8 Z1 j0 ?
! e* v0 J9 k, s0 g7 B7 @第一,提供Socket服务
; _! M' s; ?: `" Q6 _' R1 X# H; }
- D8 x# \% n3 m( B+ g* l5 E第二,进行请求的分发
$ r. Z8 W& t9 s( ^; a P( ]( Z9 E. W) o- p
第三,需要把请求和响应封装成request/response
3 S$ p" A) ]) f( L, ?. f
- N, S! V) ~+ {一、封装请求对象' l% I# B4 z/ N8 `
6 H$ S4 D8 x$ j. P X5 a
二、封装响应对象
2 O8 s% {3 g* [* u& e9 q
. g4 g. L. B6 C三、Servlet 请求处理基类
. _. b; f# d& g( ?
$ I# V- s& \2 h9 |四、Servlet 实现类
" L5 ?* x' F2 L2 O0 P* E7 w1 G B
五、Servlet 配置
( D, x. w/ X* `* Q* ?( a6 \2 p! j1 p1 o2 y, v6 v1 n7 [4 C
六、启动类
& Z3 G( e2 l( E. m% P# `+ X; o% _% h2 n
七、测试) p3 K$ V. v2 r7 L/ Y# i) P
& y0 R2 e. m6 |: a- ~Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
: t" A, [$ ?5 e& m# V5 w8 b3 b5 X) D) W, U7 o$ ^8 k& t
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
F* f7 {5 b" \9 A( g9 Q1 Q( }1 l( T5 B
. _- Z7 ^' q9 V p
H5 }& p4 k; S3 S! ]从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。" z" G9 n: Z5 \( U$ g* u$ m& g
+ I0 H$ n" E3 n
; \- J! o! L3 b' }4 u' Z- ~/ M4 c( Q9 S- `, { D8 r, u
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。- I6 g# O0 K. n! g
( C/ R C) g0 b; X6 u# _6 D- k5 L1 m6 A
+ x* j* b2 v- c; |第一,提供Socket服务+ K5 @4 l U$ z* ^. S5 L
7 ~ S" l& Z9 D4 Z" J9 ~3 q/ W
# F) \7 o, o% b
C @* V( _0 v; n4 _6 d% dTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
9 q' p+ o6 f+ f& W; X5 R
+ E/ p' W: l; w( @% ^) m. w5 J8 ]3 ` o! j% w& k8 }
' G; ^" N* }, s4 ]9 ?2 U
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
8 }6 N X2 A3 q& ? @$ F8 h7 K) {" q! B. s8 G4 ?0 y- K
9 M# a0 X* i7 V& k
" e- ^; c: Y' }9 K- m+ i第二,进行请求的分发
' [2 K2 S; W6 `, j, s% J' C2 M" l0 v p% y* W3 n1 H
- L: r( }2 t$ j: t0 ]0 s+ U
: K* ~5 y8 Q$ P+ Q要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
: f$ ]2 ^! k1 i& o1 s
# A/ H1 W' I: ]& B/ `- F' t
+ P) d+ @: O$ s# f4 u/ }+ Z/ _/ _" P% B
第三,需要把请求和响应封装成request/response6 B& J: e( |4 Y% E. v
0 u4 b6 x4 Z. j) R o
. h( a8 ?6 f* p" E3 ?! X, Z
+ `6 G' R; `8 ^( P! h9 ~1 O# E
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!9 o/ o- x- i! R3 o; l
: D( T7 J4 R# a( |- u1 Y4 `
+ N% w, J9 P) ?$ A, t( C
话不多说,先来看一眼工程截图。: q* o0 i: Q0 q" f
5 u+ G) L0 ^5 Y& v( t
一、封装请求对象
5 O$ G( }4 O+ w$ j! r$ u) Q! F* [
; m4 _; O2 A8 W( g" \8 |5 W* [" _( f
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
: p* S! b; s2 N+ z; c/ k+ q二、封装响应对象
% ^4 M5 Y$ C/ |& @: T& X; v; u
) ^8 z) {/ @2 `# F& ]' E% X
; a9 k0 ~ i" Z7 d5 |6 o! x. t基于HTTP协议的格式进行输出写入。
5 n' V8 b- O# v三、Servlet 请求处理基类% u/ f6 w4 |- G$ F7 L
# s2 i/ q! }" o9 b$ f
& x _" p! p7 t! s
8 F% h3 }) B& ^3 p. V9 {/ X3 L
. N" F9 v+ r" B2 u0 F! J) n4 S! S
& I3 P; V9 r$ n* ]# I& V& p前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
3 {# y) K6 c3 R: ]6 W3 l7 k+ v( R% ?% y- `8 ^
5 w- W. s9 n' B, t! @
: g& a9 }: o' I6 \! g* w- m/ c8 f/ w4 l) x
! M. L: i" _! T9 ^& t; R# R& ^
提供这2个具体的Servlet实现,只是为了后续的测试! 9 f8 y/ T) U6 a1 i8 U3 P
五、Servlet 配置
Q1 w. U. h" c# r p8 ~0 _
, o+ l& U4 b3 |# v& R% {' }你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。 6 y+ B! m8 `0 M8 w& N* G2 i+ ^" E
六、启动类
# X6 J/ n+ n% V, c5 y5 S% r, z& s: D
, z; n( z& b9 x% b* E
$ N. }1 Y+ P# \: d这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 ! k' P& m& a4 P! U0 n F
七、测试
0 E; Q% L8 R0 x' Y& i9 m. a |% l8 p% K/ t& z' {3 k4 j
% u+ l6 `7 f7 _9 q* n2 v$ b
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。- H. y7 ]+ i' X: Q6 `/ p
————————————————
; k/ }4 n6 z* i0 C版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
y* i- O& ?8 Z" }. w. P5 D6 W* ~原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480$ p2 c4 h: {$ h) U
( h2 `* T6 K9 W. o" @, l$ j8 t% }
' z! U e7 r r! w |