- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566760 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175251
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
) _3 y4 k9 E$ y# R! W
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
0 U/ M# B% x' S# w; `6 ?) u+ B8 u1 {( G$ L: Q/ z# m
目录; V" w) K7 Q0 f# h4 ` Y; b/ w
3 S) }6 q9 D, I1 V( G. G4 ~( C从零开始写一个迷你版的Tomcat
$ A$ O8 e) p/ D( P5 |9 n0 u# h+ t
第一,提供Socket服务
" Y) g7 Q6 K# |9 E u/ T) ^$ t: ~5 Q8 j o2 c. C
第二,进行请求的分发
: b( O) X7 d. \0 T% T6 l# p9 p- u3 e
第三,需要把请求和响应封装成request/response2 S7 @2 [7 H' [
3 W a5 b S3 a. R8 e) q6 v一、封装请求对象% d; \/ v6 n( N2 b. r" L; n
4 U: M# z5 z4 k) `二、封装响应对象( O3 h0 ]$ M2 D" {3 C9 k
6 t- z ? X$ k& r( r; H
三、Servlet 请求处理基类5 F5 ?/ V3 o; S4 T/ a( ]
- ?5 q" A8 h9 t) g. K6 V
四、Servlet 实现类6 |3 F O' E2 g7 d8 c
0 M; S* ~ ^# h( e D+ F
五、Servlet 配置
7 C6 j# e& B. R3 Y/ V; w, C. U" v
4 u4 ^% i$ j, `* D六、启动类
f0 s2 I2 ^7 Q I, k+ S: z4 t
% h/ K. ?$ a* v2 J @4 ]0 F+ Z6 Q* Z七、测试" g# k; e( G! d. a8 P
, i- e9 K7 I( t6 I9 l# A
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!) _% @8 @" j' E, Z& @
- v8 @" b" t# S/ j# E3 h
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?2 f, C6 ^% S* H8 e5 b* Z
1 H; M) H* M8 ~' H& ]" ?) r+ \, j' N+ e7 H
, L/ \9 s D o- y! N
从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
, ]0 f' j: D2 A& C3 W0 l/ E% R+ R; g; G T. |/ \5 L
$ k6 V6 w7 \6 l9 R& E
" x7 j& M. w+ ^8 x# y, g由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
2 E3 l* {" i/ ?0 F" _" l; g" M- D
/ L: P* V0 ?7 P: w! M( s7 i3 h' ^/ K$ D" x3 e- `+ {
1 R+ w- ~& P( r5 q0 s- N0 Q: D第一,提供Socket服务
Z1 R1 [5 G- V# V, ^1 A0 c" n! `: r- f
) c" L, Y$ t! c# P- g; V! W5 Q! ^* }7 T5 t4 g( {3 j
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
. U ]1 u/ I5 h( k! k
. h" x/ R6 e! R( D. o1 O9 j# S% X8 g
- S* @) H6 M* S% Q$ p* P
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?5 n( G' j* Q f! u
" B0 v" v' B# K7 w& L
6 ^" n: l4 {1 z5 `+ v* ]1 B; e, N5 e7 n, `: y: g% ^5 ^& z3 |' ] w4 V& j" G
第二,进行请求的分发& H7 ^3 O: L; A0 N/ X# _
( k& N; ~$ X" a3 M. q
* m' |- A( P# Q" u
0 W4 c0 c" o; G0 i1 ?" q- _7 U要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
% B; D8 q A6 \4 k% w. M( M; Z" {7 t [6 F& _! E
" u# b. \/ k9 K2 i! g; b0 C) {& j: x$ G+ x% T
第三,需要把请求和响应封装成request/response
: {. d7 k) A a* \
' D6 z( j) i% f- ^2 C! e/ J7 Q3 ?, T3 O' E
, A2 |! {7 c: o6 g+ {* e
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!/ z/ ]# v L. n, h" s- ?1 i1 q8 m
" f! m: e0 J+ J& X5 f: x
0 S4 U) P8 i! K0 d话不多说,先来看一眼工程截图。; Q5 l8 t' N+ I. S- j' E4 j, K
8 x, G" a) ]( t8 d- ~ J
一、封装请求对象* y( `" z# @3 x9 B
: i5 [- n( |8 q; |7 j
$ i( e6 e+ b& w [3 ]8 Y9 ^; J+ {- \这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
3 e5 G; y. f4 L二、封装响应对象
3 \' a& f. G/ m) k7 `
0 O% @+ Q( l# Z( F/ {% Y6 T# Q, ^/ V; \+ i
基于HTTP协议的格式进行输出写入。
- b- [6 e& ~; t三、Servlet 请求处理基类
# f- y5 D- ?" Y* o1 L6 _
: C' J4 _; v* x& P0 c
V5 V5 D8 d" u4 ], R) s0 V
) r& |8 f, |% m. F
" @3 }1 [8 H4 P6 b7 a' k1 d1 D4 x; D. |
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
, m, W! P7 b _8 F7 `4 S! l$ ]
( c6 Y7 k l/ _0 o8 W& g7 Z0 W! \- @* J- R4 e
8 {0 ]3 b& e; G$ U( L, T& |
, E2 ?1 f; ~" D- c) _0 J0 _
" Z& Q8 _; E: A. G r5 S
提供这2个具体的Servlet实现,只是为了后续的测试!
9 L* W' V: S5 q' @; S五、Servlet 配置
' D; A: N1 `# o# z8 q
8 L) G# W) y- e, G0 W- t! _' V你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
# `; X6 q7 K. M( ?! E六、启动类
+ @0 F3 c5 a* @7 v2 Z
3 \6 d( j v" s, x7 _. u
$ W8 R; ?. R' j这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
8 `) W8 n- D. [% h) D% r- ]. Z6 u七、测试
5 `2 F0 v6 F3 A! P. w
4 ~/ V6 ~# ?, w3 s$ J% N" I. Z' c6 A( f; l. J4 u% e
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。/ c# ]& B+ x: K1 f9 j
————————————————3 @! X. B+ o( C
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 n4 n/ d4 l/ X; G; i9 R原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
% J- j' r( r! m4 b& N' y% j: z, ]% o6 P- }* F6 D, x1 v1 Y% \
9 F" q" F* Y }+ r" {
|
-
10.jpg
(102.17 KB, 下载次数: 424)
-
9.jpg
(141.62 KB, 下载次数: 364)
-
8.jpg
(83.61 KB, 下载次数: 397)
zan
|