- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563420 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174249
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
$ E/ X( X" d. B) K- \% P" ~
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat7 N! {6 B6 {! r) z1 \ \$ r1 o* ~ t$ v
" x6 c5 ~% y V7 I目录
+ D. R+ B3 ?% r: k) o+ c9 z' A7 \+ b6 E, l: t8 s4 ]4 m+ E1 g/ ]% X, C
从零开始写一个迷你版的Tomcat
) R N8 ` S5 |) f9 {7 e& G
, @' r u9 ?) o2 j+ y- U8 J$ D第一,提供Socket服务# G! B: x) S! D6 `4 o4 e
2 A. y4 w1 t9 ? z+ `7 L- n' ?
第二,进行请求的分发
( H5 v- H/ P, o
) f7 A2 R# q& B& l& i第三,需要把请求和响应封装成request/response, q- h: r, [2 Z9 D7 Q* C
$ }" R7 n x' U9 C一、封装请求对象
5 p0 O; }9 R5 ~
" i6 ]! Q2 \ u& O- X5 k, N! f- f二、封装响应对象
+ E6 h2 a2 u4 h+ E/ k& T
6 C4 X9 D6 b2 X( ]三、Servlet 请求处理基类
& l& y8 d. {* Y0 L( z; U) i
6 t* ]& b4 w: \5 K2 c四、Servlet 实现类4 x" ^& T/ ~0 K- T& `. e, }1 V9 N
6 ~, u' ]0 w2 E4 Z1 P五、Servlet 配置
! r! i& S$ [% {3 o; Z7 g3 d8 t) e' r6 {+ }% S
六、启动类
8 X! o; O+ s5 q: W4 M' x9 }- B% Q$ S" r4 ]- Q) p3 i
七、测试
. Y# _: s [+ k0 b4 A- S& I- N0 ?/ o% ^' _: ]3 p3 R( k8 V
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!9 c X; J! ]& q2 `
. z: E( b4 K: u( WTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
2 m+ r; T, ?# d
3 |. c1 ^, Y& T
! B Q0 t! q; V% w/ [$ i' a$ Y7 Z' R
) E6 Q; X# U9 E4 f' E从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。/ s4 g0 v$ R+ n: D. Q! b) a6 R
" e; }& T) m- g& _& Y
4 \& R5 l. X; k0 ]! G6 y7 Z
# \/ d! s" o; W% v) k$ \由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
9 p# h% c$ d/ z1 ^
& r% g* u$ H6 J: c2 z" {5 O* Q
; K0 ^% ~/ ], {7 f$ q- _% k
! @$ ^" K" {, V+ Q4 e+ r$ f2 n第一,提供Socket服务
; p& S( r8 g# P; U5 v3 v% n% w* F
F# D, ?. X/ ^$ o* Y: E
0 I1 n! g4 Z# ^+ ]0 S! I) c% uTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!. S1 J7 V( n! J4 a* S
. y+ z3 H0 A9 M, J1 Z
# o: ?0 w9 I% }% s L
& K7 v) m+ g' ?: b I f; @这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
2 \# t& t! K ]- L0 u& W! k; ]7 }0 v- e0 G. x. Q+ K
' Q* H0 L% o' U, G
- p( [' F: B; |% v第二,进行请求的分发! M3 Y( ^# Y6 @/ ^0 F- D/ b, t
. t8 e9 o; i$ h2 _
$ }* E, s8 o7 `. i
5 E: h# O3 X4 x9 U% P要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
8 ]6 D8 e2 ^8 `; e; m" |: ~0 u J( I; I* m! F" v
& t5 u, O! `% ^- {" k
, Z+ m0 @0 Q2 Z" V4 D8 F' O第三,需要把请求和响应封装成request/response) s9 }! b! ?* @+ ]) ~; [( {! T
! `4 g& K* B% V0 ~& l
# e5 C9 Q/ h, k- H* N% J
# L. r1 _ z; t: S& ?5 L我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!- T' v* c/ m0 ]! H
7 t6 J( T; ~5 D3 d2 s) B) Z7 X/ x; X
话不多说,先来看一眼工程截图。" m/ G/ m+ C+ F+ Z+ b* A
* x! ?4 C9 V( ]3 ^' v0 r一、封装请求对象7 H8 j. m" M9 P- b! \* {
; j( u' ~* O: s
* t4 U2 j( h4 S# ]8 t
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。 ! Q' E) p# w) R* l7 |
二、封装响应对象 F; G; ]6 A( R" B
; y$ y5 @: N* @7 p# a- G# v
1 k& n; [/ d, l2 ]: g( q: R9 r+ r基于HTTP协议的格式进行输出写入。
, F5 c8 k8 o' i# k三、Servlet 请求处理基类
& m: K: b; ] D/ N0 A- e0 R1 @% G* ~6 g
( o# b; p+ d: h' G7 Y
M" y, l# U" Z7 V! q% w! l, F, |# A y
- x2 [# F" Y" n% l. `前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
0 _* `; [& P; [ e
$ p5 M2 g j6 c( x z. H/ M
* B" V+ X# Y( _% B4 G4 K& K+ M
& I2 J6 K$ ?# b2 D+ {5 _2 V- {& h
% f# c1 G( [- B) ^; I
6 y; g% q, i+ A% n& O+ ~提供这2个具体的Servlet实现,只是为了后续的测试!
$ J! ]2 z$ c# L8 K" h3 j0 Z! r五、Servlet 配置
# s) L' h, E7 y
. c% b! J0 c& i. d# }/ o" l你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
1 t4 g) m. }' H ]3 y- f! t# g六、启动类
3 Z; a+ |- W5 S0 ]7 m6 H( }
) ~. i4 C" `' [$ D
/ J! C9 u$ f" Y
这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 : {( H9 i9 U ~! ~* U6 [$ c+ n5 J
七、测试
& L7 E# w- h6 c
( H1 J' Z# ?( y/ w: H, J% Q+ q5 q- W+ D8 Y- n, X( C
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
% [- M; [, q2 o9 y4 P————————————————6 l. v$ @$ a- u. b; Q2 D" b
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
: q; F) L$ c# a7 s$ }原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274802 s$ b3 P) C2 g' P& ]
6 y& o6 u2 Y( k0 m' o7 w9 _! W/ b2 n/ d$ A' }. Y
|
-
10.jpg
(102.17 KB, 下载次数: 391)
-
9.jpg
(141.62 KB, 下载次数: 332)
-
8.jpg
(83.61 KB, 下载次数: 364)
zan
|