QQ登录

只需要一步,快速开始

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

    ! t; t9 C) C/ q从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    + {! F( N# s" Y& R* z/ x$ G, e2 N0 r' P) k( D0 n; l  s
    目录* o1 I2 A' C! g( q2 x5 ~
    1 ~0 p, |) P0 A- y. G  D
    从零开始写一个迷你版的Tomcat8 ?2 |/ X1 d/ |7 @4 P
    ) l0 I0 l0 `, Z7 N
    第一,提供Socket服务: s$ g) `1 \( `% |

      ^& P# @1 C: U1 H) k' C第二,进行请求的分发0 u) \- u+ t0 `# S+ i- L
    ) x! I% ]: `9 J. f7 d" o
    第三,需要把请求和响应封装成request/response
    ; \" E0 I+ Z; d  V% a4 r
    ! L. ^/ A# I) I  t一、封装请求对象% s0 }, V; a* T

    6 e/ G' U3 P1 b6 M二、封装响应对象' |9 B" p0 n; a9 |
    - K  |( u8 H. e1 H# E) F
    三、Servlet 请求处理基类6 }. D3 T, G# M: Y) m" M  i

    # y5 t5 T6 R1 i1 s, X, X, M四、Servlet 实现类! p1 e" ^  A% v! z& S7 Y

    3 w6 [1 n+ p/ b. Y1 }5 {五、Servlet 配置
    , C# C4 M0 X% O  N
    ' J$ g. N/ M, e9 R/ G六、启动类/ [  z) k6 |1 A0 ]

    ( ^6 S' H1 Y& ^2 j$ U% t七、测试9 k, C" ^" l# M( e6 b0 `

    - b! u5 `2 g4 ?Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ! c. E- K; Y: B$ I7 f$ X. ^, O, [5 k$ b7 c2 W7 h0 h
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?5 B0 T% D( N  o4 R$ {

    - i& M. Z' r" {+ c! U8 O2 @* T
    5 X% w' L$ a9 Y+ c" Z  _0 W' X& l1 c4 w1 X* V( E8 P) h
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    . O- C8 ^2 c' Y/ J5 T  }. Q# `* a  z& J
    3 I- A7 f8 |' x4 g8 _0 q
    ' x3 x+ B: P* D5 S) |
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    / b" n+ |4 K* s6 C& @& x& M# z* {* E  I+ k
    ( B& j& |3 a. k1 D

    " z- r( W/ h! F$ q5 ^3 X第一,提供Socket服务, X6 E. ~1 @% C+ j( k  e1 T

    8 Q5 {! R6 i. f* _; e7 W8 t( v. i& G$ Z( {1 g, {
    6 g9 _; _( }/ o. P1 j
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    ( i3 H. T. w# |# c3 H0 L4 R: z) a6 r+ q5 X2 g! p
    . p7 l$ A/ G4 {' D
    * v. e2 F5 \* @2 E8 q
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?" A. o. F% t) d

    - C1 A# E: @/ e/ o- `; U: X* N+ `8 w- j% o2 T2 T
    : z! M7 d$ r8 R! n6 W
    第二,进行请求的分发8 b' H6 P0 X+ b
    . U5 X6 c" y1 K, i8 V+ _
    / z; f' i- {# D" ?) Q

    , g5 a3 e. b/ [: V/ z6 N要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。3 D5 G/ R- w* [8 D. f
    ) F6 M8 H4 f; Q3 i
    ! ^! ]" x( c0 L2 [' P+ K- y
    7 i5 u! w5 a( a  ~5 D( h
    第三,需要把请求和响应封装成request/response
    0 `2 g1 f% p: G) x8 O+ U. i7 |3 A; ?, s0 `+ \

    . u* x2 D1 k4 q0 Z! v! c( M$ J9 j  K8 {
    4 g6 \" h. @: L- D2 L+ N7 V, _我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    % d- C7 h9 t3 [- ^1 K9 z7 u
    5 d8 D( u6 i, ^% G
    9 }( ?6 D% n, b1 }1 t' c话不多说,先来看一眼工程截图。! z- s4 R# A  t; Z5 M
    1.jpg
    / I* J2 x7 k! O" b$ t# M一、封装请求对象2 N. U5 K% a/ A' D) P
    2.jpg , j/ f/ Q6 f6 }

    4 Y* o, M& [% `2 c  [+ _) h

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


    , c4 w( @5 \' A+ w' z二、封装响应对象
    * B* S7 r, |7 X) @/ O1 F( H8 a. m: v 3.jpg ! X  c: F- L% I, v) `9 H8 x! u
    ) N# c+ B7 x) W" g* \! Q

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

      n: G" @0 F/ e
    三、Servlet 请求处理基类
    9 x, Q) I% ^# o/ W' D- v+ q' k* _6 M5 c" k6 A( P2 h7 v. H+ v
    4.jpg   K7 M7 `6 v, a" k( Z- L: l' F, D& O' M
    8 t' n5 _, f# ~

    9 o2 {: O7 x& k+ l" R& }/ d2 K
    ) P. o+ A5 K' r# `前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。! z; j. t. x) E

    " K4 @- L$ s" @8 V  O
    7 }/ d9 t$ c* k3 l* \0 U( M 5.jpg / W& [3 n* G) Z7 l* N2 L
    % @" p! R. j0 J- o# X7 F

    # S9 M5 ~4 G& |2 d% s. w

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

    ; H: W# |( L1 x" j% f
    五、Servlet 配置 7.jpg
    ' `4 ]' x; Z/ D3 W: d4 a 6.jpg % }2 t# S& }5 F& E( H

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


      v9 U' V- ~# `# e9 z" A9 H9 c六、启动类 10.jpg $ k" m  }  Q! ]* r
    9.jpg
    + [2 W: Z% I/ _1 Y/ l/ I 8.jpg 5 J6 Y* U- I( ^

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

    + H' g  U+ {5 H! }8 L, L( ]
    七、测试 11.jpg % u. I3 u' `- F1 b% s
    3 I# T! M' O# x' L1 D
    * w: S" C1 W! A& B; q0 M) T
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    4 R, P- o% \6 R, k, x% u' A1 l————————————————
    / Y6 {4 O" e! L9 s( a. H7 l版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 T$ b( ~3 g0 y8 d- _7 @, U% d9 I
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274806 p/ t* H9 y  B2 l* y4 x
    4 B- p" j# I6 p3 U) N0 P
    3 Q4 I. d3 ~& U

    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-22 06:56 , Processed in 0.598761 second(s), 54 queries .

    回顶部