QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1334|回复: 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/ X( X" d. B) K- \% P" ~
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat7 N! {6 B6 {! r) z1 \  \$ r1 o* ~  t$ v

    " x6 c5 ~% y  V7 I目录
    + D. R+ B3 ?% r: k) o+ c9 z' A7 \+ b6 E, l: t8 s4 ]4 m+ E1 g/ ]% X, C
    从零开始写一个迷你版的Tomcat
    ) R  N8 `  S5 |) f9 {7 e& G
    , @' r  u9 ?) o2 j+ y- U8 J$ D第一,提供Socket服务# G! B: x) S! D6 `4 o4 e
    2 A. y4 w1 t9 ?  z+ `7 L- n' ?
    第二,进行请求的分发
    ( H5 v- H/ P, o
    ) f7 A2 R# q& B& l& i第三,需要把请求和响应封装成request/response, q- h: r, [2 Z9 D7 Q* C

    $ }" R7 n  x' U9 C一、封装请求对象
    5 p0 O; }9 R5 ~
    " i6 ]! Q2 \  u& O- X5 k, N! f- f二、封装响应对象
    + E6 h2 a2 u4 h+ E/ k& T
    6 C4 X9 D6 b2 X( ]三、Servlet 请求处理基类
    & l& y8 d. {* Y0 L( z; U) i
    6 t* ]& b4 w: \5 K2 c四、Servlet 实现类4 x" ^& T/ ~0 K- T& `. e, }1 V9 N

    6 ~, u' ]0 w2 E4 Z1 P五、Servlet 配置
    ! r! i& S$ [% {3 o; Z7 g3 d8 t) e' r6 {+ }% S
    六、启动类
    8 X! o; O+ s5 q: W4 M' x9 }- B% Q$ S" r4 ]- Q) p3 i
    七、测试
    . Y# _: s  [+ k0 b4 A- S& I- N0 ?/ o% ^' _: ]3 p3 R( k8 V
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!9 c  X; J! ]& q2 `

    . z: E( b4 K: u( WTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    2 m+ r; T, ?# d
    3 |. c1 ^, Y& T
    ! B  Q0 t! q; V% w/ [$ i' a$ Y7 Z' R
    ) E6 Q; X# U9 E4 f' E从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。/ s4 g0 v$ R+ n: D. Q! b) a6 R
    " e; }& T) m- g& _& Y

    4 \& R5 l. X; k0 ]! G6 y7 Z
    # \/ d! s" o; W% v) k$ \由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    9 p# h% c$ d/ z1 ^
    & r% g* u$ H6 J: c2 z" {5 O* Q
    ; K0 ^% ~/ ], {7 f$ q- _% k
    ! @$ ^" K" {, V+ Q4 e+ r$ f2 n第一,提供Socket服务
    ; p& S( r8 g# P; U5 v3 v% n% w* F
      F# D, ?. X/ ^$ o* Y: E

    0 I1 n! g4 Z# ^+ ]0 S! I) c% uTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!. S1 J7 V( n! J4 a* S
    . y+ z3 H0 A9 M, J1 Z
    # o: ?0 w9 I% }% s  L

    & K7 v) m+ g' ?: b  I  f; @这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    2 \# t& t! K  ]- L0 u& W! k; ]7 }0 v- e0 G. x. Q+ K

    ' Q* H0 L% o' U, G
    - p( [' F: B; |% v第二,进行请求的分发! M3 Y( ^# Y6 @/ ^0 F- D/ b, t
    . t8 e9 o; i$ h2 _
    $ }* E, s8 o7 `. i

    5 E: h# O3 X4 x9 U% P要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    8 ]6 D8 e2 ^8 `; e; m" |: ~0 u  J( I; I* m! F" v

    & t5 u, O! `% ^- {" k
    , Z+ m0 @0 Q2 Z" V4 D8 F' O第三,需要把请求和响应封装成request/response) s9 }! b! ?* @+ ]) ~; [( {! T

    ! `4 g& K* B% V0 ~& l
    # e5 C9 Q/ h, k- H* N% J
    # L. r1 _  z; t: S& ?5 L我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!- T' v* c/ m0 ]! H

    7 t6 J( T; ~5 D3 d2 s) B) Z7 X/ x; X
    话不多说,先来看一眼工程截图。" m/ G/ m+ C+ F+ Z+ b* A
    1.jpg
    * x! ?4 C9 V( ]3 ^' v0 r一、封装请求对象7 H8 j. m" M9 P- b! \* {
    2.jpg ; j( u' ~* O: s
    * t4 U2 j( h4 S# ]8 t

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

    ! Q' E) p# w) R* l7 |
    二、封装响应对象  F; G; ]6 A( R" B
    3.jpg
    ; y$ y5 @: N* @7 p# a- G# v
    1 k& n; [/ d, l2 ]: g( q: R9 r+ r

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


    , F5 c8 k8 o' i# k三、Servlet 请求处理基类
    & m: K: b; ]  D/ N0 A- e0 R1 @% G* ~6 g
    4.jpg ( o# b; p+ d: h' G7 Y

      M" y, l# U" Z7 V! q% w! l, F, |# A  y

    - x2 [# F" Y" n% l. `前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    0 _* `; [& P; [  e
    $ p5 M2 g  j6 c( x  z. H/ M
    * B" V+ X# Y( _% B4 G4 K& K+ M 5.jpg & I2 J6 K$ ?# b2 D+ {5 _2 V- {& h
    % f# c1 G( [- B) ^; I

    6 y; g% q, i+ A% n& O+ ~

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


    $ J! ]2 z$ c# L8 K" h3 j0 Z! r五、Servlet 配置 7.jpg # s) L' h, E7 y
    6.jpg
    . c% b! J0 c& i. d# }/ o" l

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


    1 t4 g) m. }' H  ]3 y- f! t# g六、启动类 10.jpg 3 Z; a+ |- W5 S0 ]7 m6 H( }
    9.jpg
    ) ~. i4 C" `' [$ D 8.jpg / J! C9 u$ f" Y

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

    : {( H9 i9 U  ~! ~* U6 [$ c+ n5 J
    七、测试 11.jpg
    & L7 E# w- h6 c
    ( H1 J' Z# ?( y/ w: H, J% Q+ q5 q- W+ D8 Y- n, X( C
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    % [- M; [, q2 o9 y4 P————————————————6 l. v$ @$ a- u. b; Q2 D" b
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : q; F) L$ c# a7 s$ }原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274802 s$ b3 P) C2 g' P& ]

    6 y& o6 u2 Y( k0 m' o7 w9 _! W/ b2 n/ d$ A' }. Y

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

    10.jpg

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

    9.jpg

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

    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-4-21 18:49 , Processed in 0.426750 second(s), 54 queries .

    回顶部