QQ登录

只需要一步,快速开始

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

    7 |# C; B8 D! r+ ?, A从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    8 F$ S, w+ B# B; Z- f1 \' U2 D
    , i/ C$ x: w! }目录
    : X" y; }0 v4 d
    ' G' C2 E9 V( {( Y$ A4 T从零开始写一个迷你版的Tomcat+ D' n% v" B) ]1 O: _( o6 {, y
    7 a) Q8 u- W8 Q7 h+ B
    第一,提供Socket服务8 m! c/ ]1 @: l: g! B

    ) S( ~1 J, C$ V9 B$ c$ S" U4 c第二,进行请求的分发5 w, I1 b' T4 t7 g$ C$ p- Y# W
    ; q' F+ M: s" V, ~, M9 R$ ]
    第三,需要把请求和响应封装成request/response- P2 Z' M2 K# t8 m

    ( ~4 x0 a1 Y; l4 @* @一、封装请求对象& i  i& |- u+ n% f  F
    ' I! K' a! k. F! B
    二、封装响应对象
    9 u& Q) S& i. h% f! @+ O! O" _1 w3 |1 `9 {/ o( Q1 p. V
    三、Servlet 请求处理基类
    4 y, k1 @: w$ d! E# ]3 x* b' v7 Z: m# C3 `8 ^' a, S8 C) S9 i
    四、Servlet 实现类( K0 U3 ?) c. p9 k
    0 `- v6 f% X0 x8 V
    五、Servlet 配置; f" E. E* N4 \& |
    " h( A! {  P# x  q
    六、启动类, O+ W& d0 f$ y- A9 n2 u6 b

    ' c/ v5 L; d! B$ j七、测试
    4 [& M$ A1 {; S! y. U1 i% }1 i7 Y! Z3 f$ B
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ( b$ X1 ]( H# `7 e5 t2 z, U; D, y" f& w3 v* }
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    5 X9 O( s- N  y1 h
    # ]) c- P6 m3 f) W) i8 p& W0 K2 _6 Q1 j% R" q. [4 J

    2 v$ k+ J; D$ o从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。! C! u! u. }7 d9 T- W
    ( \- J8 C# g& ]6 \: ~$ T

    ' D4 R. p/ r  g+ Z% n/ }- d2 m& z1 {6 i# E1 X) y' [' |
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。1 O6 W& x' p8 r* l7 i& }
    " T# t* o* z) a. k  ^9 E3 B' W

    , N% d8 e  N. F# \5 d! z
    6 B7 W, ^, T4 T$ N0 r8 U第一,提供Socket服务
    & r" }9 V! }) k6 [7 o! D( f9 e5 r8 I2 w
    5 R8 L8 [& U3 `8 i& u

    0 V/ Y+ v! d& j$ d! U% H" A( J3 gTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!! ?9 x- B" g8 p2 ~' W* \

    0 G# ]! ~6 N! S+ g
    , Y& f, O1 j$ V
    / X1 a/ b+ e% G) p3 @这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?8 u+ w  @1 O* K$ y- x# Y0 d
    * V, i. D4 b; J% ~/ T; y
    5 |. A; N* j- V+ D7 ]

    % h) U' l6 Z% p第二,进行请求的分发
    0 k# G0 d, Y  K& u) T' {; g% ]7 U. B( n0 v6 T

    9 |- Q+ o5 P/ F6 q$ n6 M
    $ i. K5 Z8 w. P* b7 j. e; ?要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    ; h3 i6 C/ m1 W0 R$ i
    , ]- u/ Z5 |7 r+ Z" T' d5 D
    : o4 q# Z; @2 N; O# j3 ?
    + R" R5 W$ m+ |# n. P第三,需要把请求和响应封装成request/response
    + U+ m$ Y9 w' ~5 Y8 A2 y6 [8 V) F2 }) U. l7 I  |0 p
    : X# `! U% v# M9 @& X9 Q

    & \( T) s  N) o; E+ Z" C9 h2 w2 N我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!& v$ M% r" N* m) H1 c1 S+ y

    / s/ l: M- X+ @- V; S9 r& h$ p* E- Y) ~. e1 f0 d
    话不多说,先来看一眼工程截图。
    , ^) c$ ?3 U2 c/ N 1.jpg & D  q! k6 B% @/ j0 U) T( y( L: a
    一、封装请求对象2 z+ V' G# l' x( ], F" n
    2.jpg * G! y% {% ~, y' G/ p/ q& `4 S
    # I) A' i! ~5 X! a) d

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


    5 V; @2 _+ k4 l9 D( i5 v二、封装响应对象% w5 U% ]7 O! A, x$ l
    3.jpg
    ' g) r# x2 H  D
    . Q( z* Z+ J+ ]7 X9 ^% D8 u

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

    1 H  L* x, u* e: I- l; F
    三、Servlet 请求处理基类+ @, u$ i0 C( u) j0 A; H

    ! [: E( s3 \. ^ 4.jpg / O3 k3 j0 I7 Z. j8 L
    , o6 C1 d' ]/ F3 `) e3 n
    ; y1 _% g  e" O. L! p; }
    3 D  o+ G: {' l9 v3 J: ~5 t
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。7 B# `1 S6 i1 |5 h& O8 L

    8 E4 \) o) E: F! v. B% r  g. {9 A  q$ Z  r6 r
    5.jpg
    # Y* N( i) y, M  {& O; R' v0 |4 ~- Y# d6 M8 F, U

    ; Q/ M- O' W; ~/ d( E

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


    . r2 O% X# x. \3 n4 ]五、Servlet 配置 7.jpg 7 A% R, `+ }/ [0 N  F/ z
    6.jpg
    2 q2 ]5 l) \; J

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


    9 q! u( e. ^1 j# T7 R# R六、启动类 10.jpg 6 h( ]6 {8 L3 A6 U* a  o$ r
    9.jpg
    ! R1 x2 f* P& r9 b 8.jpg
    $ V- F2 z. f0 ~

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


    $ e# N) a  C1 m七、测试 11.jpg $ q6 z  x, W+ d+ T

      X5 ]% N$ q$ B# p5 [' W! O4 j: R1 s' h4 j( s
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    2 R( z6 B; f# O1 u# P————————————————! j  R& W5 p2 ]2 W, o4 v- O, U% k7 V# b
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。" f9 m- n" ?$ k- e
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    , T& Y6 y, U( n  Q3 }4 _2 J: M' q% X- q6 A! i0 N$ d
    5 N, J2 D; M2 S, L' u1 c; n7 q1 N

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

    10.jpg

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

    9.jpg

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

    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-9 10:24 , Processed in 0.485607 second(s), 53 queries .

    回顶部