QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1346|回复: 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
    : x9 k5 a$ e8 [) z
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    7 h$ U% J4 ^4 S. H, P, \
    ' D6 |- a, C" j: G$ n% S; A目录
    # b5 [- P, Q. q2 Z7 k/ \4 G- R+ e+ M7 b. @/ m; n
    从零开始写一个迷你版的Tomcat- M" p6 t! f+ k: @

    2 P0 ]$ U+ m+ k0 B0 w4 `% P' N3 `6 H第一,提供Socket服务
    / v5 j6 G# Y7 M
    + n/ U3 `2 M5 }4 o  H3 s$ X) I; M第二,进行请求的分发
    6 _& V' T) [! D2 j. J( O
    # o5 b1 D% M& A% g; Q7 U第三,需要把请求和响应封装成request/response0 a( N* i3 g; A2 ~- s0 Z8 _# N+ [; {+ u

    ) c" [' T! `! O7 S+ T5 Y一、封装请求对象# H  r; S( `: {4 [

    + g6 {; H- n( Q( S4 n二、封装响应对象
    $ ^+ q6 g3 ]0 F7 z+ n" r) I2 k. o. ]4 P% Y. I- M" l9 Q, h
    三、Servlet 请求处理基类( ]' Z% s) c& q& r

    / e6 v. t* @* l0 P: P四、Servlet 实现类
    8 H2 M3 r" j) i0 E' v  m% q/ L* ?! G  Y; Z! v
    五、Servlet 配置' j3 b- e  X% N2 f3 E- j
    4 Z  j; [$ u* j. @5 j7 J7 E
    六、启动类
    . D  Y% y( X5 T7 p2 ~- D( M3 u- E' k, J
    七、测试
    6 H* {& ]/ o% W9 ?7 c6 ]
    ! ?' ]/ S8 k* P" M7 }Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!- B( y5 r( G% O6 H, F

    8 A  \; y$ B% ~$ i8 {Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    ) r8 P5 a8 P% i6 X) C3 T' B/ M0 f5 Z4 @- Y4 [7 O+ O- ^; f+ ?! g

    + o. \7 K+ a- M/ Y1 G. N
    2 }# g. }8 W3 w$ t0 K% ~3 L4 n+ c从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。' P: ~- w8 j; J* I2 W7 r/ ~* B

    & C( @. e8 @9 {1 Z8 I- z; q5 y2 O6 B( I8 F' i

    & Q  q5 b. e& P* {( `由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。5 H8 V4 ~" c+ j6 a4 r. p% v7 g9 g
    - @' {9 `6 y( ^: p
    ! I* ?3 Y7 z. E
    1 l  }" o- O; r9 a' z4 ~
    第一,提供Socket服务) }! Q* a  f7 J7 U

    ; l' c: b2 N2 j. E" C, @( W4 y
    8 b7 `0 a" s& i; q! z5 j
    " \' }$ P* e3 l2 }- U& MTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!; Q5 s+ k/ [: M1 N5 ]- h

    3 {) U( H- Y# M" a/ Y6 |7 T9 }/ s  x+ _

    * ?( x, {, ]( o! m5 t$ D这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 Z$ l: h8 V0 g4 p$ j% ]
    ( k: O4 M* W! e; h5 b7 R$ ^
    ; X% x1 y* z5 ~+ @2 R0 @# j2 F2 s
    ' k8 e$ U4 E2 {+ q# e! }5 V
    第二,进行请求的分发4 G3 F8 N( T! {- Y
    0 g& }' B' _- O5 J( E6 F

    / @* L5 _2 G* z9 I, P. A3 U  @; Y
    2 m9 M! J$ f# q; R* [0 b* y) ]要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。* \, r7 S  U, Z2 o) `, c5 u
    $ P3 Z( ~; Z/ m6 I. n; b
    ) K% I6 O" G, j$ b3 A
    & _& H& h0 y) Y' n
    第三,需要把请求和响应封装成request/response0 B+ f2 ^2 r5 g/ K9 x: w' p! m; ?, J

    " ~2 f$ ?. y: n- @& W: A0 K7 L2 g4 ]. D5 h) m( e
    3 h. @0 s* u. O' ^2 @% J$ b: j: W
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    0 |9 V' c8 c3 ]$ X) m+ t& z
    / M) ~( }) d  v4 i) w' m! H  }1 ?9 J, Q$ s
    话不多说,先来看一眼工程截图。5 K( }5 T% V( |
    1.jpg
    5 W2 ~, ?9 `. T$ b一、封装请求对象
    4 w2 j0 L+ u; {3 G! g 2.jpg $ a! R" c; {; [* B% o  [

    % ]# l, o# q, p# f

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

    / ?. p* d& ]) r2 [; O
    二、封装响应对象
    % k' R6 B' ^9 G& Q, l7 H+ X% ]; l& ? 3.jpg
    5 s+ j2 c5 h' d6 I: R5 H# I
    ! {3 n* q7 A; l/ ]& c% |

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


    , j4 _- m5 Q8 K  y9 G! o  }. F三、Servlet 请求处理基类
    : ~& j6 K$ U' C% _" B) U; `1 a
    9 r. G# C3 p$ h4 g' b( W 4.jpg , m+ n4 m/ \$ @, r7 }9 s1 G; A0 `7 W9 e
    1 w& o  Z' b2 [8 \) |
    5 z, n+ ], }- c
    1 M1 A- e# i0 ]/ O' }+ _
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。/ {  S& x, I* j5 M- B  h0 i

    ( C7 P  ~0 j% W3 v" m/ H
    3 }! M& R% [- r  O0 p. c 5.jpg
    % F( T* b; d9 E) r
    : Y: u2 G. `4 _/ `. Y: g  C, G6 N
    3 ]7 s3 o- H# S" h, k& U

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

    . @# j. V  [5 g6 q/ K
    五、Servlet 配置 7.jpg ; s8 K1 g! h! h1 C, ?
    6.jpg % O  }5 a+ ~6 A  U6 M" v, e# s

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

    6 m1 Z# I5 r8 T0 V
    六、启动类 10.jpg
    5 M( E3 {9 A, N 9.jpg
    1 x  Y* U& M, m( C 8.jpg
    + K/ E# f) R8 v7 P+ N# Q

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

    - D  N4 F$ _! s- d
    七、测试 11.jpg
    / C! W: t0 W6 j0 C! E4 F6 o
    * l2 I: r( |5 `2 h$ f5 b3 }! ^) Y3 E, O! n# K6 C
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。9 E& u) g3 s! W2 H. s- O) t; u
    ————————————————
    : s, t% b! S% J版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ \1 X  I" g1 I. C
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480! Q/ `  z0 N1 _) H" c, ?' K
    8 `/ f. y0 X" g) z% {
    8 S! Y7 V1 G7 h( K/ z- G

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

    10.jpg

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

    9.jpg

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

    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-6-9 18:58 , Processed in 0.414852 second(s), 54 queries .

    回顶部