# k8 E* I9 \4 p/ z, E: b从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat + p( K; P' s( N! e( {, @2 S" Q2 j m( S7 q1 l+ W7 B目录 . x) q# ^* }' q4 A# R, k8 M! z: d. }: k' g0 T* _) O
从零开始写一个迷你版的Tomcat( w8 E% g' _( S
& @- h1 P6 r( `! U. S
第一,提供Socket服务) T9 p! }! o. g* _
. `% P- t6 m3 g2 p/ N+ Y第二,进行请求的分发+ N+ y3 S0 n5 x4 a! A
! k( C5 E% E" [ J T* W% h, f
第三,需要把请求和响应封装成request/response 1 K2 L: R$ J; U1 \4 Y$ u8 p1 l$ {+ w7 G* J
一、封装请求对象 4 p9 M/ [ _& u7 S: q6 G& f1 Q+ m- c6 j' F l' w
二、封装响应对象5 D- b$ w, G0 _8 H9 N; Y0 a% g6 d9 H2 z
2 u2 u& p' u3 p! h* h
三、Servlet 请求处理基类 * V4 k; v2 l- E1 P' [) }. G" S5 x6 J T; x5 ?3 s6 }
四、Servlet 实现类 u B* a0 w; H4 N1 r" L3 p
! R. o* n a z五、Servlet 配置 ) U Y& l% n6 z4 X$ k+ Z- z# z8 [( l* K- x" w( V$ y6 B8 f
六、启动类 9 M# h: N2 Z, q1 K+ @ I. A: N9 o K, }' H
七、测试0 b5 V9 [* }% _4 y
" c5 ^- ?$ _. u QTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!( M6 n* [- K& i g
2 ]. E( v f; b
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?4 K5 r0 L' ]. E& v
6 O4 q, v. ^4 L7 C+ j, }' y k H $ q" F% b6 H# b ' a$ g; u. l! J+ a8 o/ O) \从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。 5 m, ?2 C& {& M* y& S. w 6 ~ ?- h- v* H% k0 `( v) p) P, [1 U( h% n
1 `& W- p" h: j2 T$ t$ X. i由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。6 m3 S. D) q8 J. z7 ^( _
7 \4 E0 X+ R f. s& O1 O- T
8 |( R) K9 j3 W7 m1 H4 A3 ~' t
; r0 W8 \7 g* L8 w2 W J% I1 s( \
第一,提供Socket服务0 K+ v8 u& u; U, M6 q6 T7 H
. U. _% k+ j1 ` o p V
' U% V( f8 W2 \( t/ D & p$ X" ~+ |* j" K* C! y1 XTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已! , a& w: N$ s6 S- [ - @& g Z, p6 d& R9 c9 W9 o4 ~: a7 O4 W& r/ f, A' a
5 c) q4 {' t* v$ R$ B, ?
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?/ N& i9 x. {" G' o( L2 ~
- S( r' m3 b9 P ) d0 y! s3 Z0 V4 |/ a/ @" |$ b. ~+ w. D, q8 B3 }
第二,进行请求的分发: X: d; L% c3 `8 e' f s
% v7 ]+ G& C/ ]* V) X2 a& Y % z1 I, i1 g1 K" V" _: ~9 `4 @' A
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。8 Q, Z& \( l9 t' S" m. ~
9 I' o& A1 b4 n& I) E, R1 X6 {! B( D5 E( c+ m" Y
* w V6 M! w, `* ~; T- p: [第三,需要把请求和响应封装成request/response5 y; J+ j! E7 ]/ w
2 X; _/ A. O" c8 i" Z! @! ^2 {) \/ J3 L* J9 G' A2 z2 o