数学建模社区-数学中国

标题: 从零开始写一个迷你版的Tomcat [打印本页]

作者: 杨利霞    时间: 2020-5-20 15:06
标题: 从零开始写一个迷你版的Tomcat
( P- K- k3 X% v+ P/ h
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat0 D% p6 \5 W3 M5 }8 @
1 f, o2 }0 @& o8 D. z8 |
目录
" I* @3 I7 K& g/ ?8 R/ S' q  n5 J
) |+ z1 V2 P/ @$ ?从零开始写一个迷你版的Tomcat8 h! Z, i4 j- `
% ?3 R; B! q/ H. f2 A' C  t- f4 a& D
第一,提供Socket服务
4 z4 V8 }+ Z- o. X% y( V  K; V# ]/ s" l8 c3 o. U) ]6 i
第二,进行请求的分发
$ n7 k" w3 j# _! J- b
% g+ L) m; t  [. }. d. l1 H第三,需要把请求和响应封装成request/response
; G0 O  c( U  M& y4 y6 h. b# a$ v& Z# N8 R! `8 T4 [+ Y
一、封装请求对象! l# D. B1 O7 |4 @8 D1 k
# @/ B9 ?0 F$ i$ l* u/ e; c
二、封装响应对象
; R; l' x1 s, F4 L* }  [) i" Q
) s/ t" P+ H" s1 H1 p, D" X5 h, b三、Servlet 请求处理基类
& S: q) k2 t7 L) m6 c, z3 k. R, C' F- C
" ~9 r- a, C$ k) z" c四、Servlet 实现类) v8 z& s  v# I9 A# J
( P! W, f4 K) V1 j+ O& y# D- c- T
五、Servlet 配置
, U( ]5 T  z% `5 ?8 c1 V' e) W& t/ K% b2 S2 {. e+ H. F
六、启动类* x( f  y) f& o( z: z

8 n; V* K4 r" J5 |) n+ Z七、测试  V! Q( R" p/ X5 E" Y9 d
$ p0 j9 C) v& r
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!$ L1 b0 i$ w+ d) b' W7 q0 h1 q$ g
4 T& A( ]/ P/ H3 x
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
1 F0 R. _; I6 T: X+ |, z% n
6 X, m" _6 E' S3 H, D: W2 e+ t4 @+ Y; @: p2 ^8 A* w# i

" h) L! p  e; ~9 O从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。( E5 V+ U# J: G# Z
$ N+ J& I8 V' h4 h) ]0 ^' G! y

; x* ~  K( T: T; I: p( \5 \! \9 L" q( }% X1 j" K) k
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
0 ~" T0 l+ K, j8 h) h$ Y: T! Z% W+ |! C/ i8 y5 l4 k

: u, R3 V# B4 a; g, Y$ V1 p) _% P1 K3 H% A7 h7 G1 G3 `" y- s2 r
第一,提供Socket服务
: s4 r& |* v) k
  J) o* {$ D* b' u4 [; S) }7 _
$ R4 h5 l( J" ]/ G- C2 y+ Q- V3 g2 r: t% X: f2 L% K
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!& `4 E6 p: O5 t* f0 c
( [+ F0 Z9 K! o

; f: P- X- `& g$ B! {/ `* a
, V( g7 P% Z* B; o' ^% t1 I这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?% k  G( n6 k4 U" u$ y% _2 _, [/ }

4 z1 K# R0 ]4 v& _! c" I/ s
: J* U  P; N1 t, V) l  D5 ~3 U- o# V- \, {0 G
第二,进行请求的分发
; C' f+ P% ?/ z, z* o1 F$ G% W7 P# t, J

$ z) K7 F  \6 ^& I1 }" k
# `' S2 ?/ ~) t/ d要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。' h) \! \9 {: n' D2 g

6 e) E& D* y, _! J1 Q
  d3 r) v: p! |7 ~4 |
* p) l2 b4 ~5 Z( q# h6 P; t5 B. a/ n第三,需要把请求和响应封装成request/response- ?, J" w2 T5 t* K

4 A" M  `1 p" l4 X, H+ I4 @1 e& a" B! g# X5 q' U  w
7 ^& F! I" `4 x
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
. E2 W, K% o% D. p* C
2 [* P; Q' d) [8 E0 n/ u- r4 g
! y: ^+ v6 L) F" q+ K话不多说,先来看一眼工程截图。
$ M: R& t0 h2 w- n- T 1.jpg 2 A7 U  e8 A5 K; y! \
一、封装请求对象, M9 G& z, E$ F, {, D* Y
2.jpg
( {6 F' z2 q8 N0 Q3 B0 h  z
  P& r1 H8 v1 W6 ]& H8 ?

这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。

6 `% w: h: O& S3 M
二、封装响应对象
2 c4 F! [( |5 D# @ 3.jpg * V3 X4 I% f" J* Z4 x) r

( B* Q$ f' m$ Z: n6 K

基于HTTP协议的格式进行输出写入。

, L# V4 G1 K  U" ~: S2 z/ W
三、Servlet 请求处理基类
1 I& U) c6 D) \& W1 \8 E3 |% d
5 K7 W& v/ z9 j- |# T% {; j/ [' F 4.jpg $ A" T: x" O# _

" G, `# }; R+ j4 m; O  z
8 U6 r# W- [7 p% {# A9 z5 U: i: D/ y1 x+ R  \9 k! ^# I5 k( h
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
: i1 ?* w* s) }3 B- F7 x: i0 ]2 i3 Z6 J. }

# o) p4 v) {/ _4 J6 e 5.jpg $ ]5 }! p" w+ E" @; \. a2 ?4 K/ }
3 K/ [8 f- Z; R6 ^

7 j7 w4 A5 i( C

提供这2个具体的Servlet实现,只是为了后续的测试!

8 ~: y1 P8 r3 c3 I( w
五、Servlet 配置 7.jpg
; x+ ]5 b, _" T" i 6.jpg
. [% E! D5 _; M# h

你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。

! J5 v+ R0 n# F+ c
六、启动类 10.jpg ) x' s5 D$ r( [3 l7 I8 u2 U! V! k
9.jpg ) w' J# {  ?7 b9 O( z9 v  `8 F
8.jpg
8 _4 t; l2 j% l2 I

这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。

5 _# k* b6 P: p; Y, _
七、测试 11.jpg
, X$ e! O$ |" k5 e
9 M5 X6 A7 \7 ~% G+ Z0 @+ [4 Z3 O. m, U% o
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
, O% h" G* z! d* s& P$ a————————————————
7 D. a% V. g" f0 V版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 q+ e2 y- n, ?& \# q
原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
# \; D+ s1 u" @/ F  e1 L' u! p3 S
7 x, Q$ m1 h$ M4 W3 I+ P7 C
$ {- {5 M$ u" }$ d

10.jpg (102.17 KB, 下载次数: 404)

10.jpg

9.jpg (141.62 KB, 下载次数: 346)

9.jpg

8.jpg (83.61 KB, 下载次数: 378)

8.jpg






欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5