在线时间 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年大象老师国赛优
" k1 ~: `1 g P% Q
从零开始写一个迷你版的Tomcat 从零开始写一个迷你版的Tomcat
. } l2 A1 c. C. j/ D
; z( H: ~; }% K; G/ C/ ` 目录
3 g2 ^4 ~5 V' [$ r e1 B ( |1 T( M( _# a* K0 n3 c% b: `
从零开始写一个迷你版的Tomcat% D4 K( Q" r$ R3 ~# Z
7 T: I/ u" Q- n& y$ r" [ 第一,提供Socket服务, n, d& ]9 W* |: U; Z7 ?" \
2 x& K3 Y' p' L$ {9 `, O, ]/ ] 第二,进行请求的分发
- j+ Y2 b- j: N( S, ]2 c9 D 0 J( Z* P. T }) R2 o5 }0 u
第三,需要把请求和响应封装成request/response
0 b# P9 H1 k! W! Y. m$ {
. F( v) U+ D7 `+ N' i 一、封装请求对象
5 n5 S$ h/ i+ ^ D 9 T" i: H& U% `0 h1 O' v8 _
二、封装响应对象4 R+ M" s' O2 \- h
1 T' Z5 t3 X; t+ |# V* D( b& a5 D 三、Servlet 请求处理基类. Z; a) c( L" ^+ [
( Q" s t4 p+ x. C2 g: L' p 四、Servlet 实现类5 E# j# k. m( n! l0 T$ d
6 O8 M+ Z5 s0 u- z5 T3 S
五、Servlet 配置- Q! W0 t: o6 X4 d. }3 M
0 U1 d9 P7 W9 {
六、启动类* E$ ^; V+ N! Y! A2 f" z7 d4 D# t7 ?
& j4 i& u$ P$ u$ a2 K( m6 g 七、测试 \9 S( U8 D7 ?' k$ j: G
h; E. m/ s' y) H; I: U
Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
. {# z" H* c$ m$ m( s* M : m2 {2 c) w" O! {
Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
8 {, A9 a* r* U, X
" f( E* }* L& r( _/ m, p " `. n f1 K6 z8 p) J3 F
+ }/ K9 f- \! L( H; J) S 从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。9 S% D) d1 }( q* z1 ~
) C8 V2 @# ?1 w) c+ T4 I/ ]
+ K) L3 P4 {& b% q y& P
" j% Z, s" o. S, c6 V K 由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。/ ?0 `& g' N( \6 ?
# [/ i6 P, z; A8 Y. ` $ a/ v+ w% @5 Z1 i
2 x- A' }; b. C) _/ L- i
第一,提供Socket服务
+ [- Y& J1 O* z% n) H( R( z% k0 E ( f3 u2 Y' K# D. ^5 C
$ t; r& ~& M) {+ g) \8 U
* |5 ~* U1 g3 D# Q. @* ^2 Q! J. s Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
`' q2 L6 A# `4 s0 ^$ G : R1 J2 T' l9 Y2 @
K' z. ]0 Y* z, @5 d
( c5 l$ y# j$ i s6 S A
这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?4 h3 O- c) J' q4 `
- |0 f+ S: Z8 j$ \# Z0 ^: O , `" K& M! k0 \' [# E5 @0 C
% ~/ o3 Q1 _3 h& o2 r2 S4 m T& G
第二,进行请求的分发
! K' y2 ^: h1 m. T9 ^ 4 n2 _6 K7 n0 ~0 D4 A
$ ]- B& `+ }" o6 P9 \% e* }
w' J- L" n0 `5 J* Z1 H 要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
5 N% S( w* @, N/ x8 b* a) y- J9 D& E 7 F4 S7 C% Q4 T, I
2 F6 ~1 J6 t7 T! D
6 [2 v8 H6 Y- |. L9 K; P3 h; y 第三,需要把请求和响应封装成request/response
2 i5 @3 L9 m9 ~. e/ j
5 r* \- B: F0 w% D+ U6 r 5 v1 `+ c5 K. g8 J; N* x1 E
% M3 ?+ z9 p# ?3 {! r& E& ^ 我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!+ ^' V9 w+ @4 A# i, o, x
# m" {$ `9 r& m& k# [8 i
* Q: k: O" Y( M 话不多说,先来看一眼工程截图。$ o! W! q9 B$ u! N- S# f
: x! k. t) V, ~
一、封装请求对象
* N4 Y3 f; }5 z7 @/ x+ S
+ z- s; e0 ]2 C c$ r/ \ i; [, s0 S% b
! _$ s$ n5 R; f0 Y 这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。
" }9 K; ?( V/ @ `# L 二、封装响应对象 ! v; H( [- Z4 z- ^0 v3 S
* { g$ O. o% J1 X; m. B: P
/ F& N) H4 o8 ^) q1 D 基于HTTP协议的格式进行输出写入。
9 f+ r+ ?* X5 [7 \
三、Servlet 请求处理基类 1 y# _' Y/ T* D5 A; M4 z
; \- E% Q" m2 x9 V
5 p& [5 ~. z: D- Z( c9 ?* ~! t' f m1 O1 j
- C1 @. y% a7 Q: w
/ x( e" R& F: T! s& z( p. r / G. }5 q) o- Q4 I [& N. B9 \- P
前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
5 v) X. |$ \/ \, D z" F 4 H# L3 I; Q6 B0 {7 y# J% `
' O* |$ _" {5 @0 W0 R
+ G0 \' u, @+ [, _' \/ [ " V) f1 B: V4 G9 {
/ \# A' N4 f% @5 k0 h3 i4 y 提供这2个具体的Servlet实现,只是为了后续的测试!
) q3 ~ T9 K5 f% s. x& P
五、Servlet 配置
* k% R4 S3 l, E
1 y# v/ R; |$ {2 E# J5 E1 P 你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。
, ?1 ?0 N6 t7 k; z3 z
六、启动类
9 z6 E4 Z/ r& K/ _! _' M1 _
0 O" s$ d% l/ u1 `% Z
, U! u) [( f' ^+ l* \* U* ^( K) }
这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。
4 J. m; X/ |6 d# x3 L# L 七、测试
# N" e* Y1 W+ T' Q
0 _7 q, O" Q9 b* ? 2 z% b+ D& }- Q; [1 {
实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。 9 I, B) x, o, H
————————————————
* \, O) o! \7 @ 版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
6 Z* `5 _0 @+ q1 r- i 原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480: E# D% ^7 S2 G' H" m! \$ p; X: u: d
" s: J; q) T7 j0 y
% j- Z: f# s" T$ H+ M
10.jpg
(102.17 KB, 下载次数: 422)
9.jpg
(141.62 KB, 下载次数: 362)
8.jpg
(83.61 KB, 下载次数: 394)
zan