QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1363|回复: 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
    % q: N/ `5 r4 S8 S2 a" {. P
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    ) b. y, z) ?& I; A& Z9 z+ T! ]1 I2 z1 l6 `4 H2 P
    目录
    7 w/ p  h& _  G) N  ^
    7 ~, h2 w- \2 f从零开始写一个迷你版的Tomcat
    - q  P; ]" O  c: d8 k
    8 k  C" I6 y6 c* o- H2 |3 t% @$ B第一,提供Socket服务
    9 \" C' }# O) w4 P) a4 }8 h. w% y5 C4 W  O3 r) B5 S0 j
    第二,进行请求的分发
    ; u. b" _" M6 X# ]" a5 v. s! D$ h. v- z/ T% g6 Y' o
    第三,需要把请求和响应封装成request/response
    1 l8 B- q6 ~( S, R& c3 W) Z( m  F  k) h/ A, J- K' i: I
    一、封装请求对象, O4 `5 |8 F* N- f4 }$ g
    7 L9 |. W1 {+ B( q- k  a
    二、封装响应对象
    % ]4 `: e! `5 W/ }: b3 R6 G
    5 {9 ]! s  W! U# \: K2 L1 @三、Servlet 请求处理基类
    / Z" u) V1 R0 z+ D
    # U( X. M3 T9 _* |四、Servlet 实现类
    $ w5 l; ]7 U% ^3 W* Z0 |+ ^4 ~
    9 q' I6 r) h% ^* p2 y" W五、Servlet 配置( {! P! X' I4 L, M5 D0 w, s. Z  `
    8 o$ E, s0 k; c& t- f
    六、启动类
    9 n4 g" |( m8 e/ Y( a/ Z
    / ?4 z5 Z& F) A& q' X% |七、测试0 X6 \, V7 D+ O
    1 p0 a& u6 i* T6 ^. K
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!. `3 P' e9 ^0 t

    / R6 s% D! ?: v. o9 Z5 ^Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?( o3 k3 x2 ^$ B6 E) E% V: ]
      H  u' I6 U. ?) D, R

    4 K! u3 c* W& k4 J. }; Y7 d1 K1 h2 j; _8 i: u- F
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。) _0 Q  c, F; S3 s1 k

    % I4 N/ e2 n4 D
    " |- o. w  L( ]3 t; ?0 D. ~, V, d) T' T% ^: `4 [; u$ t4 E( N
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。- F6 N6 R/ A4 s+ r

    8 t* k0 [8 y$ O3 y, |+ A9 y
      D: g- U7 c; P7 g; M
    + P: o0 R! ]. {* H第一,提供Socket服务1 I# J# J. n, u! x/ ], E

    3 x3 G- z. i5 K. t8 L. k
    + D& n+ D& _5 M5 M1 U8 d8 j# H6 F
    1 v; X6 |* g. KTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    & b8 r& `7 p5 H+ J  \: a2 L# B  p$ f$ u( f$ V( r0 d9 S, [9 ~

    ; M- D9 W6 e' ^( h* ]) p( u3 ?) @
    ! X& v+ l  `3 G) K0 u8 X, n+ m5 p. }这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    " N1 q7 h+ {: ]6 |$ o# @& r
    $ s/ Q. J, p& t+ E$ N! Z; J- M- N$ w& y  p" \' M' [3 _* P

      I. x8 ?- T/ X/ U# r5 d第二,进行请求的分发" D" e. @* r5 |5 P4 T2 O8 B

      L; C3 a) G8 M0 @+ c' e; ~, l
    + y# e. k- c& W
    3 t* R3 X' D4 X要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。$ b5 X% n% A  v2 n

    # B# o* l- c' L" l1 [: E, j" {
    $ Z5 J* Y" ^$ o. V
    第三,需要把请求和响应封装成request/response! \# w  O8 _6 `- m
    9 Y$ i: u9 ~) {9 s7 S

    4 l# y" H& q8 H! o+ L4 m' j/ u4 ?
    9 g# Y, L9 A! \# |我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!; z+ x( {4 E* n( h0 P0 j

    7 ~. U+ |) e/ H$ S3 e
      R3 j9 P0 b! c2 s$ I1 D( M话不多说,先来看一眼工程截图。. j% y  o! k% X2 w# w4 }
    1.jpg
    2 c) D$ `- B* r) I- B( ?1 \一、封装请求对象
    ! Q* Q) a& J8 N 2.jpg
    ) ?/ G0 J( T$ y- D- ?2 u/ b8 p; m$ \! I6 F+ b

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


    2 p5 L+ M, Q' u! E; Q) g二、封装响应对象
    ' a4 W) t4 J; v, F$ A. K 3.jpg . a# ^  E% u& }0 {: G2 d) |  Y  V* d

    1 s7 w0 P9 n' n, `

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

    : l1 j7 [4 ]/ c- a7 Z
    三、Servlet 请求处理基类
    " g% }! X( W2 x9 ^4 B" n9 i  E. y3 T, j: ~: i2 I
    4.jpg
    * n7 K! Z) S* R0 R$ r& }
    ) d4 j  u; r4 t3 N: r, |* G( S7 a' B: L, U  K# @

    % Y& j  n& e4 \  G& v; r前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。$ R- G- y/ P) [$ E1 [' B3 G9 ^

    : _7 c( q1 g; H9 i1 g4 x! M' l) c* r: r( ~, }$ l
    5.jpg 7 `: G9 w- [/ A; ~/ Q/ }4 ^8 i
    ) v0 @4 @# `7 d$ a9 l5 E  x

    2 g% j! X: S8 ?/ ?, A' `- [

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

    & `2 u/ ~3 d/ `
    五、Servlet 配置 7.jpg
    5 Y7 ~, n0 p4 ^( u6 O 6.jpg
    0 Z- W0 C9 @% T' B

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

    " p; Q# [# K( N! x; q7 h' x( F
    六、启动类 10.jpg " q. L. ^5 \0 D4 w& n
    9.jpg
    5 c1 ~& b( f8 L2 b 8.jpg
    ) l2 g5 v9 }9 D

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


    8 l3 _# I% q0 D  O4 u4 R七、测试 11.jpg
    3 |" o! E" y! Q& r
    8 x! @; T' p8 y4 z) C+ m( J: n# z) D/ u" y$ s# h- h* u7 q
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    8 X) U* K# U$ p9 V————————————————" K( W+ Z5 V& J: R, O$ `' I/ Y
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。4 r3 k: x/ B0 G- O3 W7 x$ w  s
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    / Z6 v& Y: \8 C$ [. t7 o9 n8 H4 z6 K' o# I8 p% ?
    1 C2 ?0 q/ Z" R* q& `, v

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

    回顶部