QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1382|回复: 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
    , q1 E- w) k" X8 m' y) f4 P" a% |
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat( y$ v. L# G4 x% b" X

    1 o% _0 V& H. ]; d& B: v目录4 o9 C+ Z+ o& F( v- [9 T2 B' V3 o
    * b' M. i4 l. m0 n. x
    从零开始写一个迷你版的Tomcat
    9 t& o6 L% ?: _' z0 u" n% {' m8 U& n& j3 B, ?
    第一,提供Socket服务2 P/ o. q# N3 x6 s

    * w0 g0 r. S3 w  z第二,进行请求的分发
    . n5 q7 R$ F( v$ Y' E5 b# |4 y
    + r' R8 A3 T. a' x& M8 ]第三,需要把请求和响应封装成request/response
    ) @5 o* M; ^1 L
    8 a9 \0 a+ i7 K! o) I+ C6 e) U0 W一、封装请求对象
    ( y: C$ \$ T3 }  h+ m
    : t( F! {$ v) E6 d) T  m二、封装响应对象: u+ r% }$ D) T3 _, O: k. ]
    * r' B+ i0 v! K, c7 S7 C% ]9 x
    三、Servlet 请求处理基类
    + ]1 X7 v- {9 u9 K( M# }& M
    7 J" p* G9 _  x3 \# }' F5 s, I四、Servlet 实现类
    ; O) K+ E& }, L4 w/ P1 C
    2 `5 z# a+ `8 p, T. |五、Servlet 配置
    3 c, ]% i+ X' }! g3 u/ \) S" G- D6 e3 i" t- n5 Y2 U& b
    六、启动类
    2 V+ M+ y. w! i  {7 h9 O& O, e' ?# H) C( B. P% F
    七、测试) n8 q; a% u8 j1 C2 @
    * o5 F; t5 ]1 W
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    4 F5 m/ g, O: F, W7 T' U
    / @, F8 O. p. G1 S9 T5 b9 iTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    - Z- l' w2 ?+ L& @- c
    " a0 l1 A) `0 G5 g# T# j* X4 @
    . P* y9 ~- a( _; h8 X0 N( F
    8 q7 l, `/ |! p) r- |从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    7 y+ |5 f, K- w% [) I4 v
    & d7 o' H! B: s) [) P! Q. {5 f  {2 e& u" J, z) u
    4 x' t. F& V. \" B& f
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    ! n0 N$ }6 @2 m
    / k6 P. \* j! b: m# i5 \2 |, r) n
    ( D# ^6 |! P3 k+ N: q6 w; o: K
    第一,提供Socket服务3 h" p2 S% {9 ~  S3 R! r# A

    8 x& e! e; T- ?; [2 ]& a/ B6 w) |9 B1 g

    9 ~, A$ Y" r6 l, @# U9 ]Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    ( b8 G( {. I! F8 P! E) e# s: G% p' s# r  x( F/ l$ t5 O0 v: e

    # \, S) D3 p  T3 D- @0 V
    * }- \9 }+ ~6 R: ]7 @1 U这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    3 T6 j$ p& c, _' c, I, S; s; e6 d6 ?: X1 u" f* }7 I
    * |2 Q) q, @. t) ^- i2 ]; C
    # Z% f$ V7 z# G2 F- d' x
    第二,进行请求的分发
    + x4 Z' X- d1 ?" X/ F# N
    $ J1 e5 D# ]) w# p4 w! q* Z& j9 J/ D' j0 w/ ~$ D- K1 d( b
    " Q8 Z% s. [3 p5 P! k" G3 G! l8 {
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    , n2 s" X9 P; }
    7 i( R4 P& d" M% k# A7 `" |8 t# o- w; j) q0 N/ M6 r
    & v' `$ |4 N' [  L
    第三,需要把请求和响应封装成request/response, ^" a8 \) h* Z4 }& L7 _' v

    ( u# I# L' U: E- q3 [. I, ], B. ~) {7 u1 @$ b) V, o. ^
      n: c; }  |, i
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!! p: t' D1 p, `" C: U: }

    . p2 r# w! f& [- C
    * B# g4 i$ c0 [# ~  S- Y4 [话不多说,先来看一眼工程截图。
    ) u# b" i6 i% e' N9 m, c/ ]$ d8 y 1.jpg 5 I( ?; W3 ^3 k: C$ _2 z$ x, k  M
    一、封装请求对象; U* Y6 d3 O4 g/ o
    2.jpg
    8 }) O0 g5 M5 n1 W# @+ s0 c
    - K4 w6 J5 n. {5 b  |2 }2 N

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

    - Y: `" k5 @8 W- r0 s
    二、封装响应对象! |# ]! k4 C$ O1 o1 Q6 _
    3.jpg
    5 E# N8 A1 n2 l7 H! n7 k5 r; ?: s( U5 y4 M9 Z8 b, ]

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


    / T) A2 S* j. l三、Servlet 请求处理基类
    % n) v2 f/ T  ]; t! N
    : A9 G3 h2 S0 B! a3 U0 l 4.jpg
    : k2 N( c2 Y. T! m$ I, B9 v. b8 W: n% w7 l0 d8 o

    4 D( k0 q4 J2 b: q4 {
    & u5 i' y# ], B# B/ {  {3 z  l前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。; |2 W0 H2 D; b4 q. S
      R- O/ @' m- u3 L) B5 q% u" \" A

    0 L: M/ Q; n, j* M2 W 5.jpg   y; L! t% n- C" M+ `: u* s

    / C  V9 N% ~  \+ c0 t" Z& Y6 J( s9 j0 N# n* A2 ~1 }. n5 {

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

    8 m& D, @; a. ]7 j- q3 v
    五、Servlet 配置 7.jpg
    & a$ z. U! y* s2 D$ a" t 6.jpg
    9 E+ W* E" E; p# M5 \$ r2 I. k6 r% J

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

    & N3 A- m/ n3 S( @0 e, y. K/ a7 J! m" C4 r, y
    六、启动类 10.jpg ) D9 }7 l; A" \$ D
    9.jpg
    2 e, H- S3 H* c# T 8.jpg 9 G- l; o4 G  S3 o' H( P

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

    7 Q; [* u% c" ~: o& t0 H
    七、测试 11.jpg : A* W8 P* i% ~
    8 A+ f% q2 J3 k% |4 e9 z

      }) O9 a3 w" _" }. u实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    ( q+ j( j" u- ]" s4 U————————————————
    - k# h, I- f7 f: h( V; a7 c版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    , g$ Z% m: X8 _+ f  }原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274808 e+ J- X2 ]6 T, W% o2 ^0 U9 s

    9 E2 z' y% D% e+ v, y. c" U% H3 N/ P  ]- r/ S) X

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

    10.jpg

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

    9.jpg

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

    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-8 11:34 , Processed in 0.296232 second(s), 54 queries .

    回顶部