QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1328|回复: 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
    ) Y9 t  n/ S+ j
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    . F' n& R- S1 |" C; i0 O. G( _( z4 o: a; ^. M1 h, E
    目录
    9 o/ Y' I8 W5 K& g) T, I1 O
    * \: L; R/ N6 v4 F* A( k6 i- T从零开始写一个迷你版的Tomcat3 `0 z, ~4 {: x* p
    5 R! m& i' j! ^) j( m; \: p! X, a
    第一,提供Socket服务
    " \0 q1 ?7 b8 x. e
    ! s) `3 P6 M# s1 a  g6 N第二,进行请求的分发
    6 ~( P7 v3 X6 f  s3 m9 K% C/ W8 J( N2 A( T2 P' G7 P# F6 c
    第三,需要把请求和响应封装成request/response
    * i: g9 l* q) o5 b' F
    + {' _5 w& O- c7 ^" I一、封装请求对象/ o# T7 X) s5 u. d
    5 \9 |) _0 g2 C; p
    二、封装响应对象* x  b; ?# J4 ]9 n: W1 B5 E
    / c" P; a7 J% Z$ m1 H
    三、Servlet 请求处理基类
    3 ]/ I' M) w0 U7 v2 F
    ) ?) Y% ]7 u9 x/ e- P% [3 e四、Servlet 实现类3 U, L6 r" P# k: l- b3 L' ^& t; _
    & a- p+ _; p# H* j, q6 P
    五、Servlet 配置
    + r6 B+ |" }9 e0 N+ M: w
    0 H1 z6 s, P- F* D$ P7 y8 T# V六、启动类2 t1 J0 I4 t, N: M2 ~$ R" H/ x

    2 W8 [% |2 N; R& [七、测试
    $ A3 z+ s# L" F# p8 _' L! r; [" x. T5 g
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    3 d+ U, i8 s6 e9 H4 K& b0 \# @1 e! _1 b  ]
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?+ V% U! n; @9 K' s  ?

    " l: A3 R2 |& [0 K4 I7 X; Q6 P) S5 u3 v: {% c, q  v- H7 o7 _; n9 G

    , ~4 M- A2 t( A/ ?1 E$ u从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。) p/ A# d0 c$ {

      |$ X# s  F4 G6 Y2 s! c
    % m  O% H* q/ g+ U1 f. I' J
    % ^* U' g+ d8 f# m由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    5 n/ ]3 q3 E8 B& @; D0 R% B) V6 ?. S" u
    9 F( |! O1 Z4 J4 {  r1 e1 ~' o

    : j* A$ f$ [  [2 s! \* I9 P; _第一,提供Socket服务$ ~8 D( V  S1 j0 ^  n+ ~* b" N" B

    7 {3 x% Y+ ]' U8 m" E
    % X9 g6 S+ h$ N: F) c: n( ~0 ^' v* w' J6 G' a2 \
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!1 _6 m  L4 S$ R: `, O

    # Z/ ^9 `+ M6 c: M3 R/ q& ?4 W
    0 E9 D) o. w6 k/ V: d. Z3 p1 r; P. n" h" ^
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?' |7 b3 ~1 }$ ^8 Y2 h

    7 L' B, V; w4 ~3 C
    5 u4 Y# W' @# w5 A: V( S
    6 B; {0 G! a0 `3 Y$ M2 t第二,进行请求的分发
    : I, W. \* L" i' H" ~
    5 h% S3 F$ D# N+ T' f; E2 Y, Z- |" k9 V, l9 ^8 g
    & `$ h2 t" m+ u  x
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    6 j5 u4 f1 k. H3 s0 d5 f$ K  W4 N# `% I; p- o- S
    / i, r7 U7 S3 r( b. I+ d
    8 t8 g/ R. h7 V+ t4 A$ Y1 C
    第三,需要把请求和响应封装成request/response* B& t0 F- k  |2 S' F: T
    3 `' g6 r6 J8 k( q: X

    " `! E7 x( E4 S) f# i; `' K0 `+ L; h5 T; v
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    : e# _9 W. o, z. P" |5 |) s' S' m. G2 W. g3 A

    ! H8 v5 W; r4 F4 M. E6 H" s: w" d话不多说,先来看一眼工程截图。
    3 U. K4 U, h, o 1.jpg
    6 M- W6 R! c  @1 T; _一、封装请求对象
    ! h. b( C7 a. z9 k- V6 L  Y; m 2.jpg & Y7 P7 o2 _$ Z1 T" K2 K. f
    , k5 Y, r. |  |

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


    3 a# y5 F; w" F* O$ \% u9 B二、封装响应对象
    / I9 |: ?/ Z! K3 f' ? 3.jpg 1 R1 d( H$ V$ L* Q/ [* C/ i2 d
    . |1 Z, [% C- A+ [9 h. V

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


    . S3 S0 d) \& l6 ~5 q$ o三、Servlet 请求处理基类8 q2 y+ _( s2 E" G) J/ D
    ) J$ i3 h  O: E: |) }6 W
    4.jpg
    3 K: F7 r) D  E1 F' r/ y5 v; O* h! Z8 U% J' m
    ! I* O; q8 f8 M* c: c: v, {, a/ n3 h
    * B5 x# m0 w+ ^# C9 s
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。+ X* e1 [2 }  ?# M

    4 O7 R# b! j+ ^/ K6 Q& `* N
    % G3 \& T9 `# {# d- o* K 5.jpg . m5 y  b0 V2 _. H

    # o. x$ b- ^  g, X& P% E+ d# [+ ]4 S! k$ T# I( l, q

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


    ; z9 m$ w$ ?6 c* D" B五、Servlet 配置 7.jpg 6 Y7 N7 h% J9 s3 ^
    6.jpg
    + Z! a, v5 y$ g" x0 k

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


    . X4 [& ^  r- }3 |- N六、启动类 10.jpg " p1 f8 f, e1 t; w5 j
    9.jpg
    ; R! t# D! `. v7 D 8.jpg
    * g* w- S/ v1 \/ J0 l- W1 R

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

    , u% w( P/ r4 P7 {7 {
    七、测试 11.jpg
    ; m/ @5 r" h$ j6 `
    0 h' S" w8 o% j1 F' O4 v+ h4 q$ u/ y7 }) h
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    # a! z" T+ {" w# `: p————————————————
    5 ?3 C1 X" q! I$ \; d7 c版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 D* _9 E) c  r6 D; s" n原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    , i; y& X/ l, R+ |) c) o
    5 P7 a& s1 ]- U
    2 T) }9 k, q; h

    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 17:28 , Processed in 0.297572 second(s), 54 queries .

    回顶部