QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1364|回复: 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

    & \* z! N' s+ p9 D* n从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat, n: B- _+ O1 Y& Y

    " I! K0 N6 J, b9 ], t6 S2 G2 H: s目录
    + j9 w4 {9 [- }2 @+ f  v& y' k# k- f' Q/ o# u
    从零开始写一个迷你版的Tomcat* l- x4 R4 S9 i5 _# F8 M1 L9 B0 j: g

    1 i  D1 a( O! C1 O8 m第一,提供Socket服务3 O/ s' E* P' O" o) E# e6 B

    , O3 H5 t, S3 d  J第二,进行请求的分发
    7 K. q3 H8 B1 ]& v
    ( B: l! s9 q! O, I3 Z: D/ t0 E第三,需要把请求和响应封装成request/response
    , `/ s4 z" c3 R5 v1 L5 e, c6 l6 |& J" B
    一、封装请求对象% R" Q4 ?0 ?. H2 ?8 k

    3 w2 b# |1 _; N二、封装响应对象, ^7 b1 z: L% z

    ) r9 l1 n- s) T. ~  U2 a7 Z9 R/ x3 p三、Servlet 请求处理基类& O! m2 j) O+ V* ?
    2 `6 B# m; ~2 d2 h! C
    四、Servlet 实现类
    8 c+ t* |' k$ ^" b' w9 ?$ }6 w! x) a2 u4 n
    五、Servlet 配置
    ; b' r3 K6 j" c) f4 ?
    ) c- v8 z1 @9 b2 k" Q六、启动类
    % }/ O) Z, ~. n2 @& _
    / M* `, t% @  O2 h七、测试
    ) g/ L3 w9 v5 e9 ]4 Y, ]8 @9 _; ^7 y
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    0 W& R$ N# N) ]0 G+ n- H" C
    $ j4 ?( q2 K' YTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    $ j7 ]/ i$ r! a: d; Z$ N& z& U) J
    ! Q" B  Y! K+ w# p. W4 J5 L/ ^; I6 i, q: R( ~: d* k

    % T7 \( _# n* Q: a* M. i) n( h从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。! x% f0 o0 D3 q
    7 _' o+ m- }# e' m
    8 o8 U* J. c" Q2 J$ [% m$ r- I1 ~

    7 {3 a  y- ~; M2 f- V+ H( r$ i由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。  Z1 ~4 o/ o% F' z0 g8 p6 R

    ' P; Y: |7 F( `* x5 V. d1 M) x/ v, F8 O' Y. O

    + o" W! F# \  N! o2 L1 d, l: F第一,提供Socket服务+ [) A7 J6 w8 d  f

    : _  J! ]% Y$ ^/ J$ F5 S( ^5 o" ?' `; D
    $ D; O: u7 m  c, v% ]" f
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    9 o; S' |% ]9 C, f  H  q! t3 E
    # }+ V8 x7 V! w2 [$ L0 P
    & H) }( S( ?. v, S' P
    4 v' ]) s" o" D$ A2 v7 t! z这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    8 |: M# l/ h9 h
    / f+ u4 L' W* G0 i7 f4 T$ Y4 q" x( M7 h+ X! l( N) k0 T
    7 Z5 _- w0 G# g( p! N
    第二,进行请求的分发1 `+ f5 v, C/ u1 F" x

    8 Q! |) d" j( n( }2 _1 @& n/ h( O2 j/ @; p; q5 U. T

    + s3 Y. v6 j3 f; }5 @4 O要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。' T5 n' b/ I' R# {! I0 k7 _. d

    2 ^& v) a" C4 ^) r: `, j4 p1 s; O( u; N: j$ v; P$ v
    1 y5 F6 F4 ^, V! y
    第三,需要把请求和响应封装成request/response. }" Q- E/ G* j' O) X+ |: [

    & e* G2 v. ]( o# b; K1 |9 Z- X) I9 i- L% i# B7 m
    * V7 i& H! @6 z8 s
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!$ _* f- \+ a- D: k: j, [2 K* x8 \
    - Y* S, e* G, t5 B2 s/ x. B
    ; ~; p" O, z: }. h6 D
    话不多说,先来看一眼工程截图。
    ! x  V# R/ v3 ?$ z2 W9 r) @ 1.jpg
    + g( K. J/ K( L3 ^2 v  J/ _一、封装请求对象
    - U8 a5 D# e' `/ S" ` 2.jpg
    # i% ~/ F( s8 z$ w  p1 Y  h
    % ~  ]3 X7 T/ N  g# p0 V

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


    4 D6 E5 l0 c* \5 l二、封装响应对象
    # W0 V; \/ h. z 3.jpg * m+ h  q/ A' C# ?' x' l( t; S

    2 p; O% k9 G' q6 [1 t

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


      b7 r+ a  Y* N* f% C三、Servlet 请求处理基类
    3 C1 _5 _6 r% [( s, Y: R
    & @! Z6 M3 O- M( R, u9 I/ F. i 4.jpg
    " Y, s; n/ ^7 r+ _  m: x9 l3 k5 J! G. ~/ ~6 X
    / l8 D$ M% t& {, f# K6 D
    + x' H! [& y% ~5 m  j- J- b
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    9 k* V  \, H! t" w* P+ Y  a9 D' j: b% g: S

    7 j+ Z( y4 X+ i/ ?, C8 Y7 ^ 5.jpg ) T) w/ a/ c% `& E
    # C$ a9 X. _# w

    ' N5 ~  Y1 C' Y; L5 E* Q3 P

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


    $ i" M) M' |8 H& F0 j5 a7 h五、Servlet 配置 7.jpg
    4 i- Q5 H% [4 h0 n& M 6.jpg
    $ b1 a3 q5 |- k- m

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


    & h. @6 X# t" g. o' ~- [0 {' ~六、启动类 10.jpg
    : W/ I3 j5 z2 L. f& L 9.jpg
    % a* L- l" P5 }* L 8.jpg 1 J1 M% s: U; B$ d- Q) N  T1 I  z

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

    8 l; i4 Y& F+ c$ |* d8 M+ [+ I! J
    七、测试 11.jpg
    $ w& S  d; K; ^/ D3 y( K' {/ r3 Z: [4 }. m

    + K9 }, @8 b0 Z1 \2 S6 O6 d实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    , {7 }8 F  N$ v————————————————( V0 r% O8 e+ ?+ N
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    1 o- Y. a9 a% f( A- r原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274808 m8 M8 r' Y  A! y' B$ M
    0 O" d, R% m( {' l" N
    $ \/ q0 P7 F& N( s" W& E- F

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

    10.jpg

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

    9.jpg

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

    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-7-24 22:23 , Processed in 0.636858 second(s), 53 queries .

    回顶部