数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-20 15:06
标题: 从零开始写一个迷你版的Tomcat
9 f" `, d4 y1 f# x; p1 i, f4 k( O2 [
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat/ G: X) h6 Y2 n, I7 v3 I

5 Y; |6 G6 s8 ~7 r9 w- n% d% ~7 W目录
/ ?3 A+ \3 o' l1 F( O( T; [
0 I7 f; E2 ~% r从零开始写一个迷你版的Tomcat: ]0 Q. c% B7 R8 S

1 _0 C0 C! q; r8 q# ?第一,提供Socket服务
5 X# `, D# P, i6 I& `) `  d) ?* [
6 }" w3 j+ Y/ {0 n& h. P: |第二,进行请求的分发8 }' _7 z" b; n5 }
& y" n; ?- \6 B$ |& \( a# D
第三,需要把请求和响应封装成request/response! `3 j# X4 `" S. h+ x4 j

/ p6 Y$ [6 ^% C1 n一、封装请求对象
, E) E* \6 k- N8 z! M* ~
/ H! G% L  |4 s2 j6 Z+ l' K二、封装响应对象4 a+ h8 {$ z/ e3 S  I. y

0 p& Q: ~; j5 T( R' ]7 P三、Servlet 请求处理基类! K$ B  R& p8 A8 @

% P. p; W" N: C+ u+ h- M四、Servlet 实现类
9 j* A  Y# o/ p/ B; B+ c6 I+ ~" f0 @) h8 ^" o
五、Servlet 配置8 q. |9 w0 b1 x) T

2 h+ Q: `$ |/ S( W( J- J  S六、启动类: d- N' L- D# @  y) T

3 c3 k- ?4 X+ u) r* B4 p七、测试
; w4 c7 A" T2 l% s* I! |9 m1 N  `7 U: s0 N/ I9 T
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
* H6 ~  b& U# V8 u$ j- h4 k
. W0 H% X! N5 Y% q3 t4 P5 [9 lTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?( r) C. x6 `2 ~/ a

: }1 o9 v, A$ @; E$ C* i0 |) ?/ v- `( w. g1 r8 ]! M  }
! c1 k' P# [: _, |8 w7 \% s6 |
从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
; q2 t  W! M: ?* G8 v; W" u& D9 T; s
# U+ B" F: A" h  Q$ d1 ~0 B
1 d; V- {1 B% b0 v" D7 E# X5 Q4 U( S# l9 ^6 y8 L, X! E$ W5 K% i3 [
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。$ k2 {6 X# _* Z, V  O* q  _6 ~
2 D; k& P. k" p2 {0 Q( r8 o

( G% Y" ?. E" P% @: n
# h0 ~% i7 u! }& g" o9 E. D0 C第一,提供Socket服务
, h- n! E9 ^( F, a% I& D) `& v; v
) a' F' W% e! |* \) s
: L. K* ]- s! X8 `2 @  z: w0 q
# |% ~$ v' ]( l/ `1 N* Q  NTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!. `6 d! ]$ m) F
; L" u( q: Y% _; u& A9 F( N' a% D
( e  B& Q' }3 X: p  m

; x4 E/ P* w. T5 Z+ ^0 H4 v这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?/ `9 b! v) {' ]: \$ R
0 ^8 c5 e' k& }& w5 t- z
) [0 g2 G5 v! l0 B

; G. i' m/ o8 b第二,进行请求的分发
: @7 {0 |5 w7 V5 z
; _! V$ B. W1 ]7 F: v6 Z  a$ q! J; K+ I6 U
. R' c% x3 O* u3 `9 e
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
- B7 t1 ]. b6 F+ m6 _8 M" b( C- K# K" g2 M; r  ?- o* B( z( `

! }  C7 d$ B3 {% K' o4 @: N: r: Q; [1 {8 P5 }( d& L
第三,需要把请求和响应封装成request/response& p7 B  N9 p/ Q
3 S2 E! P0 Q+ N0 t# [: u

' K3 O3 {+ j5 G9 ~+ P5 C+ V$ H( }
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
, c& A: V8 z$ l9 s; A2 Z; Q0 d' c; m9 {/ d9 a! \

( ]2 N- R0 Z+ q5 ?话不多说,先来看一眼工程截图。
% y# I: C: W2 x% l" K# j" g 1.jpg
7 B+ z% ^4 I6 z4 Z* y; J! O+ o一、封装请求对象! C; [9 m1 r- z- r) t# ~2 p: {
2.jpg - ^& H6 l( g. L: K. U9 V0 r

7 I. i* {: u9 F  @$ P! v+ k

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

, J$ O; ^9 n: ~" B
二、封装响应对象
" L6 R2 U& {' c% Q' T 3.jpg : F5 `* I& ^# @! V4 D

  E% a& Y- u3 r; o

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


4 p! V) X6 O1 J三、Servlet 请求处理基类5 N  l1 a) p+ j

4 N- z; B( X5 i, m 4.jpg 1 P% \) p2 u/ s$ }. E, C! l" D2 A
$ Z' r9 j5 c' ?. ]. m* {

, m% z# y% y8 M2 w1 g9 K4 W2 U; y# x; ]. r3 I+ i8 K3 |
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
; E: C+ S( T: o6 X
. V/ ^9 ^$ f7 Z, g
+ T  W% J( I3 L" D6 j3 f- Y 5.jpg 5 j' \6 p: F$ \0 U* f0 g

6 \- I' Q9 K0 g; E
, ^: T9 Z# g8 ^0 x% ?6 Z

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

  h" L) @/ I0 g8 G0 Z4 U
五、Servlet 配置 7.jpg   f5 D+ e" u! C
6.jpg
2 l/ D6 l8 l, k. k5 q. Y8 r  f

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

7 ?  V$ P" i! H
六、启动类 10.jpg ( Z' \" z  v+ @! O, o2 S& j
9.jpg
. d. a% ^; W: \4 m$ e" H. { 8.jpg
0 A2 X" X3 R1 r

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


. Q% k# I" |8 d3 O七、测试 11.jpg
6 K# b6 S* r. e1 a
2 f3 H% U( N5 m7 A9 {. [8 [3 b
; W/ _9 }% m- T/ M) ?/ e* X! `实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。& u9 i4 ~4 l6 h
————————————————9 |- k" b8 W/ ?, q& c" _9 ?
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, y7 ]8 R% G2 ~6 m( m/ t原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480+ {# w" h9 s4 N. R  M# j
* e/ g% i# L6 L  X% z
% X  u; z' y) Y

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

10.jpg

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

9.jpg

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

8.jpg






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