QQ登录

只需要一步,快速开始

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

    : Q, g* V# N* y2 _# L7 U从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat( E6 H& Z3 p2 e3 U2 ?) a% E
    ; \1 z2 c* T4 T! L+ K- W4 Q
    目录2 O0 k% L$ b# L% y1 {& x3 r8 g, f) b( o
    0 I9 p7 D: |( e) x+ A
    从零开始写一个迷你版的Tomcat
    % r, T9 y' n0 y3 V; m" y# C( H* j" [) u
    第一,提供Socket服务+ O/ D" R& F4 q9 _. h
    . g3 s7 n7 m  K( `8 m/ @4 A
    第二,进行请求的分发
    5 l& T! V1 ^/ ^
    1 A3 W: V1 n  x! Y' _1 M0 @# i1 y第三,需要把请求和响应封装成request/response; i4 n; W+ o& ]& {1 c" Q" C4 B
    % i7 D, T& Z& e3 v
    一、封装请求对象* W/ y1 N9 R! W
    7 W1 a2 B! |7 Q+ F+ Z) m3 N# G/ A" }. ^
    二、封装响应对象5 n# S/ x! x) Z, |+ c! n

    ( Z6 \$ U# P( o9 A& n三、Servlet 请求处理基类
    4 @7 M, O4 u3 \1 x
    6 U2 n9 ^: I0 o% H四、Servlet 实现类8 ]0 e$ |4 V9 e2 T% c

    ' W0 X: j7 H6 v' e五、Servlet 配置; k0 V9 S- K! k
    9 M# M$ l2 a9 C6 Q9 r! o( k5 S
    六、启动类# N  Q/ {2 p: X- _0 e

    8 n! f! g! Z% Q0 i七、测试
    2 `8 \( B+ ~% Z; G6 z+ e+ K# j
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    1 I! R# w2 b5 ]8 M0 X( y8 T4 \  k: r- @& g. L* u
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?1 f. E! j+ G6 b# Y7 W4 U

    : q, x* j, \; M; V
    % }# ^$ h8 P! [4 n& c% U  G/ Y: L/ k8 a3 n6 h% s( j6 b! R3 w+ k' n
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。* d4 N3 |' s- P' y* [1 n
    2 W+ W' m/ N$ [' X  a8 P. Q7 T5 `# E

    4 a' ]8 c( A1 @% m! @' e+ o8 l' O! T% G% D) V* \! A; H
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。1 r; w6 l& [& u5 ]) y" x

    7 J8 ?+ w% r" o! h/ L6 Y. i+ q
      X5 e, `, Z$ `% o8 Z
    ! ?- n* _% O! T9 l" X' h! ^' b" ]% J' L第一,提供Socket服务
    ' ?) U: x3 H  Y+ k1 J, ]5 O6 t/ R! Y! ~- _

    6 n6 E: @  E! V3 I9 K0 k1 }* J& ~- S* V+ U
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!. T& i4 @8 a6 q% I1 f: Y& @" p

      R9 B* l4 v4 C/ S. J& X" H! M, o7 d  o# N6 e$ k

    : n( K+ ]  ^6 R- |; x这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    1 C8 Q8 j2 _1 h0 V) ~0 W2 n& T  X
    ) p& P6 n! ~; C; u. A; e2 q
    8 B0 \% k: M+ N7 h2 l) T! T& t/ N  E3 t/ R" ~
    第二,进行请求的分发
    * `. z' Y+ y/ T- I! o* D2 M5 ^0 Y- l) u4 k6 a& |
    - s7 U6 \: o$ j; U# `  U

    7 G  ^0 ]4 u3 h4 J4 f; {要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
      D. v( ~6 e* ?% O! E! Y
    0 t! K: j) H+ e/ P$ F
    2 q& p" g9 X3 U" m% X* L+ @, z7 |
    第三,需要把请求和响应封装成request/response0 N2 v& b; u7 T  H5 L( V- Y5 {7 H3 G
    ) r5 P) G( m# a2 U- E' R! y

    ( J( C" Z: ~2 q, x+ v8 Z0 ]. ?4 C7 y; I( K
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!4 D; ]* D4 f( y# j7 `0 ^

    4 O0 b- I5 g8 N! T/ _3 C: T" c2 ~" a2 W4 U
    话不多说,先来看一眼工程截图。8 K" \# Q' q9 x" a
    1.jpg 7 i, P5 ]0 J& e% i0 ^
    一、封装请求对象& M, f5 k6 b8 l6 m/ \" T
    2.jpg 0 @$ u- F# X& V* U! r# j! A$ f

    ( @: ?. R/ U0 J( d. N

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


    / _% B% A, y& L9 q: _二、封装响应对象3 y  V3 C$ t! s" K! d
    3.jpg
    8 @* e" s" D4 _1 W5 k
    1 f7 n0 y- T( U- }8 p

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


    / ^7 q1 A) y) A9 F" o$ b三、Servlet 请求处理基类
    ) i8 e0 J" Z; V. N- O  M: ~" ~& ?$ ^, Z- q2 t
    4.jpg
      W' z% _# A$ r1 x/ R
    . I. @( z! B1 Q2 p+ c6 b' r) e4 e3 L0 S" r6 E
    9 k( X& r2 q5 w5 p! K  n! j
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。4 ]& k" p  v  q0 y
    8 ~9 a: u! J- ?9 b$ _4 O1 @0 U0 Y

      x5 J8 ?5 s6 A7 `% ]' O, W 5.jpg , l% E/ s+ z4 j; E# S6 g

    4 ?* I" m" `% \2 Q& H. A, O; Y. `* J8 o6 H

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


    + j2 [: H# ?3 K4 \: H五、Servlet 配置 7.jpg
    6 X) ~- L2 L( U( {0 x9 J: }% o; h 6.jpg
    + I2 w# o9 y3 o- n3 [- ]& i

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

    8 O9 `  b; @. v0 I; g
    六、启动类 10.jpg
    5 g9 P  u8 ~4 w# n 9.jpg 6 n- m  z/ c. _
    8.jpg 0 p4 r7 I" T3 E7 A

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

    - ^! \$ m% n  h7 s5 f
    七、测试 11.jpg 8 y& a/ D8 @" h4 r6 |& C& H2 e
    : L" ^1 e1 x0 K
    $ l# ]: J2 v- D  C$ O7 c) j
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。& c# A6 u5 ]  D
    ————————————————
    ! n/ N" L* |4 @  ]- K/ R2 U* [版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。. d4 q; m' }( `7 W, O0 M$ H% _9 c$ S
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    % s! d  Z4 n$ _  N+ u* h( T4 N: \0 Q- B! B7 g
    9 {6 v/ J; ~5 Z* o

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

    10.jpg

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

    9.jpg

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

    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-6-10 00:20 , Processed in 0.437867 second(s), 53 queries .

    回顶部