QQ登录

只需要一步,快速开始

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

    # k8 E* I9 \4 p/ z, E: b从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    + p( K; P' s( N! e( {, @2 S" Q2 j
      m( S7 q1 l+ W7 B目录
    . x) q# ^* }' q4 A# R, k8 M! z: d. }: k' g0 T* _) O
    从零开始写一个迷你版的Tomcat( w8 E% g' _( S
    & @- h1 P6 r( `! U. S
    第一,提供Socket服务) T9 p! }! o. g* _

    . `% P- t6 m3 g2 p/ N+ Y第二,进行请求的分发+ N+ y3 S0 n5 x4 a! A
    ! k( C5 E% E" [  J  T* W% h, f
    第三,需要把请求和响应封装成request/response
    1 K2 L: R$ J; U1 \4 Y$ u8 p1 l$ {+ w7 G* J
    一、封装请求对象
    4 p9 M/ [  _& u7 S: q6 G& f1 Q+ m- c6 j' F  l' w
    二、封装响应对象5 D- b$ w, G0 _8 H9 N; Y0 a% g6 d9 H2 z
    2 u2 u& p' u3 p! h* h
    三、Servlet 请求处理基类
    * V4 k; v2 l- E1 P' [) }. G" S5 x6 J  T; x5 ?3 s6 }
    四、Servlet 实现类  u  B* a0 w; H4 N1 r" L3 p

    ! R. o* n  a  z五、Servlet 配置
    ) U  Y& l% n6 z4 X$ k+ Z- z# z8 [( l* K- x" w( V$ y6 B8 f
    六、启动类
    9 M# h: N2 Z, q1 K+ @  I. A: N9 o  K, }' H
    七、测试0 b5 V9 [* }% _4 y

    " c5 ^- ?$ _. u  QTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!( M6 n* [- K& i  g
    2 ]. E( v  f; b
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?4 K5 r0 L' ]. E& v

    6 O4 q, v. ^4 L7 C+ j, }' y  k  H
    $ q" F% b6 H# b
    ' a$ g; u. l! J+ a8 o/ O) \从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    5 m, ?2 C& {& M* y& S. w
    6 ~  ?- h- v* H% k0 `( v) p) P, [1 U( h% n

    1 `& W- p" h: j2 T$ t$ X. i由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。6 m3 S. D) q8 J. z7 ^( _
    7 \4 E0 X+ R  f. s& O1 O- T
    8 |( R) K9 j3 W7 m1 H4 A3 ~' t
    ; r0 W8 \7 g* L8 w2 W  J% I1 s( \
    第一,提供Socket服务0 K+ v8 u& u; U, M6 q6 T7 H
    . U. _% k+ j1 `  o  p  V

    ' U% V( f8 W2 \( t/ D
    & p$ X" ~+ |* j" K* C! y1 XTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    , a& w: N$ s6 S- [
    - @& g  Z, p6 d& R9 c9 W9 o4 ~: a7 O4 W& r/ f, A' a
    5 c) q4 {' t* v$ R$ B, ?
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?/ N& i9 x. {" G' o( L2 ~

    - S( r' m3 b9 P
    ) d0 y! s3 Z0 V4 |/ a/ @" |$ b. ~+ w. D, q8 B3 }
    第二,进行请求的分发: X: d; L% c3 `8 e' f  s

    % v7 ]+ G& C/ ]* V) X2 a& Y
    % z1 I, i1 g1 K" V" _: ~9 `4 @' A
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。8 Q, Z& \( l9 t' S" m. ~

    9 I' o& A1 b4 n& I) E, R1 X6 {! B( D5 E( c+ m" Y

    * w  V6 M! w, `* ~; T- p: [第三,需要把请求和响应封装成request/response5 y; J+ j! E7 ]/ w

    2 X; _/ A. O" c8 i" Z! @! ^2 {) \/ J3 L* J9 G' A2 z2 o

    " g8 b0 G# c& C/ x2 [. M" b我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!/ p8 s8 [! s, M3 W2 l' u5 V5 R

    3 B4 |/ w# `& \8 u0 J2 L; f( E/ f7 C% [& C6 b1 Z2 J; B
    话不多说,先来看一眼工程截图。6 p: e  {4 Z) X: }4 v  {7 D; T
    1.jpg $ s% A9 V. W8 p7 I$ _2 K
    一、封装请求对象; o; _0 p; V% d/ {0 i0 b- B
    2.jpg
    7 w! B& P* }- o* S
    & [# |7 R, ~, O( C$ Q$ R) `

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


    3 j. w' h, {. t9 |( j+ G' a二、封装响应对象
    5 w9 J1 x% @+ `) U 3.jpg 7 P+ C9 R" Y& M

    4 I! y' z- B, u- P+ m6 Z

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

    ) r2 o' o& P8 H7 W3 H( d  b
    三、Servlet 请求处理基类: {# u5 Z( n$ z( m) L" E

    2 _1 P, [% @6 b5 J6 p' a 4.jpg 0 ^, g( z# ~4 L

    ! M- D: O' A4 y: F5 z( S; O" @, ~; r0 M0 J
    8 R- e- ^1 }8 ?* d
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。5 m3 [, b* D5 O
    + i: S/ U/ i8 N. D# ^/ h& u. x

    6 d, E4 d& U7 N) P 5.jpg ) X$ E, i) I8 e/ F" f. ?
    $ |& B8 ^7 T5 N$ w4 ^8 o
    7 m2 L! E# P# v! j9 i+ W& I

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


    * w) r5 E4 A. b五、Servlet 配置 7.jpg , A7 c/ C% n% [% P1 ]5 e
    6.jpg 7 D6 b) c' R" T. w" \  Y% m2 l

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

    1 [3 f1 |( ~/ Y( p
    六、启动类 10.jpg
    ! W$ F' i; J$ N2 _: S 9.jpg $ i  {# H+ s! h; l3 W
    8.jpg
    , O1 f( G0 K; P* ^5 }& ?3 c' }

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

    0 e/ n5 w; f  ^( o. ?. k
    七、测试 11.jpg " a5 C* z( ~/ |3 c' Q$ H
    % @- a4 b  s- W! ]3 ]
    8 a! G( C& q+ {3 @' ^
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。, s1 c& `# {: u$ D+ G
    ————————————————
    & [5 L2 B6 n  b! L7 C版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    0 E+ n, e, |4 o0 E, a2 K原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274807 u, [. R  S2 A

    1 a1 [1 V6 E, M8 G0 v" R, y& M
    . }" ~0 c$ S( G; w, B8 X- L$ Q+ G8 ~

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

    10.jpg

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

    9.jpg

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

    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-25 06:21 , Processed in 0.796250 second(s), 54 queries .

    回顶部