QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1383|回复: 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
    / J! F% m. r; U- _0 i8 M! `1 Q
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat  w. K, m* K% a+ k. [
    , @- V3 E( c( A$ M
    目录2 N: o. y/ P" V" G
    3 o! X' y0 Y7 y; M" W& C" t# ]7 ~* d. L
    从零开始写一个迷你版的Tomcat
    ! O& C9 i" M$ e6 Z- Q) ~3 A
    / j0 ^( O  _# D5 A$ S1 |第一,提供Socket服务% H) l( m0 W$ _# o. i" y3 v
    6 S3 c- o3 I  K  {4 x2 d& w' b# d3 d
    第二,进行请求的分发
    / c2 H, k# H7 g9 z& ]; h% E  t, d! ]% p; {' M9 H6 c
    第三,需要把请求和响应封装成request/response
    ' ^& {/ ~+ E% B! j& g5 `- t. w' G8 u
    一、封装请求对象# B- S( ?) v! A* L
    3 U7 j4 q  Y6 M! P0 m
    二、封装响应对象
    1 j' a4 p9 P6 m
    1 e, M2 {8 W4 M1 N- L0 I三、Servlet 请求处理基类% q% X* Z9 }" Z2 Y
    . D6 q& }& G0 |8 R' z
    四、Servlet 实现类
    : b4 b7 I6 B) l9 D0 M+ h1 E* i* R. Q3 C% ^) o1 h  W. F5 Q, ?+ y
    五、Servlet 配置/ j$ R: B5 ]6 g" b& C
    8 c. b, A! w0 b
    六、启动类9 R' K1 A) m, ?2 f
    : c, C$ B( L! n6 x) u( c' H! O, q
    七、测试; b. ~. n9 b0 L
    ' R$ S& W* }! m" W  g
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!9 r% u- l5 j$ p' o% C; u
    7 r$ {/ v0 X  ]( o7 e  ?9 I
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?, i! m% x( \$ j% V+ ~5 J$ ~9 Q/ I
    5 U. ^- n; a2 E% D) o+ p
    $ Y3 ]& p6 _1 w  \3 ~' d' ]; Q

    - I, j6 L  R7 M- |7 v  o' J从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    ; r; x9 j" z5 F3 [: ~: ^3 b  P0 H' Z! ^6 L& e) }

    : ?: }$ ?# X) `# F* O) y  A% f/ T4 N9 {
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。/ R8 ^  n; Q5 S% _  P) ^
    8 H% E1 E1 x$ Y6 x2 D

    9 W) e2 X" ]  y5 m6 s( j- l7 u2 j' v$ l  D( a9 R7 |
    第一,提供Socket服务& z& z" I. i8 w! `4 _3 \2 v0 a
      C* S6 v# v8 `

    * U, q2 U3 ?; g& R3 \2 a2 K& v8 K( E( Q4 b7 w
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!6 R1 v: T9 v* A8 c8 B6 K+ ]4 s9 i

    * {! d' W9 W2 F; U$ u: C- O4 y( P9 t6 [6 A/ c8 j
    5 D, w- q& w2 `& X7 }9 l( j
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?* Y' C7 i# C* Y! {" R
    0 \" W$ D9 q3 z# I3 _9 w, ?/ k1 y
    5 z, v8 P7 k" m3 E, a' w

    / U5 |" r* g2 A# [4 f% \第二,进行请求的分发
    8 k/ `! X% q0 ?5 u/ p# e+ l
    - w* @  L9 Z$ a! X( e* \
    " ~1 z7 O6 |* ]6 R$ Q
    5 v  \/ I! `5 N要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    1 v1 Y! Q: _$ @  F
    ! k' }' S! k0 K$ e
    8 z1 h! s2 M: {1 G0 l- a* _0 ~8 p8 @. [$ S# O( [
    第三,需要把请求和响应封装成request/response
    0 U: H2 N8 N2 g3 }8 }8 x0 t" c9 G0 R1 c( N4 ]

    " J6 s$ H8 [/ n3 U0 E1 E
    % u0 k% V2 m3 Y- Y* y; n. p3 a我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!/ K* H" ]( u  \9 m8 n3 Y5 i

    9 P9 D5 A, C4 \9 y4 a6 D, r, E' ]7 p/ l  ]
    话不多说,先来看一眼工程截图。) r9 s4 z- F1 B! D& p
    1.jpg
    ( U( J0 ~8 Y% B: r一、封装请求对象1 U9 R# `' O/ |' t8 d
    2.jpg / o' T- A) K! [( {" C; `$ j) l

    $ l1 m5 x- |0 `5 V. z1 \. y# q) p

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

    # S: j+ Q3 ^" d" N
    二、封装响应对象9 N1 |6 [* O$ |
    3.jpg & _4 u" K$ d8 ~+ m
    ' T4 G# n0 t+ S% _9 [$ g) `+ K

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

    4 b1 [- s' s* H# n% f+ z
    三、Servlet 请求处理基类
    " e3 e- j" i: W+ |# |# n9 L/ U: Z0 G0 J$ T; |5 `2 e! [
    4.jpg 4 |( H: _. S& `0 {/ m
    6 H( {& t1 H* P
    6 w6 y  H" Y8 @% `( P6 D

      B6 g  m! e0 W" b前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。* b3 S1 M$ w" D

    & R7 d; w& |' l3 o) N( ^1 h1 Q/ ]
    - C6 Z9 }$ @! w$ t; ~ 5.jpg
    . U/ V) m* w  [# I# q; b) U2 f
    * ~6 g9 P7 g# j' e
    6 m0 @% V, Z# `- e1 m# z

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

    2 Q) v+ f! x5 w9 u' Y
    五、Servlet 配置 7.jpg   {, G& ]8 L. V5 g3 Y0 n, ]
    6.jpg
    ) c8 t2 l0 j9 y! z

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

    $ R$ k! m2 N" X1 o9 q* R" c
    六、启动类 10.jpg % Z" T) b! o7 M0 p
    9.jpg ' y; g+ g/ e( e3 Z
    8.jpg
    # H) e2 Z/ E0 y6 X

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

    , `6 @/ c- t2 M( J" W! a; c& D
    七、测试 11.jpg 1 T' ~, G* h; B, x: C3 ~) c
    1 p9 a5 X. Z9 k& m9 d) G5 ]
    $ @+ z5 y+ W, Y. d$ I
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    1 f! b1 E. B  ^————————————————& N8 N- L2 o% ?; }1 Y. B1 P& C/ }
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    7 l# b6 j5 ^1 L7 W原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    ) f; j9 P) C, b/ ]4 J
    6 @: p7 A! Y& M1 N/ i7 O5 m& X( C" v. K( a

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

    回顶部