4 u* }* f/ \( E从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
, l5 `; q) C, X. M5 U1 A4 O) n) d: u! c: r; B7 R
目录
+ B Z0 _% ^7 X: J
, l z) {: F; ~* _- s( { m从零开始写一个迷你版的Tomcat7 p$ n; |! C; L# v0 N% ~
" J/ \1 [7 M2 V' U0 Z
第一,提供Socket服务
& U4 q b8 R) V( L* _6 g) X, x$ E
! I8 @: t2 c& B* E; _6 f第二,进行请求的分发
& m1 R: ~7 O B: L
' j1 B5 V0 x, q# v$ t% p- d第三,需要把请求和响应封装成request/response5 Y" X. {1 _& i0 Q9 p7 a
( v- I) O0 P" h- q0 c) V一、封装请求对象. K" H: F4 [$ D" p
0 i) k t4 r0 u) E7 H二、封装响应对象5 n% p2 @3 r& X9 K9 r9 `, c
$ |0 I$ V. K- ] G% M三、Servlet 请求处理基类5 U9 }0 K% ]1 d# s; z! M" Q
- |. J- p: S7 E d
四、Servlet 实现类
1 }9 E0 e# @; Z6 U. z8 V+ O; d" V0 n$ l* }% h5 v+ ?8 {
五、Servlet 配置
4 [& D1 a6 f+ D x3 Z3 E( {! p$ E
{5 p" p" A1 Z6 c六、启动类
3 U2 X# B8 w m) c/ X, U" G2 y
) t: N! x. _: F" h8 x$ ^七、测试* K O. y4 h% R6 k3 I* J) [' c2 j
* C0 z: w4 K0 O8 P4 l1 D9 MTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
5 m, i5 n) S. ~
' h8 e8 F% o4 ?& B) X( W" R) }5 K; [Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?. `6 q, S0 r9 A8 c1 q, B
' X; ~) o3 ~- p& S4 a
$ Y: X- S9 g" K; }. v, {
) d' ?& J4 z8 F从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
* N# E3 c, M. j0 x8 n U9 i1 a
( z0 a( P' j9 I8 G2 b# Q' \8 d! `! p: n1 x6 }3 i& v6 e
/ e# L K4 c! i% R9 B* }9 B4 m2 x
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。2 W% N! J8 ^0 k/ X1 U
; K1 h8 c" |7 N* n# o
! L: {- t0 ^, f
# V. C! C! T" ~7 |第一,提供Socket服务
9 m L) P A% w( a! h% q! O% ~% l' ?. E
2 a' s) Q3 M( R' A: s4 G) H
+ P) {8 ?. @7 x6 U& ] O7 H
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
+ `; t# U% N) {- Q! D) m, M, x* G6 {
5 _9 g& d8 H t9 t
4 M- v! ]) z# b }# x6 A; D+ f: n9 O( C& k0 E( B! c1 }
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
4 J/ e- T" b7 I& [, l# c
, |5 Y/ H8 g3 X- G Q3 O0 z; \
- V- P$ {$ r5 {2 d+ S$ q' L6 l8 w {; P
第二,进行请求的分发: s3 x/ u3 f$ c" B7 |
" {1 h+ I, O5 l& H* N! Q% m6 Z
. O+ P8 B( ]7 W$ w6 k) S8 B7 b; i- Q+ S' @7 n) P/ I
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。! Q! j" |# h; e/ p4 [1 V
; \$ r* H/ b- \9 @- Z5 C t7 c2 n# B* N$ p0 s
2 v* _# Q; ^5 n7 z. s6 ]% |0 O第三,需要把请求和响应封装成request/response0 A2 n. i k7 ]
" E. u* u: A- e0 ]% t% S9 r2 n8 o9 b' j
/ s- H. M1 u/ i
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了! `0 _9 A0 s5 @! W" V& Q
5 o+ v8 ^( j$ [6 P2 E* N
) K2 M/ t( M/ v
话不多说,先来看一眼工程截图。
1 q, X" j: X3 D2 V
/ Z5 N- N8 N0 _0 H' d
一、封装请求对象* g& ^6 X# V( m# L" e' i0 C; J
. C+ K! j9 Y2 Z
8 A8 y4 ]7 O: {+ l! I这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
( C# P5 W1 ]' d3 \二、封装响应对象
5 s* e* ? ]) \ v# n$ L% o
& W4 [8 ^* `1 H. Z8 ^
6 ^$ A; f+ }. C5 P! r5 b) H- Z
基于HTTP协议的格式进行输出写入。
/ V; L! L1 e! [# R; j/ }& C2 _三、Servlet 请求处理基类
6 _# ]; p8 Q( w& f& W3 @
5 S4 m- d2 ]+ c0 M. F8 V+ S% ?
3 E R' z+ q" y1 l K1 [
8 `3 Y. n% h/ \1 g7 `$ `
0 G, O- M8 v% S/ a% _* U% p; p6 d, ]
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。, `" d/ v0 ^0 X% |# R
8 F4 H" U$ i- X2 @! [4 Y
8 x. ^) P$ L9 h( n8 X% z1 M
3 d; y0 T4 k4 e! f+ u* p
0 e3 P% L! g2 i! u9 H+ y3 D: t: |" ]) _" m% _
提供这2个具体的Servlet实现,只是为了后续的测试! 2 Q# x2 t2 A0 K
五、Servlet 配置
( @$ K3 V' k- n6 u
" E3 v- V3 d; c
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。 - Q1 g" Q# {8 M8 R4 N: \' d( X2 _
六、启动类
- m ^1 ^. Q/ w4 Z' B. `+ Z2 m
T0 T4 [8 c, d8 q3 v4 s
* W! B+ M( ~9 A2 g8 {% Z c
这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 # K2 s3 m. Z+ F% J
七、测试
+ I7 w+ o0 ^+ w
- S- f1 v% G" g' X# d( Q' b
; v9 M: U5 K3 N
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。. ~0 k% w; P( p. r7 G7 X
————————————————
* ~* x8 o1 X; I2 i版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 a, j# Y4 t( I+ t
原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480& `8 M3 Q+ \! `4 @
$ i5 v$ H2 _# S
. \( V# D: r8 G% N4 W X7 o
|