数学建模社区-数学中国
标题: 从零开始写一个迷你版的Tomcat [打印本页]
作者: 杨利霞 时间: 2020-5-20 15:06
标题: 从零开始写一个迷你版的Tomcat
, M3 O3 `- f* a4 ?* M% V0 ~3 d+ }* G从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
$ c* [% C, D& X: J5 V- V, q1 u6 {" @. Y
目录
: @& I7 B1 u" ]+ V$ ]9 l- `
; u. R- A" Q3 X j8 O从零开始写一个迷你版的Tomcat
. y/ ?: f* e; c2 j/ J/ E U$ [" w8 }) W6 Q' T: G! ?
第一,提供Socket服务
% {3 I5 u, D6 J, t" F# W6 T+ k6 k
( Z/ w: M ]* e! y1 n I. N第二,进行请求的分发
0 J+ n- ]; M$ F- A* T* n+ n1 p* Y; e' X
第三,需要把请求和响应封装成request/response
- q: z5 u4 v. D! t6 Q0 \9 [! A R! C1 R5 l" i+ z7 ~# r- y/ P
一、封装请求对象
& m$ E6 L# ?2 z0 p* ~7 ^! Y( h! y7 _2 Z) H# @
二、封装响应对象$ y- r ?& c' g( W
6 g# B Z. j+ f+ J e2 t' j8 n; W% [
三、Servlet 请求处理基类
+ R% ^+ y, N4 h* S0 C8 t" a
+ o) d K" |# `: s7 k四、Servlet 实现类9 c% @1 w2 I1 y( Z6 t- z4 H
; G; L5 e/ y( |* n, \) V五、Servlet 配置
1 u- f C1 W' A- l+ ]2 Y2 b; y2 N R
六、启动类( K! P" c3 _$ p
( U0 f# _) ?- C- E& n- H
七、测试: f1 C8 I$ c4 r8 i$ _+ \
! ^# Z! Q6 D: v, M: RTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
) s" X6 u4 ?( D! P. J: {3 S/ r$ o
( f7 ]& T$ _4 o* [+ b: N5 mTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?* c. R$ \9 m& \; u( H
8 s& ?. W) e( q2 _2 n. K# K
. f, z2 p. ~0 b% h. s3 H9 q2 I' W
1 s6 C) Q) N- V2 v从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。* M9 s9 u. e; ~! Z' G% j
x- s0 D3 r( K; K# O4 V0 j: B
" m, _6 U; z( k/ K& W
! b6 X X8 h! S" B8 `由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
! \$ m( e8 W7 s/ @. K7 y; f7 I# f- K- n/ K! X8 Q* B4 H
( W1 y- G' E- c" ~& {
6 U0 Z% e0 A+ z* ^5 R第一,提供Socket服务
1 w4 M! o9 q# _# o
0 \2 |! e, b0 h% i6 H. @0 B8 n+ g5 S
+ k) S0 x" K' r/ @" t( n0 K
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!) V, U2 J, U% Z* @6 y+ R* [, r
) V9 O+ |" T" a& ?5 g3 `! a3 F) v
5 _/ `- }% Z( \- T3 }
: D9 v& {" O& Z7 a1 M这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
! ?" [, l- a0 |1 m& J3 ^( N# M
# ~9 W5 P* L3 F) \
_- C7 v* n0 g2 B( n( ]9 J& I: |- r: C' w) e1 i
第二,进行请求的分发
+ Q4 M# I, ~* J2 P. I6 s( Z) K' h" h+ P6 w5 N
) C2 h! `# T) j }! M4 z$ r8 v( e- l0 Q! B" D D! o- }, ?
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。8 f9 ]/ t5 k! _. j$ d$ L/ ?
. h' q% F/ e5 S) x- o8 y8 I% `) b+ G! W; I5 ]
/ m/ z" c) E! R6 t _$ d& A' U8 s
第三,需要把请求和响应封装成request/response
1 z, A* K4 K' @: n0 K. v9 [- h+ v5 L: F, D6 S Q3 r
! R8 j9 I% ]8 |8 X$ D
6 z' y* a6 m: ^, p @我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!, |( E6 m, G0 D. [ ~0 O
! u+ |# [5 b) s$ L
6 j8 I K$ P! s话不多说,先来看一眼工程截图。
W$ k: a- P- k# P4 l+ H
: P% S b7 z3 e$ o: {' H4 }) X( g3 u
一、封装请求对象: S$ E4 [9 j) @, b/ x# {6 R9 R9 H
2 h9 Y8 N L4 X1 U. U9 q
- P/ s0 L4 }0 p, H) f. R这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
. O ~; V# _6 M/ ]1 i二、封装响应对象
/ b- X! i+ V8 y- m3 R
4 w. _4 C3 D" y, y+ K& ^! F8 E% V' x% U1 h! n) m
基于HTTP协议的格式进行输出写入。
0 H' w" @! w2 G/ C; s) ?三、Servlet 请求处理基类; X6 e9 f# Q# f% R: e* r* [
! B; x5 V" c x) @
; Y, f8 Y- `" B3 d h7 S% }
! C* b% b6 s- A# j1 K- k( E, Y
3 I2 h$ w: Q, u前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
7 [( a4 c) _/ x! m
7 j$ `$ W3 x) @+ K' u U
( V/ j0 M' |) R, s( D! \7 b# c
6 w8 Q+ E% c$ M7 ~' Q
5 ]; |% R o) {$ B& {$ P7 C& k: [, T# f6 B0 M1 M1 g d" j! G# C; q
提供这2个具体的Servlet实现,只是为了后续的测试!
A1 F% ^4 H. O; y
五、Servlet 配置
2 W1 h& b' C$ K. @4 x' q) _
, S$ V4 W, a+ ^3 `6 S [
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
3 a2 w/ f+ q0 g5 `- R
六、启动类
) I( y' x: m. B) c
8 b6 h) t; o2 G6 c2 A
: [% T" p' R4 s1 @0 v6 C1 ]这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
2 M8 H" m3 \: w \6 f( Z0 k; J: Q七、测试
' U& O9 B0 A: ], t6 k
% Y. ~' X4 @* t8 G1 o/ |/ R e0 A: q8 R. d
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。0 |" S5 s& h* A% g. z) s
————————————————
* B. r$ h- M7 F- I' b版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。3 z2 u) f+ |# ]. H u- G$ V
原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274805 }6 F. G# s9 {1 N5 d
; L H) x/ C! t6 J% K5 j3 S
7 N# M+ T K8 g* T Z
-
10.jpg
(102.17 KB, 下载次数: 388)
-
9.jpg
(141.62 KB, 下载次数: 330)
-
8.jpg
(83.61 KB, 下载次数: 361)
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) |
Powered by Discuz! X2.5 |