- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566710 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175236
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
3 ?& E& F" X6 R t从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat A" k" d7 X4 J
( \9 }& L. f ~4 y0 |
目录
# c9 r, I6 O" n' a: M, f! c+ |5 J# d* |2 M
从零开始写一个迷你版的Tomcat
( ~/ V v: T! D2 F* ]+ |! C, ?, \, {+ Z* f
第一,提供Socket服务: ^: d/ ?4 f: v+ l6 F& f
3 L2 D, ~, {% y: r第二,进行请求的分发
$ L8 U. D/ G; f* P5 l
& @ D$ M: K2 `$ ^( d第三,需要把请求和响应封装成request/response. e- F7 W! ^$ }6 d8 L
' V% r7 n7 F3 T7 D7 v' _
一、封装请求对象
1 l# H9 p% a& X6 y; C; j
: E% S7 n: p# f! z" g8 i/ ^二、封装响应对象1 a% ?) I& x i/ E; ?3 C' M
# V9 O; }& k1 Y- w# C& g( ]0 B三、Servlet 请求处理基类* o K6 q, d* Y( x0 b- X
+ Y \$ W) {' A/ Z4 Y* ^3 E" ]
四、Servlet 实现类
( M4 ]3 Y- G1 [- I% p& T6 w
: H' E, a) E. `1 B }, }五、Servlet 配置
' d. b/ L9 y1 ]* Q0 o, a: m6 X; W2 d
六、启动类" c4 J! S2 f+ u2 v
- n% G# Y" l0 A七、测试
, e8 x' z) O9 p" v* {2 T
' e% U1 {5 }# D4 T8 j, i8 ZTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!$ [& t* T5 Q, G; Z& P8 g% t8 v
) a! ~( i: Z: R9 BTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
% x5 p; m% T: j* A2 s) _0 d' F( B! Y: L, _
- H# K2 q8 Y" R# d' B& ]
& Y/ d/ u* H0 n; d) ^- m从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
$ J0 S% i( e& c# J! P! T6 f; L- \. P7 O0 E: C- H
# Z/ m6 P, h, L, @
) q* S8 Y( p7 G( n由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
, w+ u+ |6 ]$ d# M# }2 ^6 Z) J* E
9 W# i$ {! S% j, P
8 h2 Q+ E! }9 O
7 a+ e+ v4 o4 x1 d9 Y第一,提供Socket服务
1 k7 j8 f7 \ ?) B
* H+ q( M2 N9 ]1 ]
6 t" ^- J; M" ^+ W0 F/ ]! s4 R E: K" q7 P. A4 s! R9 P, K& k
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
. q- d. b$ M( J9 v7 o" H# O
9 z$ ?8 I3 z. N7 v; C0 m) m+ X4 ]# }
1 U J: L$ I9 ^5 o
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 S+ `) e, H& l+ q2 y! i& _8 a: V
4 ?' F* x9 Z# l! ]
6 @/ O5 c3 @( V3 @7 R
' X' @( j- O9 u1 i/ m, u7 F
第二,进行请求的分发! f& s ^- }: ^$ \: ]
* k) v* L% @8 B" r6 P6 i4 V% _, ]
; Y, T8 k+ R8 S# Y$ ~7 l+ D
" ?/ O8 h* }6 W' ?0 I要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。. M* I1 A; `# e2 J2 R9 S& `
7 c) r$ |: p1 x* A3 w1 A7 R; H: _' _# r
4 m/ B/ y5 L) ~7 G# U) l, p& L& Q第三,需要把请求和响应封装成request/response
$ `& `5 g% V. ]4 y: G, v$ f' J5 w) f- N3 @* x8 O/ H |
" e/ f. L: S( [
5 j8 A$ K2 B h! Q4 c: `我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!# r/ _: _$ r* b+ {2 O
A- O2 u( H+ G, K. k
* `5 V' v/ |( y3 \1 w6 F" {" H, t7 u话不多说,先来看一眼工程截图。
6 G% s6 n! M6 \. V
1 O" r' |7 s) K2 b9 _5 G3 q一、封装请求对象, y* g2 y. o4 t; E2 n c! m/ J/ @
6 y G; p( ]! V% J/ z5 |. @) K7 S+ [& e# ^) w2 c/ v: x8 @ B
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
) h2 P; ~/ T; T# C二、封装响应对象
8 J3 F( Y( X- h+ V
4 _$ d: |0 @% F" `: U) v. g/ P* Z. {
$ `0 m! f8 P* E, }5 Y0 R
基于HTTP协议的格式进行输出写入。 ) C' n) V. g, j9 e; X; p
三、Servlet 请求处理基类0 B$ D8 A; U( {- c% g
9 [2 B) g( f5 i
2 y* O# L; S1 |6 U2 n) o
& i6 }( s0 E+ _% x' ^
$ S- H! N, ^0 u" B0 p# |% A
# T* u; G7 B; g6 D% x前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
9 [) m- C6 o/ r: a* ] ~
% K/ J$ T7 V2 U* \
: {' k6 `( Q2 X& k7 z7 A1 i3 S2 f
( v6 q1 H' ~. Q, L( |
5 y. S+ \; k1 `+ v; t
- Q8 ^0 u6 p1 H Y% g5 g b8 f7 A提供这2个具体的Servlet实现,只是为了后续的测试! $ \! q( `3 Y0 b; w
五、Servlet 配置
' P5 d6 x* |3 \
6 @3 s1 }5 }7 @1 [# b( b& k
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。 8 c. k1 [* m7 E$ j
六、启动类
+ {, r, B* ~; U) O
1 l2 l3 E8 l: t' a& q6 \3 R
2 g0 {6 e L# t3 t" Q2 }6 T) ]
这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
9 C8 m1 r# \+ x$ r- B1 A七、测试
a! G, m, _ l! V# o+ Q1 H& @3 r4 Q6 v6 D
( H! z$ T# U1 v4 V( J% `
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。8 d/ {! ]& B' l
————————————————' \0 y6 v8 X7 d6 Y0 B
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: t; M8 G; c# Z' K原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
6 j4 c) i; g; k) I& H
) @& U( a& |' Y0 q+ j) @5 X* S$ e
|
-
10.jpg
(102.17 KB, 下载次数: 422)
-
9.jpg
(141.62 KB, 下载次数: 362)
-
8.jpg
(83.61 KB, 下载次数: 394)
zan
|