QQ登录

只需要一步,快速开始

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

    6 _3 o; s9 ^* ~2 [/ n7 J& `从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    - h7 _5 x5 {( d/ |
    $ s4 C, ?0 F$ M# V8 C$ {$ h目录0 q2 \) Z7 x) Z  V" i. B
    9 v3 C4 O  J6 p3 T# j
    从零开始写一个迷你版的Tomcat
    8 M3 m" M2 [; ?( b4 g) t: d1 J) t) y
    / J! i  C/ v4 x* }3 w第一,提供Socket服务
    $ s1 J/ P5 C: r- c. l1 k* X0 S8 F, o: J% ^$ J2 x; o% \
    第二,进行请求的分发6 \0 N5 A8 N, t& |
    % p, @$ g) \* M: B6 V, z7 ]/ E
    第三,需要把请求和响应封装成request/response
    # t, L) e  R% q4 z8 {2 Q7 \
    6 F- U7 ?/ {4 _. Z' g+ [一、封装请求对象
    + {; [7 g5 ~' d. M( t
    " S- y: n- T3 ?6 H! v2 e' e+ R二、封装响应对象3 a6 C3 [9 e2 c* @

    - J& F! H# S; d* A  a( t三、Servlet 请求处理基类
    , P3 y% Z6 |4 ]7 \" |9 A% l" f" |
    2 H3 g. x* W. u# C- N) k+ ^5 o四、Servlet 实现类
    # v1 r: Y, @$ I4 I' c2 F
    2 W0 F' v! P2 b  W# i五、Servlet 配置
    ) [5 c/ y2 W9 p2 h$ e
    3 h9 k7 C: X# A5 D  s: p六、启动类
      b( j; Y; x. ]/ @# B4 H- ?) j/ G% n+ H5 z! R+ k( k  _
    七、测试1 e1 s. ]+ Z1 e5 ?; X

    % W+ ?) Q" @2 a" |0 ETomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ! d0 W2 t% Y& I+ o9 i, s5 s; W: ?9 E
    / M! ?" q- Z( o* D, eTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    1 `/ m& {% F& y$ u% U7 q' B% i  h9 O/ D! P; a0 H* \, A
    ( s2 Q0 w$ t6 a, s& F" h$ h. d

    1 K3 I* h8 J  _! {, m# m7 E从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    5 P0 v1 q2 {6 o
    / Z. K! j" T. E4 K- {8 V. ~# r/ J1 S  c
    . |$ E  [0 b( Q4 C! B$ e: {
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。0 X* L% `2 V2 j, ^! H8 ]
    4 j" y, [9 \" y( M

    9 [' L; {6 G/ N1 h+ X+ z
      f$ P) A4 T7 q7 A; p* |第一,提供Socket服务
    5 c2 ?3 t/ l; M. a/ _, A7 n' A  t9 @0 j1 g- H* `2 G; E

    % H: v) o+ _& L+ z" N, A7 a& i& b5 N
    0 _9 A  Z( T+ c4 P( JTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    ' Y- G- O/ V3 s) m6 y' p2 a; F( z- h6 K5 G# ], h' E% B8 y8 }

    0 z2 Y8 D, |, S8 \5 M# m) ^$ w: r" k6 x) Z1 ]8 ^. n
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    # U/ h1 i7 ?, O4 G6 W
    # n: Q6 V  r7 y7 d9 N. a4 Y9 @4 x2 v
    ; G6 x- X% _6 B& W. ^! {
    第二,进行请求的分发0 e0 I$ q  E7 X- U/ E
    , n$ ?8 w: k- S) F

    # M3 m5 y6 D- w" W8 q/ m
    ) s# f4 s$ G. p要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    ( N6 u+ U  t3 m5 |9 G8 h# l- g# i8 O
    4 g9 j) p8 _$ Z
    ( A; w, B  e: |0 S
    第三,需要把请求和响应封装成request/response
    5 T  m2 G* M' F  y2 u" X. ?1 P( t  @  V9 V2 ]
    5 ?; E8 P4 o3 w+ a1 u, p. d
    2 y. E# Q0 _; l0 N0 L0 Q9 Q$ e* _* y- \) J
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!6 I6 y! J* {9 h# q: C& Q6 E
    : P) ]- D7 z) a" T. n4 q1 T7 Z

    " p* U0 Q6 l5 e, s! Q! m5 x话不多说,先来看一眼工程截图。: \; _" [. D& H# y
    1.jpg ! L* x7 W  g3 [* C
    一、封装请求对象: |; f* K% Z7 h" @
    2.jpg
    4 t3 A$ g, M/ l- j' L0 E; V) ?+ }4 j  f

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


    # L' ]" D5 A; c" U- i; }; J2 x% e二、封装响应对象
    & }; j0 U3 v0 \9 `5 D& T' i 3.jpg
    / [% y5 }* m% {9 i) q; o
    2 y# g$ w) I  B9 e9 w2 b% Y2 V/ b

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

    1 P6 R9 d; D( z$ R! T: r. }! n$ s
    三、Servlet 请求处理基类6 U9 J  [) ?) ?( m0 n

    % |$ _9 c7 @9 p0 Q) U 4.jpg
    % L. b# C0 A) {9 H0 C8 a( H: ]! I4 A- N% }, T

    # L' R4 Q" ~$ K* Q8 ^3 k4 t# U$ O" g& m# d5 L+ ~! w/ V
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。$ M- S% c+ P8 C: ^
    - G( q% H' a* E4 \  W5 K6 R
    9 f1 e0 ~% c) {) s% Q# j# k0 ~$ S5 O* _
    5.jpg
    . b" Z: C( E0 Y# c3 @% u6 c5 ]
    ( C' p9 a0 y! G+ q
    0 d3 H% T8 M: R6 f+ i. L3 k

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


    3 r" `8 W4 y; I9 V8 V4 t) c五、Servlet 配置 7.jpg
    / g$ A- \; u9 Z1 _9 a! e( U: I 6.jpg
    $ \" W+ f' n. f4 [1 T

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


    5 Z' Y/ ?% [# Y; \2 m% `六、启动类 10.jpg + W8 @: F4 X: M/ p( N5 |! P9 j) Q8 o
    9.jpg
    , G* l  X: ^3 O  d6 ^# B4 p 8.jpg
    2 T3 @3 w5 ?! t% I8 o

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

    * D, m  h4 d/ K4 ~* l$ b
    七、测试 11.jpg " p0 h% K( ^0 ~: d  ~5 ]5 I

    % m  w* Z, p( ~9 M- r* S7 g3 s5 r, o% Z. y) u7 m
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。- F& P* F# w& E5 W
    ————————————————
    6 q- v) T$ v2 G, N0 b4 O* m版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    5 u; M( v* b4 x' Q7 Y原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480. ?+ m8 ]: f5 [1 w0 M
    " j# }# a' I; @5 _6 \5 f; W! u
    . m- k3 ^* d+ N8 w

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

    10.jpg

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

    9.jpg

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

    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-13 05:02 , Processed in 0.445412 second(s), 54 queries .

    回顶部