QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1387|回复: 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
    0 ^/ @/ ?" r1 s
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat3 @3 R; S  q! Y0 ]$ z. M

    : b- w+ S0 M& k& r) }- k( _# Y目录
    - w* P3 n  ]& g: Q! v
    . i3 e9 y6 |7 M4 R5 I/ u# w从零开始写一个迷你版的Tomcat
    $ ]' d: q1 h7 ]# X7 C/ R
    9 i& D- N2 k$ t8 b, J  v/ a6 r第一,提供Socket服务: x: F6 T4 U. e! Y+ C! O

    - {8 ?! a6 t2 C3 k7 W2 \) f8 Y7 p第二,进行请求的分发
    4 }5 f" Q9 R) s
    6 D$ a' D. B" s7 ^* L7 S0 _: i3 M第三,需要把请求和响应封装成request/response3 H' L1 P6 \% o4 y1 d8 R
    & U# ~' v# I- S' |
    一、封装请求对象' i2 S; {  c2 W
    ; b, }2 S) [2 y% Q9 t
    二、封装响应对象$ [0 h, |6 x0 w" S
    6 o) I' Y4 o3 E. x5 G, P+ k% ]5 L4 x" D
    三、Servlet 请求处理基类
    : h( h1 q+ @; _5 {8 X3 s( L
    2 e% d% i  u' i( g1 v" ]四、Servlet 实现类
    " g. Q& R9 \4 V# x6 B& H5 o
    2 I% y: ~8 T( Y# E; X$ H# q( m五、Servlet 配置) p( E7 \! ^1 I, `+ [: t1 @

    4 R/ {5 M" p% a; D$ \8 l六、启动类
    $ x' ^; |) e2 X& c. u
    * ?. X& f$ P" L  v. W' x七、测试* ^1 Y7 W# R4 s# Y* U$ D

    & a* O/ Q- e8 U+ x; WTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    / Z* ]6 c6 e* h: n1 c
    , i8 @, Z2 X  N% [8 sTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    / T% ?. r: X: }/ S6 k; Y! Y* ~5 }- W

    / q9 g0 l8 E4 l: }* c6 m9 H
    ! M1 \9 C% M% i5 X" V  [从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    4 q$ ~; k( G% A. {, B! I; }. ?* x/ Z" x! t. v

      \8 D. s) q8 C# K8 L# t0 L% o# z. l6 J3 o8 e$ M
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    & \, R8 Y1 t- u* M$ o; ]' i2 G; E- ]9 n* S; `+ G+ O* u2 c5 ^' ~/ N

    1 J/ s2 h2 h: R" G4 x4 `/ c# ~3 j6 y& l" o3 h( r
    第一,提供Socket服务
    , m( \+ f; _- @
    ' u/ l6 V. U- M6 w( t7 {* q4 j' x' T( x' {
    # M3 ], u0 G; Y
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!& }9 i2 v' Z, v4 q: E' Z6 \2 \% V* }
    ( U% [' f. ?( `/ t* A# z7 y
    + T" @0 e, i6 s+ V5 b

    : V& b6 {& N5 P* v这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    ' B: J" n. y, y$ F$ I0 l+ z9 r" l3 i2 d

    3 S7 g1 V6 J) |, L- d, ?
    4 G0 B8 d4 M3 C+ p, X. w# F/ K第二,进行请求的分发1 U  n1 q; j* q6 t+ H* G7 e
      I4 ~& S. ]8 o. {& h' K$ a, h
    ( W- {, w6 _, p0 M8 Y0 L* C/ v

    4 e7 K9 _' }# @6 f要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    - B; X! n1 y1 a% c% S
    : {; a. m9 J8 T) w, o' ]" J8 B4 I, T/ m: x

    / R) E; L1 |2 j; S" e( }第三,需要把请求和响应封装成request/response
    & E' l5 W  x" k9 D- i; l& M0 S( B$ g: w& n

    * m- X) ?0 {7 \( D+ ~# L+ C2 }1 R# U4 x
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!% ?+ x1 E5 R% e1 X0 \6 r. [

    # {( w/ B- b0 [3 a# v6 s. z5 _8 {6 a. B) k' L  n4 f& G
    话不多说,先来看一眼工程截图。
    0 r$ Z8 a1 p$ d# x4 x. Q# v4 \' Q0 S 1.jpg 5 d, y+ x1 l- Z# p! R4 T1 F) Z
    一、封装请求对象
    4 Z6 C' [/ q2 Z) n- w1 s( h 2.jpg # u& f" W/ M/ c+ ?1 v

    " b/ ~  [& X- y1 [# ~% a, n6 u

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

    , Q; T/ w4 O, C2 T. Q8 c
    二、封装响应对象- \9 ^5 Q. z: X2 X! L, X: e
    3.jpg
    ; |, o0 a7 I5 b2 G2 G9 K8 N' R1 m: A! P/ N

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


    # p4 p5 }" L5 I三、Servlet 请求处理基类$ U- Y- o+ b, Y: L

    % @1 o6 \) c5 s$ w" [5 ` 4.jpg % p& G& c# G' P  a) c

    8 I* k$ E& b2 W" B  k
    9 \' f  `$ D) A$ N; C0 G* f( Q. o, H- U8 d, w
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    . d$ g8 Q6 S5 r/ w& U# c8 f4 B7 k$ {: Y. Q. t
    ) n8 v/ V% }4 n, Q1 U7 ]
    5.jpg
    7 Z0 ]- }1 T1 m3 P2 }; h/ q' D" r0 B% q7 G: q. X% t1 {% q# ]
    . z1 B+ X; }/ J; j+ [: [

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

    ( [5 @" e  p4 b0 g6 t
    五、Servlet 配置 7.jpg
    2 n, z* J8 B, y5 O* p 6.jpg $ x# ^: u% w4 S' N, O

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


    8 U# |0 K+ o/ G% E( e4 i六、启动类 10.jpg
    5 s( U$ H5 z3 \1 \+ O 9.jpg   C9 l+ w5 F4 n
    8.jpg " z0 S+ y  A  d8 S) _

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


    ( U& }( u9 X% w2 `$ S七、测试 11.jpg
    , ]5 O+ X6 i  n2 `% M
    9 o( V7 d% `  Q; R, Y9 K$ v3 o5 s! d1 x+ W) C( a8 x; u, |8 h( O
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
      x3 u. Q2 F! Z1 B0 _% C8 K/ w, @————————————————8 V) t# _9 ?- f/ R3 u4 p, [! R
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" Z" S, i( s1 s: I
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    2 r$ M4 G& G+ Z4 d4 @& i4 z& k/ _7 K' i5 L4 m# v4 q5 p
    : g+ d3 R" h, m) ]3 w

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

    10.jpg

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

    9.jpg

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

    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-9-9 06:51 , Processed in 0.432967 second(s), 55 queries .

    回顶部