QQ登录

只需要一步,快速开始

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

    3 ?& E& F" X6 R  t从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat  A" k" d7 X4 J
    ( \9 }& L. f  ~4 y0 |
    目录
    # c9 r, I6 O" n' a: M, f! c+ |5 J# d* |2 M
    从零开始写一个迷你版的Tomcat
    ( ~/ V  v: T! D2 F* ]+ |! C, ?, \, {+ Z* f
    第一,提供Socket服务: ^: d/ ?4 f: v+ l6 F& f

    3 L2 D, ~, {% y: r第二,进行请求的分发
    $ L8 U. D/ G; f* P5 l
    & @  D$ M: K2 `$ ^( d第三,需要把请求和响应封装成request/response. e- F7 W! ^$ }6 d8 L
    ' V% r7 n7 F3 T7 D7 v' _
    一、封装请求对象
    1 l# H9 p% a& X6 y; C; j
    : E% S7 n: p# f! z" g8 i/ ^二、封装响应对象1 a% ?) I& x  i/ E; ?3 C' M

    # V9 O; }& k1 Y- w# C& g( ]0 B三、Servlet 请求处理基类* o  K6 q, d* Y( x0 b- X
    + Y  \$ W) {' A/ Z4 Y* ^3 E" ]
    四、Servlet 实现类
    ( M4 ]3 Y- G1 [- I% p& T6 w
    : H' E, a) E. `1 B  }, }五、Servlet 配置
    ' d. b/ L9 y1 ]* Q0 o, a: m6 X; W2 d
    六、启动类" c4 J! S2 f+ u2 v

    - n% G# Y" l0 A七、测试
    , e8 x' z) O9 p" v* {2 T
    ' e% U1 {5 }# D4 T8 j, i8 ZTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!$ [& t* T5 Q, G; Z& P8 g% t8 v

    ) a! ~( i: Z: R9 BTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    % x5 p; m% T: j* A2 s) _0 d' F( B! Y: L, _

    - H# K2 q8 Y" R# d' B& ]
    & Y/ d/ u* H0 n; d) ^- m从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    $ J0 S% i( e& c# J! P! T6 f; L- \. P7 O0 E: C- H
    # Z/ m6 P, h, L, @

    ) q* S8 Y( p7 G( n由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    , w+ u+ |6 ]$ d# M# }2 ^6 Z) J* E
    9 W# i$ {! S% j, P
    8 h2 Q+ E! }9 O
    7 a+ e+ v4 o4 x1 d9 Y第一,提供Socket服务
    1 k7 j8 f7 \  ?) B
    * H+ q( M2 N9 ]1 ]
    6 t" ^- J; M" ^+ W0 F/ ]! s4 R  E: K" q7 P. A4 s! R9 P, K& k
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    . q- d. b$ M( J9 v7 o" H# O
    9 z$ ?8 I3 z. N7 v; C0 m) m+ X4 ]# }
    1 U  J: L$ I9 ^5 o
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 S+ `) e, H& l+ q2 y! i& _8 a: V
    4 ?' F* x9 Z# l! ]
    6 @/ O5 c3 @( V3 @7 R
    ' X' @( j- O9 u1 i/ m, u7 F
    第二,进行请求的分发! f& s  ^- }: ^$ \: ]
    * k) v* L% @8 B" r6 P6 i4 V% _, ]

    ; Y, T8 k+ R8 S# Y$ ~7 l+ D
    " ?/ O8 h* }6 W' ?0 I要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。. M* I1 A; `# e2 J2 R9 S& `

    7 c) r$ |: p1 x* A3 w1 A7 R; H: _' _# r

    4 m/ B/ y5 L) ~7 G# U) l, p& L& Q第三,需要把请求和响应封装成request/response
    $ `& `5 g% V. ]4 y: G, v$ f' J5 w) f- N3 @* x8 O/ H  |

    " e/ f. L: S( [
    5 j8 A$ K2 B  h! Q4 c: `我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!# r/ _: _$ r* b+ {2 O
      A- O2 u( H+ G, K. k

    * `5 V' v/ |( y3 \1 w6 F" {" H, t7 u话不多说,先来看一眼工程截图。
    6 G% s6 n! M6 \. V 1.jpg
    1 O" r' |7 s) K2 b9 _5 G3 q一、封装请求对象, y* g2 y. o4 t; E2 n  c! m/ J/ @
    2.jpg
    6 y  G; p( ]! V% J/ z5 |. @) K7 S+ [& e# ^) w2 c/ v: x8 @  B

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


    ) h2 P; ~/ T; T# C二、封装响应对象
    8 J3 F( Y( X- h+ V 3.jpg 4 _$ d: |0 @% F" `: U) v. g/ P* Z. {
    $ `0 m! f8 P* E, }5 Y0 R

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

    ) C' n) V. g, j9 e; X; p
    三、Servlet 请求处理基类0 B$ D8 A; U( {- c% g
    9 [2 B) g( f5 i
    4.jpg
    2 y* O# L; S1 |6 U2 n) o
    & i6 }( s0 E+ _% x' ^
    $ S- H! N, ^0 u" B0 p# |% A
    # T* u; G7 B; g6 D% x前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    9 [) m- C6 o/ r: a* ]  ~
    % K/ J$ T7 V2 U* \
    : {' k6 `( Q2 X& k7 z7 A1 i3 S2 f 5.jpg
    ( v6 q1 H' ~. Q, L( |
    5 y. S+ \; k1 `+ v; t
    - Q8 ^0 u6 p1 H  Y% g5 g  b8 f7 A

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

    $ \! q( `3 Y0 b; w
    五、Servlet 配置 7.jpg
    ' P5 d6 x* |3 \ 6.jpg 6 @3 s1 }5 }7 @1 [# b( b& k

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

    8 c. k1 [* m7 E$ j
    六、启动类 10.jpg + {, r, B* ~; U) O
    9.jpg
    1 l2 l3 E8 l: t' a& q6 \3 R 8.jpg 2 g0 {6 e  L# t3 t" Q2 }6 T) ]

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


    9 C8 m1 r# \+ x$ r- B1 A七、测试 11.jpg
      a! G, m, _  l! V# o+ Q1 H& @3 r4 Q6 v6 D
    ( H! z$ T# U1 v4 V( J% `
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。8 d/ {! ]& B' l
    ————————————————' \0 y6 v8 X7 d6 Y0 B
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : t; M8 G; c# Z' K原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    6 j4 c) i; g; k) I& H
    ) @& U( a& |' Y0 q+ j) @5 X* S$ e

    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 13:41 , Processed in 0.444236 second(s), 54 queries .

    回顶部