在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 563430 点 威望 12 点 阅读权限 255 积分 174252 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
. d0 E7 t. |/ A: h
从零开始写一个迷你版的Tomcat 从零开始写一个迷你版的Tomcat1 I" ~ w3 j" m# l3 U9 p Y; a
* Y* N3 F4 s' J8 ^4 K
目录
- Q/ ^& q( L3 z% D5 f
4 Y( P, q) e) T5 W ~( r, E 从零开始写一个迷你版的Tomcat
- g2 H: X0 i, M& e3 U9 R) n4 h* s
6 |& N5 L7 j' i/ N( K3 d' ? 第一,提供Socket服务
1 }! A3 F# _" L& A E. b$ d5 V9 O5 @
3 c1 A/ ]. T9 W( P1 r6 l+ M- T 第二,进行请求的分发
7 p. Y4 Z; S- j% C- r$ {
( {- D, z0 p' u( c 第三,需要把请求和响应封装成request/response
. A7 u7 z T2 W2 o) e7 E3 P0 a& U & ~( ]8 Q' Q4 Y) A9 L9 u
一、封装请求对象
3 Z5 A' M ~2 _2 ?; j, | + b8 k* L+ h8 |- w, o1 i+ t( i
二、封装响应对象
% Z" }1 B5 H5 A) R+ f# l
3 q3 ?5 b0 g* ?* E7 V 三、Servlet 请求处理基类+ z: H2 K5 A$ q* j' H5 N
; L. D X8 ~. o$ \2 ^ q2 W ]
四、Servlet 实现类3 R5 I6 H8 ~4 W. X$ G
) p* V( C0 e( ~9 { 五、Servlet 配置
; d7 W1 [4 k/ _' Q; ^ 9 G3 n$ o6 |: c
六、启动类, _8 I% E2 X. t. f/ x4 e4 O6 D& F
3 {. u7 q% m4 ^ 七、测试
: I2 ?; W/ v. k/ K8 y u. M 2 u1 T9 s' |- j. O# E4 L: S9 X
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!( W/ r; S3 F' v) J
m. \' @' _, V* F
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?2 `- L" `0 n. p3 W
: b6 \- @% E9 H( y4 R
; N+ W7 ~4 M8 U1 h0 O6 v$ m* C% n * _* _3 J3 ^. f. r) |9 H
从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
2 h1 U, w0 Y; ? ; ~, ]1 S, m1 Q( ?# V/ H6 v
8 m& L+ w9 l. o ' e0 K, Q6 m, |5 Y0 [
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。3 F* L2 B2 u, F& x
: o5 o, N9 J7 w, K* ^2 W6 L3 U + o/ `1 A7 ]/ a
* W7 }* g% Y/ L: M. t! H 第一,提供Socket服务, h$ z% T7 H5 f5 u5 I
( ~ d; ]$ P! G I8 m1 h1 H3 w( L7 S
. D2 @* |( O6 F, V' u/ h
+ T) j# d/ W$ r- r Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
# K, r K+ |% z7 w2 }
+ `8 Y* r4 ?) U$ Q0 v - M8 }% P6 M+ x( L9 v3 h# F; Z7 @
7 Y9 D- X8 ?: L- b9 { 这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?4 n* p- M, q! \, u0 T$ s2 M. g! l
4 r9 }' ?, u: M
5 k/ b1 e$ K: a# `8 p) C' v- F3 [; u
6 x3 G& m. Z+ |& ?2 m: p, P 第二,进行请求的分发
% x" _: C. [+ ^ w1 F8 k: x- q% b 7 T4 O U2 o R$ U8 A
$ a* c& k' K( [: j& H) K' U
( x* q* D+ J" y- N1 \ 要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。) |: X+ f9 V& k
, x, V% W" D# s% E2 Y7 ~7 Q
" Q0 ]. z! k/ Q 6 R. J% A, H+ b4 e) {" k5 i( y
第三,需要把请求和响应封装成request/response
+ N R1 p, _% \ + c" R/ e( v. b; g6 z
! o; \; }# L9 z# Y
% A6 e! b" i4 @" M- \( q" H' W8 X) s0 } 我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
j, h7 F* y8 J9 g * n3 A, |) E( V+ S; ]8 S5 y4 Z: M
- J1 s" o( h: I, l 话不多说,先来看一眼工程截图。
' Y2 o2 t# g2 B+ F
o$ \" ]9 ]) F5 n# S 一、封装请求对象 ; [/ n" i" q8 U& k7 @+ y
- n# O) Y8 a/ O) J* D1 k+ Y
: A L* A5 ~" ? 这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
3 Q; ~5 E& g! {# z% ~! K, S 二、封装响应对象 4 J1 |8 x- J4 g4 p- D( \
4 J2 M. l2 C8 ?9 Q! w& M# ]
9 \( l: g3 L' e! v0 Y; I9 U 基于HTTP协议的格式进行输出写入。
M: t; R& [2 Z7 Y
三、Servlet 请求处理基类
) q2 S5 Y* s4 P5 {. _ 2 e- W# a/ t" t. Z# i V
3 G" l. I# F/ k! j, n- d
: u3 u3 Y# P4 ` P- j5 C ) m4 H+ \, g( P
# V1 S2 i+ Q& Q0 L% Y 前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
+ D2 k1 f' g* G' [+ ?* r, Y
. i1 ~) B: H, e4 m 1 |$ y6 @4 V* p9 m! q3 M$ R$ E- o
, _) c$ R) I. H2 k4 w" q" y4 i
5 ?2 X$ x6 Z0 I1 p. J
: L' t4 Z7 p! U5 S# z8 o
提供这2个具体的Servlet实现,只是为了后续的测试!
4 l' Z; B$ L3 L t1 Q$ ? 五、Servlet 配置
. @+ ]. ~/ _- z4 D) T; H
+ z5 j- w5 Q% ~8 I6 }$ x& n 你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
2 o. H& k$ ?1 t' Y# y, j 六、启动类
) k2 o0 x1 [5 R& u
# R% f8 c5 }" b0 b
# _, {6 B/ f, G+ R( N3 v8 T9 a 这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
. R8 ^; E; O# F2 [& Q# k" k0 V 七、测试
9 j) S# v( K3 T, {* V8 h! X' f
8 u* b0 o' N! B& ^7 T' E+ C
- E4 T, G% E4 n2 S1 t7 c7 O 实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
( S" z9 f) g7 r; `/ V/ | ————————————————
6 p" Z1 s3 l% \ 版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
7 o2 V3 X$ ? Y! U T; d# j 原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
4 O( c) l: R& i: q / {/ C. P5 q3 |3 H
6 q6 l, K. a- p* `
10.jpg
(102.17 KB, 下载次数: 391)
9.jpg
(141.62 KB, 下载次数: 332)
8.jpg
(83.61 KB, 下载次数: 364)
zan