在线时间 1630 小时 最后登录 2024-1-29 注册时间 2017-5-16 听众数 82 收听数 1 能力 120 分 体力 564666 点 威望 12 点 阅读权限 255 积分 174623 相册 1 日志 0 记录 0 帖子 5313 主题 5273 精华 3 分享 0 好友 163
TA的每日心情 开心 2021-8-11 17:59
签到天数: 17 天
[LV.4]偶尔看看III
网络挑战赛参赛者
网络挑战赛参赛者
自我介绍 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组 : 2018美赛大象算法课程
群组 : 2018美赛护航培训课程
群组 : 2019年 数学中国站长建
群组 : 2019年数据分析师课程
群组 : 2018年大象老师国赛优
# @0 a- }; `3 Z4 F9 T
从零开始写一个迷你版的Tomcat 从零开始写一个迷你版的Tomcat$ T$ M" I2 r D
# q4 [) M) i4 S7 w 目录7 m5 p- W5 O C: x
& i2 I1 P- Q- F8 e- H7 s* v/ V8 Q
从零开始写一个迷你版的Tomcat
+ m. T+ U& T; X7 l
# s" [' b6 ]7 f- h 第一,提供Socket服务
' t) y% Y/ w+ N' o5 T , ^; f7 T1 p$ H8 x2 Q8 \$ v3 ^; X
第二,进行请求的分发
' h: T$ g# d3 h3 [! K# c & Y d* N5 o! b: w
第三,需要把请求和响应封装成request/response; F" A+ v, r9 a! O+ A
9 s6 _4 Z& y; B$ c& ?* n 一、封装请求对象& R9 w7 y {# P3 M& u1 N7 i, L0 f
) U5 ^7 a8 E+ W8 D* M5 a( w6 {- B
二、封装响应对象1 P- ^; `7 _9 ?+ K( V; J
' S! A; x, C" `9 P& h
三、Servlet 请求处理基类
- o4 V5 T) }! L- ~5 D" \. k! B: a' t
! ?, K7 G: }0 g T- p# G' k 四、Servlet 实现类+ R+ M* b4 |! F* [7 r
; L, i A9 {' _. Z# @
五、Servlet 配置
# {- K, a+ K' T) R5 r5 R
4 W& q7 `; n+ k3 t 六、启动类! M+ s4 n- t2 _- y
* W2 q5 T- D4 _& C2 F 七、测试+ ]0 r G2 v h, ]. L2 O% |
+ x; d, f5 j' ~4 U
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!1 p" o" q9 O; v. [/ C: r
/ s; r; \! i x Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
- s" L# r$ u$ r$ B: [
2 M5 X. M) O/ u' R
1 P+ C4 v' ?. k# w 2 P( S7 b- j/ [7 M: ?0 a9 H# I/ X; v
从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
' Z$ B/ g8 g1 D: P1 K; a- B9 d. k
, x% L+ `2 O( r' t; v! _, `0 |
3 A4 `7 z8 F" i! I2 A6 ?- y( ?. @ 3 v5 N! Q2 s9 i& K! N6 r
由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
" p( B9 A+ C( c1 [6 V2 r- G* K0 L- p$ d / L5 l! l' \! d& [8 w
- Y# @& [, l2 [$ m ^& O% \' B9 p
3 |! ~4 z3 n( ]
第一,提供Socket服务% U2 J' }9 k' F, y' u/ o
$ R0 p: ^: h1 z1 n, x% d 4 P x1 ~6 Q4 K
; s8 r) w" a# x9 Q Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!6 [5 w2 r9 n6 K/ n+ M+ {; j
" \3 d; F( h9 g( H | : f1 n' I+ \% A. P2 J ~5 {! [% v9 S
1 R5 ^& h6 m! D. ~3 x
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 h/ `$ g& x c0 R9 l6 Z8 i
8 h# W( s% p3 {/ q% I
1 q% Q( F5 \+ U4 c9 L0 i 0 |: f+ ^ ]0 ]. V
第二,进行请求的分发# ^0 ]3 N; g: f$ e
5 U" N7 V9 K# F' K% P9 t
% J2 E7 U9 |7 F# S ! V! u4 ^( W, |( X: ]! T
要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。2 R9 G) r% N9 V
$ P. C+ W i+ Q( x. W
% L8 V4 W% o/ @3 {+ i9 q- y' c 1 `8 i( B7 o0 P
第三,需要把请求和响应封装成request/response
8 M4 L- X- L5 S0 G% `; y , c$ K, e/ q6 O4 B6 I
) i1 H3 m6 `( X+ |4 S
. G/ K& H4 _* U( H+ z9 g
我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!& \; j9 @" A6 t) f! M
0 I5 Z+ F/ U9 H* K$ d
* G$ S' c6 A: T. e3 B1 t/ c3 w2 y 话不多说,先来看一眼工程截图。+ T/ O2 J' k% S4 {8 D3 `* A, }
" C6 P% M, W' D! @9 ?3 l# m 一、封装请求对象
9 v" K& {( |! b) }1 M; D
- r* F# C6 f( x8 G" X- X
- {$ @7 |) w M$ K2 E9 y' ~# t
这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
# x7 ]/ b+ y! U y1 R4 N! r 二、封装响应对象
) F0 I+ ]) n/ H; V6 u) O- r' p
6 z2 [* G7 L7 h: a
& g, w" `) [0 n: l: w 基于HTTP协议的格式进行输出写入。
- Y6 ~5 N3 L! s8 l
三、Servlet 请求处理基类 ( U' c5 V* y: a# X" J" s" J* ]
6 ?2 ?4 p" w/ D* u' }6 A& }
+ T& E& S! J' F
( ]% ?& g3 e/ h0 Q! C 7 }) [/ O# ~! m; C; |! n5 U- m. `
% {( M6 o1 A9 r. N8 i$ P! w
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。 7 i7 j* l9 y6 h
) R/ J3 G$ P) q' @* ^
! A' z; S) t1 @, a k
8 m/ c9 W; ^0 ]/ y( R% `. y* H
" _/ i. L/ `: O/ ~& n 5 ?: ~+ C- i6 D% i
提供这2个具体的Servlet实现,只是为了后续的测试!
$ k& {# W) y5 I3 g: h
五、Servlet 配置
/ Z [$ ^3 m2 M. z- Q& s
) R6 J) s$ i% L( n7 H
你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
" [# ?: ~) d8 F 六、启动类
$ k8 d+ p/ S `$ M
" y, |$ K, E2 b2 k
! }1 e, w" p& H4 f+ v2 a- N
这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
9 E6 r ?$ u, k2 P' o' n2 k
七、测试
$ p. K: _6 D/ y
8 s( g# k1 _8 s! P: [, i& v+ t
( S. C( x8 F0 Z% x8 j) S N A$ ^ 实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。 & q3 E$ V1 ^& m% Z7 g2 l4 q3 p& I
————————————————
0 c& R9 s. S0 A' P 版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& h9 J7 f, K- T; {- k 原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480* m, l- \5 @# G7 ]! a
6 H: g: I' Q5 T- z! o. n) r , ]9 N6 H# l; [& G$ Q/ @4 v" K
10.jpg
(102.17 KB, 下载次数: 411)
9.jpg
(141.62 KB, 下载次数: 353)
8.jpg
(83.61 KB, 下载次数: 384)
zan