QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1336|回复: 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
    . d0 E7 t. |/ A: h
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat1 I" ~  w3 j" m# l3 U9 p  Y; a
    * Y* N3 F4 s' J8 ^4 K
    目录
    - Q/ ^& q( L3 z% D5 f
    4 Y( P, q) e) T5 W  ~( r, E从零开始写一个迷你版的Tomcat
    - g2 H: X0 i, M& e3 U9 R) n4 h* s
    6 |& N5 L7 j' i/ N( K3 d' ?第一,提供Socket服务
    1 }! A3 F# _" L& A  E. b$ d5 V9 O5 @
    3 c1 A/ ]. T9 W( P1 r6 l+ M- T第二,进行请求的分发
    7 p. Y4 Z; S- j% C- r$ {
    ( {- D, z0 p' u( c第三,需要把请求和响应封装成request/response
    . A7 u7 z  T2 W2 o) e7 E3 P0 a& U& ~( ]8 Q' Q4 Y) A9 L9 u
    一、封装请求对象
    3 Z5 A' M  ~2 _2 ?; j, |+ b8 k* L+ h8 |- w, o1 i+ t( i
    二、封装响应对象
    % Z" }1 B5 H5 A) R+ f# l
    3 q3 ?5 b0 g* ?* E7 V三、Servlet 请求处理基类+ z: H2 K5 A$ q* j' H5 N
    ; L. D  X8 ~. o$ \2 ^  q2 W  ]
    四、Servlet 实现类3 R5 I6 H8 ~4 W. X$ G

    ) p* V( C0 e( ~9 {五、Servlet 配置
    ; d7 W1 [4 k/ _' Q; ^9 G3 n$ o6 |: c
    六、启动类, _8 I% E2 X. t. f/ x4 e4 O6 D& F

    3 {. u7 q% m4 ^七、测试
    : I2 ?; W/ v. k/ K8 y  u. M2 u1 T9 s' |- j. O# E4 L: S9 X
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!( W/ r; S3 F' v) J
      m. \' @' _, V* F
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?2 `- L" `0 n. p3 W

    : b6 \- @% E9 H( y4 R
    ; N+ W7 ~4 M8 U1 h0 O6 v$ m* C% n* _* _3 J3 ^. f. r) |9 H
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    2 h1 U, w0 Y; ?; ~, ]1 S, m1 Q( ?# V/ H6 v

    8 m& L+ w9 l. o' e0 K, Q6 m, |5 Y0 [
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。3 F* L2 B2 u, F& x

    : o5 o, N9 J7 w, K* ^2 W6 L3 U+ o/ `1 A7 ]/ a

    * W7 }* g% Y/ L: M. t! H第一,提供Socket服务, h$ z% T7 H5 f5 u5 I

    ( ~  d; ]$ P! G  I8 m1 h1 H3 w( L7 S
    . D2 @* |( O6 F, V' u/ h
    + T) j# d/ W$ r- rTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    # K, r  K+ |% z7 w2 }
    + `8 Y* r4 ?) U$ Q0 v- M8 }% P6 M+ x( L9 v3 h# F; Z7 @

    7 Y9 D- X8 ?: L- b9 {这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?4 n* p- M, q! \, u0 T$ s2 M. g! l
    4 r9 }' ?, u: M
    5 k/ b1 e$ K: a# `8 p) C' v- F3 [; u

    6 x3 G& m. Z+ |& ?2 m: p, P第二,进行请求的分发
    % x" _: C. [+ ^  w1 F8 k: x- q% b7 T4 O  U2 o  R$ U8 A
    $ a* c& k' K( [: j& H) K' U

    ( x* q* D+ J" y- N1 \要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。) |: X+ f9 V& k

    , x, V% W" D# s% E2 Y7 ~7 Q
    " Q0 ]. z! k/ Q6 R. J% A, H+ b4 e) {" k5 i( y
    第三,需要把请求和响应封装成request/response
    + N  R1 p, _% \+ c" R/ e( v. b; g6 z

    ! o; \; }# L9 z# Y
    % A6 e! b" i4 @" M- \( q" H' W8 X) s0 }我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
      j, h7 F* y8 J9 g* n3 A, |) E( V+ S; ]8 S5 y4 Z: M

    - J1 s" o( h: I, l话不多说,先来看一眼工程截图。
    ' Y2 o2 t# g2 B+ F 1.jpg
      o$ \" ]9 ]) F5 n# S一、封装请求对象; [/ n" i" q8 U& k7 @+ y
    2.jpg
    - n# O) Y8 a/ O) J* D1 k+ Y
    : A  L* A5 ~" ?

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


    3 Q; ~5 E& g! {# z% ~! K, S二、封装响应对象4 J1 |8 x- J4 g4 p- D( \
    3.jpg 4 J2 M. l2 C8 ?9 Q! w& M# ]

    9 \( l: g3 L' e! v0 Y; I9 U

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

      M: t; R& [2 Z7 Y
    三、Servlet 请求处理基类
    ) q2 S5 Y* s4 P5 {. _2 e- W# a/ t" t. Z# i  V
    4.jpg
    3 G" l. I# F/ k! j, n- d
    : u3 u3 Y# P4 `  P- j5 C) m4 H+ \, g( P

    # V1 S2 i+ Q& Q0 L% Y前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    + D2 k1 f' g* G' [+ ?* r, Y
    . i1 ~) B: H, e4 m1 |$ y6 @4 V* p9 m! q3 M$ R$ E- o
    5.jpg , _) c$ R) I. H2 k4 w" q" y4 i
    5 ?2 X$ x6 Z0 I1 p. J
    : L' t4 Z7 p! U5 S# z8 o

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


    4 l' Z; B$ L3 L  t1 Q$ ?五、Servlet 配置 7.jpg . @+ ]. ~/ _- z4 D) T; H
    6.jpg
    + z5 j- w5 Q% ~8 I6 }$ x& n

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


    2 o. H& k$ ?1 t' Y# y, j六、启动类 10.jpg
    ) k2 o0 x1 [5 R& u 9.jpg # R% f8 c5 }" b0 b
    8.jpg
    # _, {6 B/ f, G+ R( N3 v8 T9 a

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


    . R8 ^; E; O# F2 [& Q# k" k0 V七、测试 11.jpg
    9 j) S# v( K3 T, {* V8 h! X' f
    8 u* b0 o' N! B& ^7 T' E+ C
    - E4 T, G% E4 n2 S1 t7 c7 O实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    ( S" z9 f) g7 r; `/ V/ |————————————————
    6 p" Z1 s3 l% \版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    7 o2 V3 X$ ?  Y! U  T; d# j原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    4 O( c) l: R& i: q/ {/ C. P5 q3 |3 H

    6 q6 l, K. a- p* `

    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-22 10:45 , Processed in 0.439001 second(s), 53 queries .

    回顶部