QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1332|回复: 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
    ( A1 E9 D& U% C8 P* A
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    ) ~5 X/ _! f+ y: c- _0 f9 U
    ( y: M2 Z$ [  B  Q& q" I目录
    4 d. {7 E' C; T2 p/ T: a) G9 U3 V( L* n
    从零开始写一个迷你版的Tomcat' ]# Z6 e0 |) [  C. P
    , O3 y* {. O% A8 r" ?6 y
    第一,提供Socket服务
    4 g! k! e+ Y6 ]9 y$ c
    8 |6 n. P' N+ `$ L9 E) k8 O第二,进行请求的分发6 o) g5 c5 B! Y- a- f2 H+ n5 ?
    8 Y! w! K  P; B$ j7 ?
    第三,需要把请求和响应封装成request/response, C- \' I6 q2 o3 M$ ?. I9 z2 t

    5 r, X9 T* N! o: I4 _+ @# I/ ^一、封装请求对象" I$ T& m9 ~. ?1 n0 c% `8 C8 R
    6 t5 y* }% Z9 Z! ]/ G. E& g
    二、封装响应对象  _* }  u' Y0 i( R4 ?4 ]

    ( H7 y7 e* l4 @: J: w三、Servlet 请求处理基类
    8 X2 F7 W( H  K( A3 M# a, S/ k0 H7 |  X
    四、Servlet 实现类( z  o: F5 O* C) o( J

    + C# g' n9 q0 U: s2 U" S1 I- v五、Servlet 配置; t# S8 c9 d/ m' E, g" a0 w: O- M

    ; H: Q9 y) z1 r$ S7 o六、启动类9 h. D3 o& k. \! _

    8 U  M  X" V/ ^1 d七、测试
    9 b. @* H, T( @3 t, D, B) v* t' h1 D: X6 R4 ]& K- g( H
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    - b- [& T( u- ?# o1 _# }; `( J; y# e. o9 S9 j
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    + P6 L8 G8 Q1 C* s2 X
    ) @& x! C6 J7 y5 Y
    3 `, b' ~5 Z$ m; `
    7 ?  i* d% B/ o0 f! L4 M! b从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    $ _( r. `% F& c7 `0 j, N/ v6 |: O  A; i  j% S

    2 x; |" e. g, t
    1 p* T. z2 c6 O% x# e. N/ W  ^由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。# y! P6 j+ B6 n% O+ Y# E

    $ E1 A1 V. `  U- ~' B
    . h: F4 p2 p, m" H
    ; i- c" [; b  f' q3 }+ l  F" X9 b第一,提供Socket服务
    6 j" a. s1 ]2 N+ _! a+ t7 w* s: h. Z1 P- v$ |" s+ D
    , R8 S! t& a/ ?
    : a+ Q: i6 [. e
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!7 X* Y/ G7 l! m) l, z& ~" Q- d2 v

    2 E+ ?; |) ~. a' |7 I8 o9 |! B; B) {  {3 J1 W# |/ X

    5 h, M  P/ S3 x7 g" k这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    2 g" u* Y. O  c  c% d2 q" n( ]2 P
    4 s3 P  ^: D8 {9 A: d+ E7 Q
    & E" E+ q3 }, c3 I( G
    " ]) N6 ?" _( ?! S0 [8 X5 ^  Y第二,进行请求的分发
    + v; }- v. ^3 ^3 o0 f- r5 K' E" A: [8 G
    9 v0 c  h: [2 u5 _$ y% F1 f* U

    8 g, A: x8 P" _8 `* t0 D: I( a! j6 }要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    ! n4 Y7 _' m( m7 C+ D% A
    / E, D! I4 i' s$ ~
    9 d0 G  Z# N  B. p. M
    + z' L" ?- L" U第三,需要把请求和响应封装成request/response
    ; S6 I5 f+ c& }6 V' Z+ d1 b8 I: c9 H8 K4 e# b3 B

    5 A" k9 h4 {5 Y  g# f4 @! P7 I/ g% F; s' A3 p
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!3 t1 u% s2 g2 H/ ]  x7 L
    : f# ]1 ]' ^* @5 N
    . J8 Y9 ?; q' h1 L
    话不多说,先来看一眼工程截图。
    ( K. M- f+ j$ u 1.jpg
    5 {$ V% m3 N8 W$ I一、封装请求对象: p2 ~4 A4 G9 N9 s, o/ ]
    2.jpg
    , U- p7 f5 D% o$ c2 e
    ! h- Q- n7 \5 E# k  \

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

    + r  D4 `1 Y, o8 M: D
    二、封装响应对象) ?) D- E1 u! W1 n
    3.jpg
    9 m- e9 ~- Y  y. Q" {
    : a- Q& [  r; [0 e6 J! ]

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

    % @6 k, B; s) g
    三、Servlet 请求处理基类6 g- S) D; n( W# k) S

    " b0 W! p, \, H/ [' B# \ 4.jpg
    ( D! {# m% v$ D( b& c$ l9 Q& T3 }" D2 H- h$ z  v
    7 }; F) L# h2 b6 ?9 S; F
    3 i& P- Q2 v6 Q2 |4 }/ [
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    " X) ]3 l& k2 S5 n7 a) ~/ h
    9 q) x7 E' ?) k2 }, z) U" j+ G5 x  q) V# h1 {! Y( Z. n
    5.jpg 3 R! ~* L" w& E, I+ {

    / Z, Y6 P; X5 ?% H7 _$ J0 w* {# I9 P5 T

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

    ; T. c& o. H& D( ^2 D. m  o. ?% X
    五、Servlet 配置 7.jpg 4 m0 E7 I: [8 R1 v
    6.jpg ; x2 R5 r2 j$ m" k  d; o6 z

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


    6 i9 a0 [7 c. _4 I. ]六、启动类 10.jpg
    / I0 V% K$ z- [ 9.jpg 3 U' D" z3 C4 L8 E1 Z( r# F
    8.jpg
    & u6 e3 k- P% s7 t" }

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


    ( w" d" m* E6 v" y# O4 K: N$ |+ j七、测试 11.jpg
    + T, b  T: N1 N6 L0 ]' c! S0 E
    8 m  d5 K8 p+ s2 k
    2 }( N, J8 Q6 M, n' B( N4 v$ q8 B实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。+ I9 ?4 v+ z6 I
    ————————————————3 }  n) z* m9 N" {
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & g; r! g7 E7 S. s原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    / Y2 G4 [4 K0 [4 e; X/ c+ R; V* o2 w: V8 I4 v
    : H2 e) \9 _5 _/ G; ~

    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 07:37 , Processed in 0.615720 second(s), 54 queries .

    回顶部