QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1366|回复: 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
    9 f. G- Y; W6 T
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    + l- l7 l6 i1 s! ]: q+ m0 k8 F; ]) V
    目录
    3 n3 }# p7 C1 }& [# e0 O8 l5 X
    . A# \- Q  W' F4 u& P从零开始写一个迷你版的Tomcat+ |  V% S0 ?6 Q8 p8 u4 i) [3 b4 B$ T
    ( m( H9 _9 w4 L9 |, q8 ^% f4 w4 m
    第一,提供Socket服务
    4 N- ~+ r) O) T
    & A7 K6 K9 u4 ^. {5 i7 R, x4 b6 A第二,进行请求的分发# y$ h7 ]. f; J" U! Q% j  x3 n
    , n! D2 a% w1 x; k* X3 w
    第三,需要把请求和响应封装成request/response
    " A, ~! A/ J/ M
      T) g8 A/ Z2 u$ `: Y( N4 c3 ?: l一、封装请求对象$ [& R7 r9 ~# K5 `
    : C( n  Q" _. C, F  ?' s
    二、封装响应对象8 ?8 }" u0 ^9 |6 _; \

    & h6 R; b5 W0 E# l  y. G# n  A三、Servlet 请求处理基类
    2 \5 F6 T  h: I# \" v) E* ]) @* J. z; _' E
    四、Servlet 实现类
    " ?: q5 H* J3 G2 O# O& T; K1 j& F( M& ~0 F
    五、Servlet 配置) p+ G, t5 Q0 e# M% R& I# I
    5 a' k9 g! s- K3 q
    六、启动类
    ! B' m( Q" H$ T" R+ ]0 }% S- d
    / [9 W3 ^- g7 i  n( _- z七、测试
    + A# s: R0 u! z% k( i7 d; \- P  p$ X0 d
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ) M( v/ i1 U0 I+ V6 ^
    ( Y$ ?$ t- G0 f( V! o& F. [Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?% v' _" }; v6 `

    / A5 D* h( f. B4 r6 p) G' G- Q0 i2 S* K5 `/ F8 r5 O2 X# o" K2 M, f2 v
    $ X2 N: C, N6 q+ i& N5 O
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    ( R) I$ g: S  C& ?( T: y( q8 T6 W/ u3 E% F
    & N9 c1 d# d: J" c  G% U
    5 R' ?( J) H( W, {: |7 b
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
      `3 R9 ^4 D* e! p; C# P1 g$ T3 C- i3 _+ H( \8 \( K

    ; B3 r1 J/ [6 P/ B" c8 U% A: F$ v1 {9 k9 n$ @2 Q( `
    第一,提供Socket服务5 W' ~/ X6 c( l" V

    # C, f  n0 M: _# Y3 X2 {
    & g; @* H. Q. a9 }
    9 P1 D1 \. w  J4 NTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    3 g" p' h& b& X; P5 n$ D# z, y) S4 X# m8 M; p& m% i( Y( X& ~

    ) J) a% B- Q; a, Y1 F4 b
    % N3 _2 L' x$ w# m5 a, q这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
      G- A% `; D. h6 i3 k2 g. @% ]3 N7 j

    ) y0 j5 ?. s6 x$ u% B/ B' F% Q4 q3 L1 [& \. }
    第二,进行请求的分发6 r1 P6 w2 \: V; s/ O# H1 N
    9 R% ~3 T5 P3 V+ S. B
    , e' L6 H) q- x. x
    3 o/ a0 O# ?4 D# F' ?7 S
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。. r: Z" s1 A5 h
    $ i$ p  ^0 z" G* i1 J# p
    / _# X0 X1 H" y0 ^5 u8 u

    2 p- [% Q! K  ?  }; W! M$ B第三,需要把请求和响应封装成request/response
    # H; Y' A' p' K3 x3 w* G; z* F5 j, N$ E) R% h9 z- A/ @

    1 S- z9 l! h! f1 \
    ! l: F5 ?* o7 @* ?我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    & |9 Q# ^" e3 N4 k" f4 b6 V- T3 K  q! S# ]

    / d  U8 n4 n( W话不多说,先来看一眼工程截图。
    . a1 o3 {- D7 q 1.jpg
    " X: W6 W& ?# Y4 Y8 w一、封装请求对象
    1 Y/ ]+ g" W- v# Q/ |' r/ G 2.jpg 0 K, H# r: E3 @  D2 U' u. v
    ' b( ~1 h0 Z: y( f

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

    6 f( F" d) \8 N
    二、封装响应对象/ S# u" c9 L: a- Z. K0 t
    3.jpg
    - E! S& Q8 C9 Y* u7 Z: W9 M7 J2 ^% ]: ?9 O; Z

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


    8 a0 B9 E: J7 b9 z% S6 B三、Servlet 请求处理基类
    3 |) V/ {  J* ?4 y% b9 j
    1 }" H, n* W7 z* y) p 4.jpg 5 w* }+ b& S, Y6 w+ C& a8 @% a

    - T9 W( d/ O9 J( K5 t; ^  l! s% C6 u8 t# o% }5 M1 ~; K" @# `
    & }' z. {9 n3 P7 t& Q
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    8 W# f' S* @% S% F9 w* B2 p5 `5 }& l( ~' m# X5 F* [& s
    & Y$ u$ I! O7 S
    5.jpg 5 o" ?1 ~5 Z, |  m& J

    & Y1 Y+ X2 l) p  `8 ^; P" j( v

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


    # w( u% Y0 K" x6 t+ l五、Servlet 配置 7.jpg $ r+ s9 K7 t) n6 u9 c" `
    6.jpg
    . W3 K- Z+ R/ F5 }

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


    ! b8 \% k1 }. E; ]  p7 h6 m# x六、启动类 10.jpg ) ?# m2 J& Q& g6 M+ K
    9.jpg 6 b, S! R% S1 T) P* R4 W  C
    8.jpg % D4 J$ A* r; B

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

    7 @) Q/ S; U/ p5 e" y+ v! H
    七、测试 11.jpg
    7 d% C5 m* T! I& L8 Z$ m, Y
    " N% _$ R" l3 z- g4 t- m
    ' k8 Q/ j# m2 R$ ~9 z# U实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。, i; `, I. e; b3 E
    ————————————————
    + W, q, u+ F' x+ D8 ^, z版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. |! K6 w) J7 {5 w% X  ?
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274800 ~; u6 b. J2 \; D
    7 _% l: d% {4 i
    ) R2 |0 C! ^6 k/ I4 J

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

    10.jpg

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

    9.jpg

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

    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 00:00 , Processed in 0.390801 second(s), 54 queries .

    回顶部