数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-20 15:06
标题: 从零开始写一个迷你版的Tomcat
  e4 D7 f6 O- E# l
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
- l) W5 W4 \! E2 e% Z  f- O! c7 V4 {/ G# _6 p& T
目录0 ^) s, ?: f" o, f% t; s4 e* R

  V! ~3 u* b- R7 R2 Z从零开始写一个迷你版的Tomcat
4 L7 h9 Y8 P$ C2 a: _# `/ b
3 ^# W) e1 f9 g8 U6 k7 m第一,提供Socket服务2 L% _# G) Q( B+ Y  U
# _3 ]: Q- J; X% ]& R. K
第二,进行请求的分发
$ q) T. }* s& N% t; T* z  g2 L1 \
/ o4 K3 C2 a) r第三,需要把请求和响应封装成request/response5 Y) Z* A  |" y5 y

6 s8 M; b/ K5 S+ L一、封装请求对象/ Q) ^! E0 B, G# D; w

8 |, T, G* \5 m8 L5 V二、封装响应对象( u$ N3 @. u2 X  M4 o3 p4 f
' U4 n  r- d# l' B) C2 P4 y- b
三、Servlet 请求处理基类
: V# H  W2 l" ]* Y1 s( P! _
4 P* q) R1 A& U7 a: j四、Servlet 实现类
/ T- W" M! g' Q( j, u7 z( W+ h) w! Y3 t' a0 Z
五、Servlet 配置) M+ H" M. i; l# X4 v" v4 [
/ N9 E' S* L) k/ p* ?
六、启动类$ l  z/ ~2 H0 S$ X3 o3 v

- B- @; ~  F! X+ _7 A; Z七、测试& K9 t0 @. h7 H& s6 i2 |0 d- ?. u
1 a7 ^1 e- U; P( x
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
% z! G5 n, C) I# |/ z* c& |# r$ b0 u. Q: O8 i
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
; R' |/ [% q3 |6 c% U; }" ]
; c+ f+ D, {1 G, ?+ N  r" Q+ H- h+ S" b
( a( m' l/ P. g& n0 _: M
从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
1 \3 F( h5 B6 `3 E2 M. u3 K/ c4 g) {, _- z/ R8 L# l5 z% ?) W# E

) F2 J- M( l4 T1 C# c3 k: m9 i2 N; d# G5 I" n8 v" x
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。- I8 }4 [. ~6 }* N2 _

0 ?3 q+ V$ ~: I  B3 d; _, R5 E2 Q1 U
& `7 u3 ^1 w: |
3 k; t, Q( X' n* `( |( P第一,提供Socket服务4 M" W9 \2 _* R3 j7 e/ A% U

+ e* z% ]/ ]" z: J. o7 p: Y% e2 o; c. }& G8 ?- s6 ~! o2 ^2 ]+ K8 _

5 g* C9 {, Y0 v' rTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
2 c& r7 h  L8 x
1 E. u$ K3 y/ G
! g* W  c8 u; r  Z& _( y, O/ c  S6 ]& |4 p
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
! A' P( ?/ p2 w9 ^8 |% {* J* P1 S5 `( V) t

/ d" B: t9 J5 I: v& R( \3 \- W; l$ E* x5 Y- c& \8 b. x
第二,进行请求的分发0 s$ z, X8 f4 d/ I% u% W( E

3 p: z4 m9 e; E% u3 Y. K/ f- d$ k  b& V/ i9 w' D+ d6 G$ {

' z4 x6 P5 }6 @. k1 ]# J" E' r0 E要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
+ @+ u# z6 X2 N% k
, @+ B. w  Q7 D% a) Z' F& C# p- z- q" ?  ]/ I

( N* i; r. y" d) O; F+ n* B第三,需要把请求和响应封装成request/response
( q  t8 S. V* k9 q
+ H' X. S# F/ W1 _4 E4 V% m3 b
& l: N: S" o/ O  E
  N0 V9 _) Y( B5 q" G, I9 a/ h我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
8 z. h" h! J: T: c5 Y' l3 K# g$ d/ Z  S3 p
. a$ v( s6 |9 ?
话不多说,先来看一眼工程截图。
) l, W: |7 l8 V) J$ K* z7 x8 Z 1.jpg " b% W) j6 `& ~" o: I7 m
一、封装请求对象" v& a5 S+ V- [+ Y
2.jpg % q2 G% e7 a$ c, w
! a! R% ^0 ]- [

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

* \) ~2 t7 l" e, N4 ?. z& }
二、封装响应对象+ P8 A+ Z( k1 j
3.jpg . S- _" Y6 Z2 S& f* ]

' ~. \/ q% q( W- Z4 k

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


* @) K" G' }" P* q% |; J三、Servlet 请求处理基类
( v; i: I- I- i( [7 ]
6 a1 ~2 T$ T2 b% ~$ D0 w 4.jpg
  e0 Z+ C8 T2 `. ^) i6 _& @& E/ R+ c3 Z4 [; X/ t
5 G4 p! b- O: i6 `; O

& z6 i- m4 Q& E3 k1 i前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
! \" S4 k5 E% [5 f- M( N! m( L. N4 G& S. v
- O; F" Q. o' |5 w  v
5.jpg 8 J6 c2 U9 f. _" D
5 J2 m  @# Y2 H' D6 g( x2 Y1 A$ N
+ l+ x8 z' e0 y* T  L, k8 G

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


) e+ x3 B5 Q2 X+ {% ~; j五、Servlet 配置 7.jpg
8 F& C2 f1 [: v 6.jpg + [: s4 x7 o# ?. D! `5 ?+ Q1 e+ s

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

3 L% Y8 a* g+ s' A! a" \1 V) ^
六、启动类 10.jpg " t( {8 V- o1 R$ t2 o# d
9.jpg
6 j" q* Z, S, h" S2 R' Q 8.jpg
/ Q* p% T% g# a" c

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


% e+ r0 N+ ?7 L& Y+ N5 E七、测试 11.jpg
5 i3 }( H3 m8 `
- l6 P  J( V% S7 o7 ]% U. R
4 y9 [; b# a$ J. p) Q7 ]% g实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。4 ?* L# u1 Q8 S% L
————————————————
' V# R% Z  E4 H0 h版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
, _# c! {+ d' J原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480' n  F  j9 A. n$ C
8 Y6 U5 o% @3 r1 |
. Z7 t  L7 E* R+ L7 M

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

10.jpg

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

9.jpg

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

8.jpg






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