QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1384|回复: 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
    " k1 ~: `1 g  P% Q
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    . }  l2 A1 c. C. j/ D
    ; z( H: ~; }% K; G/ C/ `目录
    3 g2 ^4 ~5 V' [$ r  e1 B( |1 T( M( _# a* K0 n3 c% b: `
    从零开始写一个迷你版的Tomcat% D4 K( Q" r$ R3 ~# Z

    7 T: I/ u" Q- n& y$ r" [第一,提供Socket服务, n, d& ]9 W* |: U; Z7 ?" \

    2 x& K3 Y' p' L$ {9 `, O, ]/ ]第二,进行请求的分发
    - j+ Y2 b- j: N( S, ]2 c9 D0 J( Z* P. T  }) R2 o5 }0 u
    第三,需要把请求和响应封装成request/response
    0 b# P9 H1 k! W! Y. m$ {
    . F( v) U+ D7 `+ N' i一、封装请求对象
    5 n5 S$ h/ i+ ^  D9 T" i: H& U% `0 h1 O' v8 _
    二、封装响应对象4 R+ M" s' O2 \- h

    1 T' Z5 t3 X; t+ |# V* D( b& a5 D三、Servlet 请求处理基类. Z; a) c( L" ^+ [

    ( Q" s  t4 p+ x. C2 g: L' p四、Servlet 实现类5 E# j# k. m( n! l0 T$ d
    6 O8 M+ Z5 s0 u- z5 T3 S
    五、Servlet 配置- Q! W0 t: o6 X4 d. }3 M
    0 U1 d9 P7 W9 {
    六、启动类* E$ ^; V+ N! Y! A2 f" z7 d4 D# t7 ?

    & j4 i& u$ P$ u$ a2 K( m6 g七、测试  \9 S( U8 D7 ?' k$ j: G
      h; E. m/ s' y) H; I: U
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    . {# z" H* c$ m$ m( s* M: m2 {2 c) w" O! {
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    8 {, A9 a* r* U, X
    " f( E* }* L& r( _/ m, p" `. n  f1 K6 z8 p) J3 F

    + }/ K9 f- \! L( H; J) S从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。9 S% D) d1 }( q* z1 ~
    ) C8 V2 @# ?1 w) c+ T4 I/ ]
    + K) L3 P4 {& b% q  y& P

    " j% Z, s" o. S, c6 V  K由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。/ ?0 `& g' N( \6 ?

    # [/ i6 P, z; A8 Y. `$ a/ v+ w% @5 Z1 i
    2 x- A' }; b. C) _/ L- i
    第一,提供Socket服务
    + [- Y& J1 O* z% n) H( R( z% k0 E( f3 u2 Y' K# D. ^5 C
    $ t; r& ~& M) {+ g) \8 U

    * |5 ~* U1 g3 D# Q. @* ^2 Q! J. sTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
      `' q2 L6 A# `4 s0 ^$ G: R1 J2 T' l9 Y2 @
      K' z. ]0 Y* z, @5 d
    ( c5 l$ y# j$ i  s6 S  A
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?4 h3 O- c) J' q4 `

    - |0 f+ S: Z8 j$ \# Z0 ^: O, `" K& M! k0 \' [# E5 @0 C
    % ~/ o3 Q1 _3 h& o2 r2 S4 m  T& G
    第二,进行请求的分发
    ! K' y2 ^: h1 m. T9 ^4 n2 _6 K7 n0 ~0 D4 A
    $ ]- B& `+ }" o6 P9 \% e* }

      w' J- L" n0 `5 J* Z1 H要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    5 N% S( w* @, N/ x8 b* a) y- J9 D& E7 F4 S7 C% Q4 T, I

    2 F6 ~1 J6 t7 T! D
    6 [2 v8 H6 Y- |. L9 K; P3 h; y第三,需要把请求和响应封装成request/response
    2 i5 @3 L9 m9 ~. e/ j
    5 r* \- B: F0 w% D+ U6 r5 v1 `+ c5 K. g8 J; N* x1 E

    % M3 ?+ z9 p# ?3 {! r& E& ^我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!+ ^' V9 w+ @4 A# i, o, x
    # m" {$ `9 r& m& k# [8 i

    * Q: k: O" Y( M话不多说,先来看一眼工程截图。$ o! W! q9 B$ u! N- S# f
    1.jpg : x! k. t) V, ~
    一、封装请求对象
    * N4 Y3 f; }5 z7 @/ x+ S 2.jpg
    + z- s; e0 ]2 C  c$ r/ \  i; [, s0 S% b
    ! _$ s$ n5 R; f0 Y

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


    " }9 K; ?( V/ @  `# L二、封装响应对象! v; H( [- Z4 z- ^0 v3 S
    3.jpg * {  g$ O. o% J1 X; m. B: P

    / F& N) H4 o8 ^) q1 D

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

    9 f+ r+ ?* X5 [7 \
    三、Servlet 请求处理基类1 y# _' Y/ T* D5 A; M4 z
    ; \- E% Q" m2 x9 V
    4.jpg 5 p& [5 ~. z: D- Z( c9 ?* ~! t' f  m1 O1 j
    - C1 @. y% a7 Q: w

    / x( e" R& F: T! s& z( p. r/ G. }5 q) o- Q4 I  [& N. B9 \- P
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    5 v) X. |$ \/ \, D  z" F4 H# L3 I; Q6 B0 {7 y# J% `
    ' O* |$ _" {5 @0 W0 R
    5.jpg
    + G0 \' u, @+ [, _' \/ [" V) f1 B: V4 G9 {

    / \# A' N4 f% @5 k0 h3 i4 y

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

    ) q3 ~  T9 K5 f% s. x& P
    五、Servlet 配置 7.jpg * k% R4 S3 l, E
    6.jpg
    1 y# v/ R; |$ {2 E# J5 E1 P

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

    , ?1 ?0 N6 t7 k; z3 z
    六、启动类 10.jpg 9 z6 E4 Z/ r& K/ _! _' M1 _
    9.jpg 0 O" s$ d% l/ u1 `% Z
    8.jpg , U! u) [( f' ^+ l* \* U* ^( K) }

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


    4 J. m; X/ |6 d# x3 L# L七、测试 11.jpg
    # N" e* Y1 W+ T' Q
    0 _7 q, O" Q9 b* ?2 z% b+ D& }- Q; [1 {
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。9 I, B) x, o, H
    ————————————————
    * \, O) o! \7 @版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    6 Z* `5 _0 @+ q1 r- i原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480: E# D% ^7 S2 G' H" m! \$ p; X: u: d
    " s: J; q) T7 j0 y
    % j- Z: f# s" T$ H+ M

    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.418996 second(s), 54 queries .

    回顶部