QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1329|回复: 0
打印 上一主题 下一主题

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

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

5273

主题

82

听众

17万

积分

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

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

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

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-20 15:06 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    5 \( R2 m% _) ?; e0 s
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    & @. C0 W' r5 ^1 N9 q! d( c0 M$ u) |. M4 l! Q) }2 @3 M) g
    目录
    $ Q" u1 h1 c$ G7 D. N. i% x9 M4 g3 U2 C* [4 Z& B; V
    从零开始写一个迷你版的Tomcat
    8 S1 L! n$ u% v+ A
    % G7 K# b, H/ i第一,提供Socket服务
    8 g, [5 R. o* _+ B! S
    ( a; g# D0 s% S- ?2 {, g# O第二,进行请求的分发/ q- D! `$ C' A
    ) p9 t8 A  |# y" l1 d  F
    第三,需要把请求和响应封装成request/response
    7 v( U. [- m, T% P% O! j- n  Z& i, |8 E
    一、封装请求对象
    ! `$ H# Y9 i. T& X/ |0 Z6 c6 D- \. j" z- v  s
    二、封装响应对象
    " H% d% X% e$ I9 N) z2 v' [2 s; F$ L& B* O. p
    三、Servlet 请求处理基类
    3 D3 I8 g# F3 q6 k
    ; W' B  S/ U& c7 j( \四、Servlet 实现类6 C% ?  q4 k) C
    2 L; H: `- u7 k3 A5 H  ^  Y# {
    五、Servlet 配置
      ?' S/ V5 ^: H, X0 Z+ R' H% ~
    8 r( G. o8 O) n2 S六、启动类
    : }' x. E; C7 [) J2 u* v4 w* v+ T7 a" F
    七、测试
    + n; D6 s& i% R- @9 h8 [: H5 V) h5 I8 X9 a2 v' D8 @& _
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ( [* i9 }; A2 c/ c
    5 W* V9 s6 f+ A" J3 b9 j3 X7 c$ BTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    ) F! }( O5 Z: Z! v7 Z$ r  q3 e% F0 y
    1 c/ @, i) Z5 G, e( \5 D2 K

    ) x( K6 r4 ~% _  O, f从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。, v8 S' c" F' X, \4 G, R
    & v) a3 p. r4 h/ T5 H3 y; f
    ; U5 P8 l; o6 ?
    9 l! b3 I. s" O1 g" N
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    2 x2 v: P0 r( j. d- r6 `, {6 M6 H: n* V8 a7 |+ q
    - }& I% Q. u7 i2 O; D- B
    ! s9 c; |2 _1 C
    第一,提供Socket服务9 L( E: x. b! \% Q& E' Y" b/ E2 h
    , u6 n* S5 U& z$ ]) N: k

    ; z  M( y$ n% b- B' z7 B- J
    , k! [  y3 O2 G+ H9 eTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!$ r" G! P* V: C: h& a! y
    6 F" U/ |/ O! x1 g

    1 m2 H/ }' g/ V  h8 }
    8 R6 S/ Y$ q* F* R) E9 h# m3 Z这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    8 x( A. f2 s" j6 v  F; i! c1 x3 d& k. T* P& g7 S; _7 m/ o

    . R! D/ W5 T7 q# Y6 Q: S" U5 G5 O0 I& g. n# ?9 G' H
    第二,进行请求的分发
    3 G4 s8 w2 q. h1 \& K- r& H  b6 U0 h
      b  C$ P( m( K
    2 N; D3 Z8 s5 H$ J+ L
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    . K% u' U$ G, N+ J+ D0 z8 C$ ]: @' h0 c+ b, P+ G- `# Z" W
    , ~. Z' n9 }) R/ T' [! d  U
    6 r7 i% j, C, U
    第三,需要把请求和响应封装成request/response
    8 H# Y+ ~4 g5 _  K1 k5 J
    4 O& {+ ?% S" t+ t+ o$ J" Z/ q0 S5 R
    & q. K: K6 A9 L/ x- w& E
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!1 Z5 `+ t# P- E# y
    + k0 ]9 O/ D0 i# h/ t6 y, ]
    : g% q, s+ f/ I' k; b& u' q
    话不多说,先来看一眼工程截图。7 z/ o0 s' S% D9 a! y7 P- L1 P" i
    1.jpg
    ( Y3 K# ?6 z, {1 f$ m" Y一、封装请求对象8 f) G7 _: @/ }9 M( D" B# ~
    2.jpg 1 v2 z( b  m& ?3 l; t

    3 m7 \" I3 Q3 o  [

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


    1 e. z# t) E9 a8 H8 I8 e$ e二、封装响应对象0 |* @" l" c+ \6 \% e! P
    3.jpg
    : q) v2 W3 [( Q! P. s( A! |/ q/ O. w* n$ q' ?

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


    % P5 h7 z3 }- r3 D/ j. Y0 \三、Servlet 请求处理基类
    # Z- u% ?8 g& o( |# x8 c$ z
      i, ~0 O$ d  k 4.jpg
    * o5 [7 B' d" O$ m5 g7 j" ]" a6 d' F8 W6 }' A5 r, \
    " P7 I. z) }" F$ J
    " h3 m, j- J! A9 X) @0 k7 a" g
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。! F, I& L- u4 S* j( x

    * V/ l2 n! b7 s, C
    * I4 x. Z+ I, P( z& J 5.jpg
    ! w  Q( E! }( }8 y7 z7 Y  L
    1 n# w$ Z& n' @6 H/ d$ N4 l! {2 w

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


    9 ~5 o2 }( E9 L, A/ U五、Servlet 配置 7.jpg 7 }6 f  @* U; j* }; ?/ A
    6.jpg ; A- @3 M- G1 y5 N7 ^

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

    0 V% o" S6 ~; R; k0 X8 h, }
    六、启动类 10.jpg 9 H6 _  q) R4 H. ?7 k
    9.jpg
      |9 C" d( A, E3 `# y1 |$ I 8.jpg
    # V6 H' A( e% i- |

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

    8 y/ o1 m: H/ Q" }
    七、测试 11.jpg . b& R# m( P0 K* Y# X/ Q6 j
    4 b! i$ R: b. N, m
    - p. C1 t# C3 g9 U) |$ o% M! N8 _
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    + U# u- X9 R/ V1 h% u. R7 _————————————————/ p9 o) J& E- y2 `( s- u5 z) `
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & T  Z0 V! v8 `) u9 E- N* ~原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480/ t+ a, K9 j; r3 ^! d% d
    : D/ b; J6 l/ o. e4 _: y3 R& V

    3 D4 l: [* R& p" s, F, B

    10.jpg (102.17 KB, 下载次数: 391)

    10.jpg

    9.jpg (141.62 KB, 下载次数: 332)

    9.jpg

    8.jpg (83.61 KB, 下载次数: 364)

    8.jpg

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-20 19:10 , Processed in 0.572970 second(s), 54 queries .

    回顶部