QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1390|回复: 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
    # E% {5 j+ R) h
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat1 q) j7 F# C4 z( c/ `' i

    0 S4 z1 p9 F! n" P% Q% W- p目录
    7 H0 o; P; O( q, k' N5 m* h- I) A( j) U* @" F% r% ^! r8 ]
    从零开始写一个迷你版的Tomcat$ d. j; O$ E6 f0 p" r6 a0 P6 `3 R9 Y- u

    $ E, ~! Z% L1 e0 ]第一,提供Socket服务0 G- y2 T. s  C) \5 M
    8 k3 L4 ]# N5 l+ J& n2 Z$ M
    第二,进行请求的分发
    7 m! L7 j  q' Z4 d$ W6 d$ }+ A. P1 P( H' g7 B5 _: V
    第三,需要把请求和响应封装成request/response
    - M+ _, _) l6 r: e: G6 w% j; Q, g9 n5 _3 M
    一、封装请求对象
    ) C. E3 B- X2 F* U, `1 z5 A
    2 A0 u2 @8 ~* m8 G1 v1 E. P二、封装响应对象1 `# R" C" b# d4 w2 J8 J

    4 K: H, g# h5 j6 `三、Servlet 请求处理基类  T, u) x, _$ ?# s

    * N' h. [. f; ^$ M$ ?四、Servlet 实现类0 J8 T7 @' w% e& t& d" i: S9 b7 E
    & N3 m7 S9 ]! I, t# Y3 l1 e
    五、Servlet 配置; n2 I5 I: C" [
    , ^2 l9 \$ J. |: J
    六、启动类
    3 `  B7 o7 [* N& H! l3 _' S$ S# G" U6 {$ d
    七、测试
    * `6 W( K, }7 i& n. z$ b5 K7 J
    0 Q1 I/ Q* M, S7 o# N* l7 CTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    3 e4 n! q  \# e3 g& u* A4 Q9 \8 X4 f0 I4 D
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    0 H" {0 ~/ I6 c" \
    , C+ v, C) C. S: |1 W! }1 F: w8 v5 P* R" l4 a3 F" W  G( m& D

    / ?8 a: O- e3 D3 W从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    : r  R' l3 M9 r. H  E" b- F2 L1 g, W8 |3 `* s4 m6 D4 R. ], T1 T" {# g

    + C  u: \& U0 Y: ^
    4 Q; X6 ]$ q( d/ R/ }& P由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。& r- e2 i! N3 x4 R$ t% A

    * U6 y% J$ r0 u' v6 a/ d# [& H+ M1 P
    2 n) ~7 L! R0 B* J" H* K0 C8 O2 U1 o0 u/ X! n7 w
    第一,提供Socket服务5 M4 Z2 |# G, g; @# D- K

    8 z8 U6 K% v1 x& z1 \5 ?1 R6 S# `  K; |/ V: b) m
    + W) x/ A: p0 j' x, {  F! b7 Z
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    7 ~5 @3 q6 J/ X7 r. l6 w
    7 a* b6 X' h6 s4 K. c8 {! c( @, ]6 \: k7 ?# w- @

    ' |3 v7 l  ~4 D这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?) A1 C5 J$ p4 O. l6 G
    0 A( b0 v4 i* \/ F- }9 N* Y

    1 i2 Z- c" o3 e: ^! j6 S5 k  x+ i1 z! H. p4 v& K9 r' Z, _' R
    第二,进行请求的分发! H% _8 i* }: f8 a: l5 r
    / |. P# O+ o; N, F
    2 j! v8 j" V/ U$ ~
    + p! e0 ^( r1 X) M4 Z+ [
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    " X6 X1 x5 l9 y( P& X# a
    ( z/ i1 o9 M$ h) w3 F. d( [$ h# ]1 o& {6 z& `

    0 J% U4 m" M8 o% g" L3 R" [第三,需要把请求和响应封装成request/response5 b( v- W5 {% X/ g, p7 Q* E
    . P3 F, x3 P1 d3 i7 n
    9 y$ X: f9 h, Z; s- B' I

    4 D0 Z0 y6 x0 E# z+ ~我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!) {' J2 h2 g+ i+ O# f

    . _* L+ _3 f' j% F! w! X% F" s2 A/ P' b- U% X+ Z7 a; W. [
    话不多说,先来看一眼工程截图。
    8 b+ y0 _% f; _ 1.jpg
    " c5 x  O8 q3 b4 y一、封装请求对象
    2 A. }/ J/ b7 N3 @ 2.jpg
    ' L$ V% g2 Y. M* n
    + H* E$ X1 O+ v; }

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


    ; {9 ~* H0 J5 O' |6 a: n: I' _二、封装响应对象! c2 z8 t& j0 q! F: v
    3.jpg
    . s) Y& A/ P: {8 D0 n  [, |2 K" p$ r
    ! Y( A( S& O6 h

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


    - r. |. V, q+ {) I三、Servlet 请求处理基类3 E5 u: n9 z) o7 C/ Y; x2 v5 c
    5 W/ s% O0 X7 f
    4.jpg
    ( a4 p+ r0 Z  @& \8 H; [8 {
    - s9 K/ w' m' W+ X, O& w/ F) q7 X; H9 G, Y
    : q5 b$ }% y, P' M& [3 i
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
      [! C* k0 k) v9 K/ h
    $ A4 V9 g& [7 l. n3 A/ I: }, i
    7 H- H2 u8 x9 P9 A6 ] 5.jpg
    ! @6 E* ?7 `3 Z+ p0 d
    - i4 [8 Q9 K* l7 q3 c$ T* i1 d/ G; i
    ' ?- N' P0 \* q; x$ A

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

    , W  L; u" ~1 Q+ D; E# D
    五、Servlet 配置 7.jpg
    . T8 s2 `3 d& o; X 6.jpg 0 U- e; Z/ l% q# F- t! [  }

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

    4 m: r! v; |! S) P2 Q" T
    六、启动类 10.jpg
    : V( L! _% [8 C/ a, U 9.jpg / ^+ V! M# E* d
    8.jpg " T! P/ \2 R# m  v

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

    9 n, w2 P8 A7 z, U! R) D: t
    七、测试 11.jpg ( s, T) Z% {, K- D! h5 X2 _
    . W/ p7 r/ S; N1 ?* V: f( N# ~7 B* \
    ) {. \; G$ n# d$ t: l" |, a! ~1 F
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。6 @/ a7 ]  S- W0 n+ }
    ————————————————9 Q5 i/ z, g1 ^0 m* t* B
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ; a& y- _9 E& o原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    2 o% J! e0 c. r7 W- w, K- H* n# w+ P/ j6 ?1 z% l1 v" e0 d9 W$ [
    ( g4 A7 ~+ ^% u5 `5 Y5 E

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

    10.jpg

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

    9.jpg

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

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

    回顶部