请选择 进入手机版 | 继续访问电脑版

QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 801|回复: 0

从零开始写一个迷你版的Tomcat

[复制链接]
字体大小: 正常 放大
杨利霞        

5250

主题

81

听众

16万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    发表于 2020-5-20 15:06 |显示全部楼层
    |招呼Ta 关注Ta

    % A8 g* n' q7 k1 h. f7 G& o从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    & z8 j% I- Y$ p% n( k* G+ U
    . O4 I! s7 M& G( Y" I; ]目录0 w2 E7 X7 f9 L, D- C3 y0 d% h/ q

    4 c. u5 ~8 s. D" q' S% b# f* p: z  s& H从零开始写一个迷你版的Tomcat9 K+ P3 a, ^, a& X# h
    & V) F3 w  b1 N! }
    第一,提供Socket服务- e8 K; v3 m. e; Q- ~/ c7 N

    / b$ L  m; G5 ^! M5 f  U3 }* q第二,进行请求的分发: n3 {7 U' {/ i, B0 W/ V
    ! _( u/ n0 [+ _  i" i
    第三,需要把请求和响应封装成request/response- t$ ^8 V# J. J; g: f* l* d! r

    / N! @# V- _% M( g4 v3 v一、封装请求对象+ D$ M0 y7 i& ~0 a

    1 z1 p' b5 g! k1 n4 K" q5 @% N% S二、封装响应对象
    : y7 \9 l9 H9 ^+ u4 \! ?" |9 P' Z8 i5 r) d+ x4 g$ L& r
    三、Servlet 请求处理基类! E: S  s8 `% W( s8 p6 S, m& z

    - P6 @9 H3 M$ Y, T' ]四、Servlet 实现类
    + a2 Y, y/ @" ?1 H
    0 h; ?# p# A. h五、Servlet 配置
    ' p# \( F4 }) ]9 U$ R+ ~
    % s# V% z$ A( n+ m六、启动类6 _2 T5 S3 L0 F

    , s: h6 M- ~  b8 r  x) i" y/ Z7 \七、测试, F  K  j) }" e2 o8 d
      F9 ~. }7 S- n8 s
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!3 l' M9 ?! b4 m5 E; }3 d
    2 C; |8 u2 b; S$ R% m. w2 [0 ]
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    / r4 O# E" w* f) N; q: h
    $ ?* L9 k% y) b* p, U) w
    9 s2 f2 u! v7 U* D( s7 T# Q
    6 ?0 N$ M6 _9 H+ u$ ~从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。$ O- A' f  [$ U5 N
    " e& b! a! w" n' Z# O
    7 d* e) C5 C3 S; |, S- h7 k
    ' P1 b1 I- t" t' g1 u# y) [& q
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。" C  {. L- n1 t- {' U

    1 {( D/ z8 u/ x% Z. \. N: I4 G
    . l; p- u' r( b8 s% T1 G( q
    " y4 C2 B( i) G% a; G. Q/ [- U8 ]第一,提供Socket服务
    9 `) t* l0 e3 Y+ m
    + z: u8 l! A6 b, R3 r$ @0 \' U/ K5 \! a, g5 R, U+ ^

    ( i/ }4 n+ n" P* g- E7 ~  ^Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    - `$ b) @, x: C* \) n5 [1 {' D  t1 r5 W4 |  n: w. R% j) I  |
    0 g$ l9 i6 h! ^8 \/ m

    ) [2 b$ L2 O/ V/ f* q, w* W& J1 u2 e这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?: \8 Z, t/ t2 U, J4 i6 u" }% x

    , m7 t. ]: q+ w
    $ H6 O, l- R! Y, j& y4 t  h; e
    3 P5 Q8 t7 Z* P9 g第二,进行请求的分发( D7 V0 U, m, I8 K( i

    ( h+ x- v7 C* R3 f) N. }- Z) v' v- p: u6 x: q
    % F; T, U$ c* y1 F. B7 W: r
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    . t- Q# h/ ~" R! U+ F; p9 C  R
    0 ?# v  s; R! V' X) E1 W1 Q6 b0 j+ X. ]5 |! l; T) P
    # x; f: h. v' y, j1 \
    第三,需要把请求和响应封装成request/response
    ' N+ ]% N8 j9 @! B+ X0 o
    ) s; L( I5 \+ C$ v% U
    ! r; D  l. h5 X0 m7 Z0 l1 f. B6 ]; V
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    8 ]% ~) f2 p8 Q, }' T5 D$ K" K; r1 F. q

    6 |0 d- a: T# s2 W6 ]话不多说,先来看一眼工程截图。
    9 Q4 r! q, ]" F: u 1.jpg
    ' z$ h- E" l5 J  v9 [, }
    一、封装请求对象! \; f0 D: L% K5 @: }0 b+ }' d
    2.jpg
    ) v+ t2 V7 _2 \; P
    ' c/ Y3 m  ?+ n4 }; @0 }

    这里可以清楚的看到,通过输入流,对HTTP 协议进行解析,拿到了HTTP请求头的方法以及URL。


    $ R& K) M9 _7 Q% ?二、封装响应对象. m) a8 n/ q* t
    3.jpg

    # f. R; v% V4 R! Y/ a) Z& |8 D& L) c( v. k8 U

    基于HTTP协议的格式进行输出写入。

    / H8 i) ?/ q" L4 ^: U( `
    三、Servlet 请求处理基类
    - Z' d. h3 g8 F2 z
    0 i8 f% b" `; g3 o- J  h 4.jpg

    4 ^$ y6 K+ j- ~& m, d* {4 e. C6 Y, I8 [0 H" Y, o
    6 u4 ^. O  _% I. M

    % f8 n& w  X0 O7 L4 h前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
      `+ j  r# `, R) `9 K( o" a, e7 T3 O
    : B# W; B% C, b/ V: \. k
    5.jpg
    : U+ P3 i0 I. _6 C7 I
    & p4 V, q8 X, C  p' \" R/ t

    / G/ @- q& }. f  |

    提供这2个具体的Servlet实现,只是为了后续的测试!

    6 k1 A0 K! o: |1 Z  l7 l3 d/ G  Z
    五、Servlet 配置 7.jpg
    % ?7 e7 g7 f7 j3 @. f: F# ]; K& w
    6.jpg
    + X7 Y$ Z% C& S! i" P% R- q1 Y

    你应该有些感觉了吧?在servlet开发中,会在web.xml中通过<servlet>和<servlet-mapping>来进行指定哪个URL交给哪个servlet进行处理。

    & u: ?; t: z/ X% _
    六、启动类 10.jpg
    - l! Z' ^9 q$ }, x$ g
    9.jpg
    : Q8 P* t1 `9 N/ O5 `
    8.jpg

      M. R; V, L% S/ O8 ~: y

    这里,你能够看到Tomcat的处理流程,即把URL对应处理的Servlet关系形成,解析HTTP协议,封装请求/响应对象,利用反射实例化具体的Servlet进行处理即可。

    1 g) }; d( u/ q( d
    七、测试 11.jpg
    " j: r1 C1 j7 f. C- G$ r9 |) s

    & k" n: F1 {( E5 H5 W# b* ~) j. _, u& z
    ( k/ K, Q9 ^1 n4 H1 q$ p实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    & R  N7 t$ T) J————————————————' C- ?% w+ y; Q5 X) ]5 L4 \
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ( Z! ^4 @6 q3 A% C0 p( W原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480; k" O8 M* j! i1 V  p8 F$ L' ]
    0 K3 k! h. h6 I: S: k) G
    2 p) X/ b1 i1 }  r3 M$ x* N
    10.jpg
    9.jpg
    8.jpg
    zan
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-4-18 08:28 , Processed in 0.347975 second(s), 54 queries .

    回顶部