- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566705 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175234
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
/ J! F% m. r; U- _0 i8 M! `1 Q
从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat w. K, m* K% a+ k. [
, @- V3 E( c( A$ M
目录2 N: o. y/ P" V" G
3 o! X' y0 Y7 y; M" W& C" t# ]7 ~* d. L
从零开始写一个迷你版的Tomcat
! O& C9 i" M$ e6 Z- Q) ~3 A
/ j0 ^( O _# D5 A$ S1 |第一,提供Socket服务% H) l( m0 W$ _# o. i" y3 v
6 S3 c- o3 I K {4 x2 d& w' b# d3 d
第二,进行请求的分发
/ c2 H, k# H7 g9 z& ]; h% E t, d! ]% p; {' M9 H6 c
第三,需要把请求和响应封装成request/response
' ^& {/ ~+ E% B! j& g5 `- t. w' G8 u
一、封装请求对象# B- S( ?) v! A* L
3 U7 j4 q Y6 M! P0 m
二、封装响应对象
1 j' a4 p9 P6 m
1 e, M2 {8 W4 M1 N- L0 I三、Servlet 请求处理基类% q% X* Z9 }" Z2 Y
. D6 q& }& G0 |8 R' z
四、Servlet 实现类
: b4 b7 I6 B) l9 D0 M+ h1 E* i* R. Q3 C% ^) o1 h W. F5 Q, ?+ y
五、Servlet 配置/ j$ R: B5 ]6 g" b& C
8 c. b, A! w0 b
六、启动类9 R' K1 A) m, ?2 f
: c, C$ B( L! n6 x) u( c' H! O, q
七、测试; b. ~. n9 b0 L
' R$ S& W* }! m" W g
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!9 r% u- l5 j$ p' o% C; u
7 r$ {/ v0 X ]( o7 e ?9 I
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?, i! m% x( \$ j% V+ ~5 J$ ~9 Q/ I
5 U. ^- n; a2 E% D) o+ p
$ Y3 ]& p6 _1 w \3 ~' d' ]; Q
- I, j6 L R7 M- |7 v o' J从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
; r; x9 j" z5 F3 [: ~: ^3 b P0 H' Z! ^6 L& e) }
: ?: }$ ?# X) `# F* O) y A% f/ T4 N9 {
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。/ R8 ^ n; Q5 S% _ P) ^
8 H% E1 E1 x$ Y6 x2 D
9 W) e2 X" ] y5 m6 s( j- l7 u2 j' v$ l D( a9 R7 |
第一,提供Socket服务& z& z" I. i8 w! `4 _3 \2 v0 a
C* S6 v# v8 `
* U, q2 U3 ?; g& R3 \2 a2 K& v8 K( E( Q4 b7 w
Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!6 R1 v: T9 v* A8 c8 B6 K+ ]4 s9 i
* {! d' W9 W2 F; U$ u: C- O4 y( P9 t6 [6 A/ c8 j
5 D, w- q& w2 `& X7 }9 l( j
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?* Y' C7 i# C* Y! {" R
0 \" W$ D9 q3 z# I3 _9 w, ?/ k1 y
5 z, v8 P7 k" m3 E, a' w
/ U5 |" r* g2 A# [4 f% \第二,进行请求的分发
8 k/ `! X% q0 ?5 u/ p# e+ l
- w* @ L9 Z$ a! X( e* \
" ~1 z7 O6 |* ]6 R$ Q
5 v \/ I! `5 N要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
1 v1 Y! Q: _$ @ F
! k' }' S! k0 K$ e
8 z1 h! s2 M: {1 G0 l- a* _0 ~8 p8 @. [$ S# O( [
第三,需要把请求和响应封装成request/response
0 U: H2 N8 N2 g3 }8 }8 x0 t" c9 G0 R1 c( N4 ]
" J6 s$ H8 [/ n3 U0 E1 E
% u0 k% V2 m3 Y- Y* y; n. p3 a我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!/ K* H" ]( u \9 m8 n3 Y5 i
9 P9 D5 A, C4 \9 y4 a6 D, r, E' ]7 p/ l ]
话不多说,先来看一眼工程截图。) r9 s4 z- F1 B! D& p
( U( J0 ~8 Y% B: r一、封装请求对象1 U9 R# `' O/ |' t8 d
/ o' T- A) K! [( {" C; `$ j) l
$ l1 m5 x- |0 `5 V. z1 \. y# q) p这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。 # S: j+ Q3 ^" d" N
二、封装响应对象9 N1 |6 [* O$ |
& _4 u" K$ d8 ~+ m
' T4 G# n0 t+ S% _9 [$ g) `+ K
基于HTTP协议的格式进行输出写入。 4 b1 [- s' s* H# n% f+ z
三、Servlet 请求处理基类
" e3 e- j" i: W+ |# |# n9 L/ U: Z0 G0 J$ T; |5 `2 e! [
4 |( H: _. S& `0 {/ m
6 H( {& t1 H* P
6 w6 y H" Y8 @% `( P6 D
B6 g m! e0 W" b前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。* b3 S1 M$ w" D
& R7 d; w& |' l3 o) N( ^1 h1 Q/ ]
- C6 Z9 }$ @! w$ t; ~
. U/ V) m* w [# I# q; b) U2 f
* ~6 g9 P7 g# j' e
6 m0 @% V, Z# `- e1 m# z提供这2个具体的Servlet实现,只是为了后续的测试! 2 Q) v+ f! x5 w9 u' Y
五、Servlet 配置
{, G& ]8 L. V5 g3 Y0 n, ]
) c8 t2 l0 j9 y! z你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。 $ R$ k! m2 N" X1 o9 q* R" c
六、启动类
% Z" T) b! o7 M0 p
' y; g+ g/ e( e3 Z
# H) e2 Z/ E0 y6 X这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。 , `6 @/ c- t2 M( J" W! a; c& D
七、测试
1 T' ~, G* h; B, x: C3 ~) c
1 p9 a5 X. Z9 k& m9 d) G5 ]
$ @+ z5 y+ W, Y. d$ I
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
1 f! b1 E. B ^————————————————& N8 N- L2 o% ?; }1 Y. B1 P& C/ }
版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 l# b6 j5 ^1 L7 W原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
) f; j9 P) C, b/ ]4 J
6 @: p7 A! Y& M1 N/ i7 O5 m& X( C" v. K( a
|
-
10.jpg
(102.17 KB, 下载次数: 422)
-
9.jpg
(141.62 KB, 下载次数: 362)
-
8.jpg
(83.61 KB, 下载次数: 394)
zan
|