在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563404 点 威望 12 点 阅读权限 255 积分 174244 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
) Y9 t n/ S+ j
从零开始写一个迷你版的Tomcat 从零开始写一个迷你版的Tomcat
. F' n& R- S1 |" C ; i0 O. G( _( z4 o: a; ^. M1 h, E
目录
9 o/ Y' I8 W5 K& g) T, I1 O
* \: L; R/ N6 v4 F* A( k6 i- T 从零开始写一个迷你版的Tomcat3 `0 z, ~4 {: x* p
5 R! m& i' j! ^) j( m; \: p! X, a
第一,提供Socket服务
" \0 q1 ?7 b8 x. e
! s) `3 P6 M# s1 a g6 N 第二,进行请求的分发
6 ~( P7 v3 X6 f s3 m9 K% C/ W 8 J( N2 A( T2 P' G7 P# F6 c
第三,需要把请求和响应封装成request/response
* i: g9 l* q) o5 b' F
+ {' _5 w& O- c7 ^" I 一、封装请求对象/ o# T7 X) s5 u. d
5 \9 |) _0 g2 C; p
二、封装响应对象* x b; ?# J4 ]9 n: W1 B5 E
/ c" P; a7 J% Z$ m1 H
三、Servlet 请求处理基类
3 ]/ I' M) w0 U7 v2 F
) ?) Y% ]7 u9 x/ e- P% [3 e 四、Servlet 实现类3 U, L6 r" P# k: l- b3 L' ^& t; _
& a- p+ _; p# H* j, q6 P
五、Servlet 配置
+ r6 B+ |" }9 e0 N+ M: w
0 H1 z6 s, P- F* D$ P7 y8 T# V 六、启动类2 t1 J0 I4 t, N: M2 ~$ R" H/ x
2 W8 [% |2 N; R& [ 七、测试
$ A3 z+ s# L" F# p8 _ ' L! r; [" x. T5 g
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
3 d+ U, i8 s6 e9 H4 K & b0 \# @1 e! _1 b ]
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?+ V% U! n; @9 K' s ?
" l: A3 R2 |& [0 K4 I7 X; Q 6 P) S5 u3 v: {% c, q v- H7 o7 _; n9 G
, ~4 M- A2 t( A/ ?1 E$ u 从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。) p/ A# d0 c$ {
|$ X# s F4 G6 Y2 s! c
% m O% H* q/ g+ U1 f. I' J
% ^* U' g+ d8 f# m 由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
5 n/ ]3 q3 E8 B & @; D0 R% B) V6 ?. S" u
9 F( |! O1 Z4 J4 { r1 e1 ~' o
: j* A$ f$ [ [2 s! \* I9 P; _ 第一,提供Socket服务$ ~8 D( V S1 j0 ^ n+ ~* b" N" B
7 {3 x% Y+ ]' U8 m" E
% X9 g6 S+ h$ N: F ) c: n( ~0 ^' v* w' J6 G' a2 \
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!1 _6 m L4 S$ R: `, O
# Z/ ^9 `+ M6 c: M3 R/ q& ?4 W
0 E9 D) o. w6 k/ V: d. Z 3 p1 r; P. n" h" ^
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?' |7 b3 ~1 }$ ^8 Y2 h
7 L' B, V; w4 ~3 C
5 u4 Y# W' @# w5 A: V( S
6 B; {0 G! a0 `3 Y$ M2 t 第二,进行请求的分发
: I, W. \* L" i' H" ~
5 h% S3 F$ D# N+ T' f; E 2 Y, Z- |" k9 V, l9 ^8 g
& `$ h2 t" m+ u x
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
6 j5 u4 f1 k. H3 s0 d 5 f$ K W4 N# `% I; p- o- S
/ i, r7 U7 S3 r( b. I+ d
8 t8 g/ R. h7 V+ t4 A$ Y1 C
第三,需要把请求和响应封装成request/response* B& t0 F- k |2 S' F: T
3 `' g6 r6 J8 k( q: X
" `! E7 x( E4 S) f# i; ` ' K0 `+ L; h5 T; v
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
: e# _9 W. o, z. P " |5 |) s' S' m. G2 W. g3 A
! H8 v5 W; r4 F4 M. E6 H" s: w" d 话不多说,先来看一眼工程截图。
3 U. K4 U, h, o
6 M- W6 R! c @1 T; _ 一、封装请求对象
! h. b( C7 a. z9 k- V6 L Y; m
& Y7 P7 o2 _$ Z1 T" K2 K. f
, k5 Y, r. | |
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
3 a# y5 F; w" F* O$ \% u9 B 二、封装响应对象
/ I9 |: ?/ Z! K3 f' ?
1 R1 d( H$ V$ L* Q/ [* C/ i2 d
. |1 Z, [% C- A+ [9 h. V
基于HTTP协议的格式进行输出写入。
. S3 S0 d) \& l6 ~5 q$ o 三、Servlet 请求处理基类 8 q2 y+ _( s2 E" G) J/ D
) J$ i3 h O: E: |) }6 W
3 K: F7 r) D E1 F' r/ y 5 v; O* h! Z8 U% J' m
! I* O; q8 f8 M* c: c: v, {, a/ n3 h
* B5 x# m0 w+ ^# C9 s
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。 + X* e1 [2 } ?# M
4 O7 R# b! j+ ^/ K6 Q& `* N
% G3 \& T9 `# {# d- o* K
. m5 y b0 V2 _. H
# o. x$ b- ^ g, X& P% E+ d # [+ ]4 S! k$ T# I( l, q
提供这2个具体的Servlet实现,只是为了后续的测试!
; z9 m$ w$ ?6 c* D" B 五、Servlet 配置
6 Y7 N7 h% J9 s3 ^
+ Z! a, v5 y$ g" x0 k 你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
. X4 [& ^ r- }3 |- N 六、启动类
" p1 f8 f, e1 t; w5 j
; R! t# D! `. v7 D
* g* w- S/ v1 \/ J0 l- W1 R 这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
, u% w( P/ r4 P7 {7 {
七、测试
; m/ @5 r" h$ j6 `
0 h' S" w8 o% j1 F' O4 v + h4 q$ u/ y7 }) h
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
# a! z" T+ {" w# `: p ————————————————
5 ?3 C1 X" q! I$ \; d7 c 版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
8 D* _9 E) c r6 D; s" n 原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
, i; y& X/ l, R+ |) c) o
5 P7 a& s1 ]- U
2 T) }9 k, q; h
10.jpg
(102.17 KB, 下载次数: 391)
9.jpg
(141.62 KB, 下载次数: 332)
8.jpg
(83.61 KB, 下载次数: 364)
zan