数学建模社区-数学中国

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

作者: 杨利霞    时间: 2020-5-20 15:06
标题: 从零开始写一个迷你版的Tomcat

9 D4 A( H) w! o8 m' v6 }从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
6 ?! N8 B- r, h/ G
( b5 D3 ]9 Q4 g, m8 B6 q' ]目录0 e8 T% i$ N' M0 x/ ?/ E! z
! X9 A5 ?  b" Y8 E/ ?* N# y* j
从零开始写一个迷你版的Tomcat
, [+ c. d7 G, b1 S" ~8 ~
3 e+ O9 `  P% m/ k第一,提供Socket服务
, s) F# i/ H' r% s. Q9 d" }% g$ `0 m' n" _1 ]
第二,进行请求的分发9 M; }5 @  E2 X* V+ O, c# y5 R; z3 H
1 x% A; O; D: c6 c
第三,需要把请求和响应封装成request/response
5 A$ L6 h$ o  ?- c1 c# E+ d0 i% X8 t0 k0 ?, c# L( V. T
一、封装请求对象
$ o  L5 u, J3 [$ e' Q7 q& ~
* p* m9 z* l- ^! _: s9 q) m二、封装响应对象
: \9 ^' S' E  }
* G& y$ S0 F3 G; _/ d$ B三、Servlet 请求处理基类) n' M; M# D. l& D& u% Z; L

+ x" i' G+ t) G( N  F% T# M2 e' P四、Servlet 实现类
0 Y! b0 a1 i' F8 E! O! ~6 t% L) D
  j( l- Y/ ?  b& D五、Servlet 配置
# n& \: |& ]4 C% r7 a! f  n( h8 M$ a$ U% z4 J: ]' I' \
六、启动类9 m8 U8 _$ R( F, f# E4 \

- W3 j# ^) j8 W( }8 Z七、测试" V7 C! @5 U; b" X; S

$ U4 ^) c4 \0 C6 O, d# oTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!0 N- m* q5 F8 F1 `1 r* y5 K1 n
- K0 k. g7 W* l8 x! [4 }: M# M: n2 P
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
5 q3 Z8 a& S: |) [. ~) k# @
  X" C4 L  x) k, Q* q/ X6 G
( d$ ^- [9 l% @( x# F0 T# v3 T; F6 t' {5 w" @/ {) u
从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
# H6 ~. y2 K% j5 A+ U  _* `! a6 O$ I

$ @6 Y* U) R1 w" ^2 X1 q+ r3 y
( f1 `$ N8 b8 g/ i& ]由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
9 d5 ]- h4 T& [$ d
% A" ^4 \, {/ p0 I# m8 @0 E0 J2 o$ U' z, t! w7 ~, }

) T, f6 h8 }* f; }/ U' n第一,提供Socket服务
& e! m- d: c  g( x! X# V1 S7 i
4 x! b7 }3 U! T8 e& r0 J5 x$ ?2 e9 {7 I7 N. L* i
1 u- \" y% L3 d. [* h
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
( o5 M: e( T' _8 }* A0 f9 T
- k- m) S- \' B" P
( L9 @" e) A3 \7 F+ c
& o" q( ]' f5 B1 M这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 ^9 J, I+ Q& r7 k

& ^5 s! _' o. A4 }! i
3 Z! O/ G3 r+ y* Y: U% B$ e7 x! l6 \  |
第二,进行请求的分发/ x. N/ a) F) K" _2 S" a* j  N
* Z/ V) W  ~# f7 K" @
6 ]( i8 M! ~$ m. p5 e( [
0 j4 w+ O, f) @7 U& t0 _& X3 m
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
+ ]# Z/ {3 s* A! M# P3 {9 }  m
8 C! C9 H% z! V( @

$ ^7 L- U4 |' l7 w1 T" t第三,需要把请求和响应封装成request/response* w9 L* W6 k1 \; Y& m
+ D4 @, a9 E6 a" T, ?

: _7 I( Y! y+ i8 D
* X& k( I4 I4 t* ^) Z8 D我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
* }" U/ B2 ]" p+ Q% s5 Y& }7 \  P1 b+ u. w) |

9 S/ j9 ^2 S, {' ?* P; T话不多说,先来看一眼工程截图。' K3 Z+ ^  d# C/ j. T
1.jpg
6 d  m# p) f0 z( o一、封装请求对象
+ k, I4 D0 c  c8 j, T 2.jpg ) {0 i$ g8 o- \* ~/ ~1 i) o4 U6 V

- q' _0 \! c- [+ A8 U  c

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


+ h* ~" s  \. i; e  k二、封装响应对象" F' ]! K- E4 p  y
3.jpg 1 Y1 E' i: d4 [# j0 m
- }1 d% v' G. z4 r! o5 r: C3 e/ @

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


: O1 y& p' h. G$ B6 M0 L/ u7 P' }* O三、Servlet 请求处理基类! O9 Q% @& y: D. W: g; i0 q3 g3 S& [

  l3 ~* Q( J* _0 |9 j# y. L 4.jpg
- r, l. T' u! @  ^* s; s1 o; m& D
7 A. y# O4 |3 }# l$ n  R# I
& p; V7 G1 G. w. p4 X, e( I7 Z  L# z1 x& a/ B0 M- E% J0 n% D
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。# m" u& F! Z9 W5 a
7 p0 F* C/ O; T# y% ?
2 v9 _3 V6 ^: N* [- W) }$ c7 t% H9 m
5.jpg
/ O" H+ B- c; c, W6 ]! O+ q' Z. |' l$ X. D  m; o. }$ l7 e! U# l+ |
7 f1 R; ^7 C3 J5 b$ [. w

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

1 i  i/ U. C2 A$ L5 b; p
五、Servlet 配置 7.jpg
1 _& d% K5 t+ A9 {1 E" V 6.jpg
& t" u: m' Y! l

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

: a1 s" F& p# [0 n  g+ s. K
六、启动类 10.jpg
0 t$ ~( I2 o6 Z 9.jpg / }8 n/ Z6 [6 K
8.jpg " u- a( d+ x* c3 z, M

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

6 b9 r- F/ c. y
七、测试 11.jpg
  i  p6 `6 E0 R; [& l- q
) z4 h" n0 _( \
! O; P" l% x1 @# V# d5 u实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。0 ]; Z0 j, p( ^0 D* i
————————————————
. L2 {2 J& b  ^# X版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: |( K8 j$ C% a5 p
原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
% |& q' S7 s" F' |$ J. Z5 N% c+ A, S- }3 s, ^" P0 l8 q
" ]$ p. [! t. d9 V9 }

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

10.jpg

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

9.jpg

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

8.jpg






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