QQ登录

只需要一步,快速开始

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

    8 s" U7 G9 [5 S) F( a. e从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat0 n+ W/ q. F' k5 L% ?  S( z

    + V3 h; a/ Z  o& r& d目录, n2 j& ^/ d7 W+ f7 o: }+ ~! ]/ J
    5 }" ^4 M/ t9 ~9 A/ s. q
    从零开始写一个迷你版的Tomcat
      Y; c4 h3 y# m; h8 Z
    0 ^/ i% A+ h" |# N: [; z第一,提供Socket服务. n; w4 H- l/ D9 C9 s4 |( s0 I
    3 {, g- x% ~2 ]
    第二,进行请求的分发
    6 Q$ P3 Y4 ~- z! V! x6 |* h3 Q9 a& X
    第三,需要把请求和响应封装成request/response
    / i3 K  N- g3 S  M8 S, L( f
    * j! A- |$ p+ _$ V2 z' N一、封装请求对象
    3 U" J4 G3 g' T) o* _1 [. c0 ^. |; w: r; \
    二、封装响应对象4 N5 d$ w! {( ?6 [3 Z$ Z5 E: O& `

      P. L7 G* s; {: R三、Servlet 请求处理基类) {$ ?) J! d, m) d
    ; c5 A. R# E4 b& x2 y7 L. T+ H
    四、Servlet 实现类( x% q' |. u/ z6 g7 Q, C
    - A% F% G# O# y6 w
    五、Servlet 配置
    , w; E  }. v8 o+ k* t% E; q
      }! |$ J. W7 d! l4 S% d六、启动类$ _2 s; c5 ]+ _) U8 B

    , Q/ S% c* V$ ?- J1 m; J4 K七、测试
    3 d5 J7 h$ d; ], B0 U9 y; G0 z5 h% u/ q3 Z; z# G( B  s
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    1 K4 c; M- [1 {" h3 V5 b3 Q3 ]8 l3 Z1 ^0 v
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
      A2 |3 z0 X- L$ _* |/ n7 b2 {" o1 Z% J( e6 ^7 d, e5 Q" a# t. I: }1 }; ^# _
    8 B7 V" ~7 C4 W' t, R

    * I1 P: o. ~3 v0 l, a5 U3 C& v从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    ! ~7 d6 ?# L7 y, f. t( t( C# s+ i' A8 U: Y5 @

    ! g' y. |* j  w7 D$ ~/ w0 N! }
    , }* x6 [/ R" M7 u由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。) T- r" R5 W; \3 D! U2 W5 O& R

    : E  y8 J" i% P6 {
    " z& i6 Z9 v$ H& X
    4 [6 ?$ z6 K( j第一,提供Socket服务% f7 a2 w( a& m- B2 P6 P; H

    # o+ H$ r3 w9 M, d. E
    , g* A+ D1 g3 X- u& c1 B# ?6 \' ?5 A! g
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    0 \& T# B$ I, w, k7 Z2 ~
    ' g3 A( V3 e- e0 O
    , x. n9 N1 I! G+ I! F8 U+ E$ g) O2 ]( n; @8 V) S( l8 r+ p6 H
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    2 n! z7 t1 O% ?4 C8 p0 R0 X
    ' o  p! b7 X3 f& g  _0 t$ l
    3 H. {# A7 j7 @$ U0 D# D& r9 C/ I; Z
    第二,进行请求的分发
    + b$ m  G" d4 {. c0 `1 A) s7 b# [; X. Q7 B3 E, |* v9 u" i, c
    ; L0 o4 m. m" K, a/ [
    ' ]  F1 m: |, I( D3 x- w! ]
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    . r- Q0 G1 b0 P6 U( `
    3 n/ t" P  A0 h; d8 L$ [8 l/ X& v0 Y& ]- e9 N" {; z! ~9 v

    # a' C# a. M$ d* E1 t# g& ?# `: U第三,需要把请求和响应封装成request/response
    8 S0 R) p  W# k0 e6 b0 s( e- O0 [" F9 c" l
    5 L7 L8 ^3 B; {4 f2 N

    " B+ F" c+ g' U* ?8 J我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    # N( o: Z8 K+ F$ K8 l8 \. I  w/ c, F3 h' I
    ) {; h/ j- T: h* J( N
    话不多说,先来看一眼工程截图。
    1 `7 \+ {+ U  }  R% P 1.jpg
    * r" B% P4 V/ D. K) D一、封装请求对象# F  U5 D1 l) g9 \. m
    2.jpg
    " {1 \/ e+ f4 E1 a% x2 ]$ w! Q! Z. c$ w, q; ?; f

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


    , S( F2 P/ V+ M! q" w' L1 L二、封装响应对象
    - D# k* l6 q. `; | 3.jpg 3 `( [1 j7 m! y0 u- X! P, ^
    ( w9 m! `7 i- E+ F7 `- b7 S, @( ]

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

    0 I% T6 v8 d% c7 O5 b7 [
    三、Servlet 请求处理基类  a* H4 c: t$ X$ r. p

    + f2 c. p1 L4 b' p6 N  k 4.jpg
    : \3 O- k# Q% W# |+ q1 E, Y+ J, W7 ]# |% J+ }" |

    1 O0 m! e, y0 Y1 q' C, k
    # B) o# F8 e0 j+ h前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    1 B: s% Q2 T; u: S3 w9 w( V. ?8 B0 }' |9 y

      k+ Y* q3 i8 c8 ` 5.jpg
    7 y; a/ g# D: J' L/ m
    / G! J% X6 g$ J: ~# k
    0 W9 W- h. B9 u" t8 Y. e' c. b/ t

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

    - m8 y9 X. L3 y. d& q0 y
    五、Servlet 配置 7.jpg 9 G+ t# }# p" N
    6.jpg ; N7 x0 K7 H) m1 ?* n" U2 Y

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

    + e4 s9 J; c4 j7 B# \
    六、启动类 10.jpg 9 c8 j3 ]5 y, A3 g1 H5 ?7 b
    9.jpg
    # O2 v5 Z' u7 M 8.jpg
    - `1 |! _+ J! i  F6 V% {

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

    9 B! y; c* ]9 j
    七、测试 11.jpg
    + p# E, ]. l2 p9 v8 B1 Z; ~# [) ]
    : o/ u3 N- d0 m  ^6 z1 \9 u0 R4 }; Z2 ~2 p4 W0 G
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。$ _: H* S; |, y: R4 ^4 w
    ————————————————, i3 E0 t: `$ l9 C; v* _8 @% q
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    $ f. p% B" ~, j2 }0 d原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    , ~8 [$ A2 W9 q5 {% k( p. N/ Q& P9 D1 g3 @4 V

    % T: Z& ~$ t8 M, Y3 x4 l. X+ O

    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 11:15 , Processed in 1.435235 second(s), 53 queries .

    回顶部