- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563412 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174246
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
( A1 E9 D& U% C8 P* A
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
) ~5 X/ _! f+ y: c- _0 f9 U
( y: M2 Z$ [ B Q& q" I目录
4 d. {7 E' C; T2 p/ T: a) G9 U3 V( L* n
从零开始写一个迷你版的Tomcat' ]# Z6 e0 |) [ C. P
, O3 y* {. O% A8 r" ?6 y
第一,提供Socket服务
4 g! k! e+ Y6 ]9 y$ c
8 |6 n. P' N+ `$ L9 E) k8 O第二,进行请求的分发6 o) g5 c5 B! Y- a- f2 H+ n5 ?
8 Y! w! K P; B$ j7 ?
第三,需要把请求和响应封装成request/response, C- \' I6 q2 o3 M$ ?. I9 z2 t
5 r, X9 T* N! o: I4 _+ @# I/ ^一、封装请求对象" I$ T& m9 ~. ?1 n0 c% `8 C8 R
6 t5 y* }% Z9 Z! ]/ G. E& g
二、封装响应对象 _* } u' Y0 i( R4 ?4 ]
( H7 y7 e* l4 @: J: w三、Servlet 请求处理基类
8 X2 F7 W( H K( A3 M# a, S/ k0 H7 | X
四、Servlet 实现类( z o: F5 O* C) o( J
+ C# g' n9 q0 U: s2 U" S1 I- v五、Servlet 配置; t# S8 c9 d/ m' E, g" a0 w: O- M
; H: Q9 y) z1 r$ S7 o六、启动类9 h. D3 o& k. \! _
8 U M X" V/ ^1 d七、测试
9 b. @* H, T( @3 t, D, B) v* t' h1 D: X6 R4 ]& K- g( H
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
- b- [& T( u- ?# o1 _# }; `( J; y# e. o9 S9 j
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
+ P6 L8 G8 Q1 C* s2 X
) @& x! C6 J7 y5 Y
3 `, b' ~5 Z$ m; `
7 ? i* d% B/ o0 f! L4 M! b从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
$ _( r. `% F& c7 `0 j, N/ v6 |: O A; i j% S
2 x; |" e. g, t
1 p* T. z2 c6 O% x# e. N/ W ^由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。# y! P6 j+ B6 n% O+ Y# E
$ E1 A1 V. ` U- ~' B
. h: F4 p2 p, m" H
; i- c" [; b f' q3 }+ l F" X9 b第一,提供Socket服务
6 j" a. s1 ]2 N+ _! a+ t7 w* s: h. Z1 P- v$ |" s+ D
, R8 S! t& a/ ?
: a+ Q: i6 [. e
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!7 X* Y/ G7 l! m) l, z& ~" Q- d2 v
2 E+ ?; |) ~. a' |7 I8 o9 |! B; B) { {3 J1 W# |/ X
5 h, M P/ S3 x7 g" k这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
2 g" u* Y. O c c% d2 q" n( ]2 P
4 s3 P ^: D8 {9 A: d+ E7 Q
& E" E+ q3 }, c3 I( G
" ]) N6 ?" _( ?! S0 [8 X5 ^ Y第二,进行请求的分发
+ v; }- v. ^3 ^3 o0 f- r5 K' E" A: [8 G
9 v0 c h: [2 u5 _$ y% F1 f* U
8 g, A: x8 P" _8 `* t0 D: I( a! j6 }要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
! n4 Y7 _' m( m7 C+ D% A
/ E, D! I4 i' s$ ~
9 d0 G Z# N B. p. M
+ z' L" ?- L" U第三,需要把请求和响应封装成request/response
; S6 I5 f+ c& }6 V' Z+ d1 b8 I: c9 H8 K4 e# b3 B
5 A" k9 h4 {5 Y g# f4 @! P7 I/ g% F; s' A3 p
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!3 t1 u% s2 g2 H/ ] x7 L
: f# ]1 ]' ^* @5 N
. J8 Y9 ?; q' h1 L
话不多说,先来看一眼工程截图。
( K. M- f+ j$ u
5 {$ V% m3 N8 W$ I一、封装请求对象: p2 ~4 A4 G9 N9 s, o/ ]
, U- p7 f5 D% o$ c2 e
! h- Q- n7 \5 E# k \这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。 + r D4 `1 Y, o8 M: D
二、封装响应对象) ?) D- E1 u! W1 n
9 m- e9 ~- Y y. Q" {
: a- Q& [ r; [0 e6 J! ]基于HTTP协议的格式进行输出写入。 % @6 k, B; s) g
三、Servlet 请求处理基类6 g- S) D; n( W# k) S
" b0 W! p, \, H/ [' B# \
( D! {# m% v$ D( b& c$ l9 Q& T3 }" D2 H- h$ z v
7 }; F) L# h2 b6 ?9 S; F
3 i& P- Q2 v6 Q2 |4 }/ [
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
" X) ]3 l& k2 S5 n7 a) ~/ h
9 q) x7 E' ?) k2 }, z) U" j+ G5 x q) V# h1 {! Y( Z. n
3 R! ~* L" w& E, I+ {
/ Z, Y6 P; X5 ?% H7 _$ J0 w* {# I9 P5 T
提供这2个具体的Servlet实现,只是为了后续的测试! ; T. c& o. H& D( ^2 D. m o. ?% X
五、Servlet 配置
4 m0 E7 I: [8 R1 v
; x2 R5 r2 j$ m" k d; o6 z
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
6 i9 a0 [7 c. _4 I. ]六、启动类
/ I0 V% K$ z- [
3 U' D" z3 C4 L8 E1 Z( r# F
& u6 e3 k- P% s7 t" }这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
( w" d" m* E6 v" y# O4 K: N$ |+ j七、测试
+ T, b T: N1 N6 L0 ]' c! S0 E
8 m d5 K8 p+ s2 k
2 }( N, J8 Q6 M, n' B( N4 v$ q8 B实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。+ I9 ?4 v+ z6 I
————————————————3 } n) z* m9 N" {
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& g; r! g7 E7 S. s原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
/ Y2 G4 [4 K0 [4 e; X/ c+ R; V* o2 w: V8 I4 v
: H2 e) \9 _5 _/ G; ~
|
-
10.jpg
(102.17 KB, 下载次数: 391)
-
9.jpg
(141.62 KB, 下载次数: 332)
-
8.jpg
(83.61 KB, 下载次数: 364)
zan
|