QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1236|回复: 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

    * P: @& K0 e2 E% @从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    , F! ^% D9 \% _# Z
    8 |7 C! Y9 J0 Q: Y& U+ j4 s8 K$ |目录$ R# L( w0 g1 e5 f
    1 f$ c: G7 [" S
    从零开始写一个迷你版的Tomcat
    7 g9 Y  q$ W, @; ^! \+ S" E' g- {7 Q. w/ _- m7 h5 \
    第一,提供Socket服务
    ; \. P# `+ _) q5 X' A5 o& D9 E- T* k0 {- N
    第二,进行请求的分发
    % Z0 R, Z% ?7 r- ^6 @4 q. w0 V8 ?) ?7 T. R
    第三,需要把请求和响应封装成request/response
    + t, L6 ^  {- {6 A
    $ S$ `, A. a2 s: |6 V$ ~5 g一、封装请求对象' C" f% g" g8 ~4 `7 S- T
    * n* k4 s9 d, Z4 S
    二、封装响应对象
    9 E4 `+ v: J' M. D, W! _
    / r% Z, q7 f, s7 ^+ O1 n6 q三、Servlet 请求处理基类5 u1 c; g' H  ~# B1 _% {" c

    ' q6 V: _7 ~  G2 ]$ a  \. {% Y四、Servlet 实现类- b6 q3 y  j% b0 N" l. |+ R3 U
    8 r$ A8 x! e- S8 a2 I  d" T' V& a
    五、Servlet 配置
    0 |) a. g1 z1 D
    ) V, g6 B# n5 B/ k六、启动类2 d7 H! d+ [) s; i7 J7 J& L/ N
    $ M- m* c# t4 r- x# Y7 p+ T
    七、测试
    * C  A3 Q9 Y6 \7 l6 l* R0 W9 M
    4 J  O8 r  X8 Y7 t  yTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    , U9 A9 ~, A3 u0 g- H
    : i  Z. m: N, S/ ~' ^Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    2 i1 e/ f: e6 X) M# Q/ e
    5 q$ R  c. F! v! N  [* L; @' t; {& s( E6 r/ e

    ! e8 ^. W$ u, g  \) E% z0 x: u7 s8 a# W从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    : P3 ~6 v7 e7 i  }( E5 \1 k1 |8 T  f' G
    . c# C/ _) n1 k% L

    ) R3 l3 k4 P+ a& h: t0 c; L由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。+ t; C. E) y9 _6 u0 V
      Y% o( d7 `! E6 _' b4 o8 r) O5 e/ K

    5 J: s% U& F( F
    ( Y" t. C  p! |3 ]9 V# Y5 D第一,提供Socket服务
      l7 x# @: T+ r/ ^% S6 }& T4 S! t- ?, J' }+ D! Y5 M7 T6 N
    $ g: ?5 p7 {1 ~

    + s5 r+ E" @2 Z$ i5 a4 t0 rTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!; k0 F1 g, U5 Y

    0 Q/ K4 j+ G1 r0 a3 o: ~
    % Q6 c0 R- D$ g, @* n
    - b0 r( L( W& N+ X( h这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    * U% H) l  v; C% W
    / y  ?" R( o5 v
    & f. Q2 _$ j9 |. ]: e9 y/ P: u5 s) k# v9 l
    第二,进行请求的分发0 G. r$ W* \! X. P% Y5 X2 F
    & h0 j# Y$ ^- ~  ]4 T

    7 s) R' }* S) ]; D! g
    * t2 H: A9 p1 u- Z要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    / O6 V: a% `  G, v* s3 u7 S3 o5 h1 X# I$ o( d6 \: t! ]
    ; N: Y6 Y! [' G* ^4 F  H( _
    " `# n7 ~& j6 V6 g
    第三,需要把请求和响应封装成request/response, c! |" N5 _5 g1 u9 E3 A$ l
    + ]9 E2 r8 N1 k( o1 h+ V

    5 l9 |: f6 b- B
    " N  ~+ \) M: ^4 N) l/ K" ?我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    $ a8 I/ {1 v& b% B, N- b
    ' s4 h2 S' ~/ H, ?( W! ?0 K2 o9 V/ l8 A( b; T6 M7 d% A6 G$ \
    话不多说,先来看一眼工程截图。8 d, Y3 O% x, @* P1 n
    1.jpg 5 D; G  P7 P7 d3 R+ C! I
    一、封装请求对象4 c: E7 @! x8 c0 b9 G
    2.jpg
    ( K* f: G9 s& C/ e7 P2 D  e' _: U' l0 |( L

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

    * A$ P; f- G! C! f
    二、封装响应对象
    4 z5 i( ?9 |, l- z0 K 3.jpg
    ! X% D. N( e7 M0 ~
    # ?( @, a, i& U* A# c( e( V7 A- W

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


    * @# ]* l/ o$ }三、Servlet 请求处理基类$ h; i: G" c" c  i% s3 r+ T
    , y+ b9 ^- o% O- b
    4.jpg
    ) K3 O+ m% V9 n5 X2 L3 ~
    $ ~5 j* v/ m% ^/ N$ X1 f
    - {/ x9 Z- F" h+ F+ f# O$ P9 s- X+ U/ ^+ g9 K
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。) Y6 |0 D; L1 ~$ z
    6 z9 n) i1 I2 h7 }$ z
    % V+ g  ~- }4 J, y3 O7 x" n3 @
    5.jpg
    + o2 ?" `/ L' k; }' ~( H1 h' E5 }9 @  g# `& w% X

      s+ b# ]; [+ t# _

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


    ; l# X9 W) M, R% m  \9 s3 x* C1 \五、Servlet 配置 7.jpg % T+ o* Z$ D9 q. |
    6.jpg : z  \( P) ?6 G( ?! ^

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

    8 b2 T3 S4 I' x4 _* S
    六、启动类 10.jpg
    3 R/ a2 C3 ?  s( y( C; ~ 9.jpg
    ( q' U! h$ C. ?' N' g 8.jpg
    # k" d7 b- d3 K$ \* Y3 t

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

    ) \+ \  z; N+ _! T3 y& q& O1 q8 N5 l. B
    七、测试 11.jpg
    7 E* B' Q  j1 J9 d( n
    ' G6 i' w# [( f. Q" C8 d# @  V: K# W; Q) S6 W6 T
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    * Q3 {4 g% A! A, ?' z9 M1 I————————————————8 I6 ~/ \' F+ F
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    " S1 m8 I! [# F7 g/ A原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    : j) W9 b0 h' {" d8 k
    ' E5 T# ^& v$ J/ b6 C. B$ p; s4 _- d; o9 W# v# g: X1 m

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

    10.jpg

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

    9.jpg

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

    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, 2025-8-20 14:12 , Processed in 0.355757 second(s), 53 queries .

    回顶部