QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1386|回复: 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 y4 k9 E$ y# R! W
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    0 U/ M# B% x' S# w; `6 ?) u+ B8 u1 {( G$ L: Q/ z# m
    目录; V" w) K7 Q0 f# h4 `  Y; b/ w

    3 S) }6 q9 D, I1 V( G. G4 ~( C从零开始写一个迷你版的Tomcat
    $ A$ O8 e) p/ D( P5 |9 n0 u# h+ t
    第一,提供Socket服务
    " Y) g7 Q6 K# |9 E  u/ T) ^$ t: ~5 Q8 j  o2 c. C
    第二,进行请求的分发
    : b( O) X7 d. \0 T% T6 l# p9 p- u3 e
    第三,需要把请求和响应封装成request/response2 S7 @2 [7 H' [

    3 W  a5 b  S3 a. R8 e) q6 v一、封装请求对象% d; \/ v6 n( N2 b. r" L; n

    4 U: M# z5 z4 k) `二、封装响应对象( O3 h0 ]$ M2 D" {3 C9 k
    6 t- z  ?  X$ k& r( r; H
    三、Servlet 请求处理基类5 F5 ?/ V3 o; S4 T/ a( ]
    - ?5 q" A8 h9 t) g. K6 V
    四、Servlet 实现类6 |3 F  O' E2 g7 d8 c
    0 M; S* ~  ^# h( e  D+ F
    五、Servlet 配置
    7 C6 j# e& B. R3 Y/ V; w, C. U" v
    4 u4 ^% i$ j, `* D六、启动类
      f0 s2 I2 ^7 Q  I, k+ S: z4 t
    % h/ K. ?$ a* v2 J  @4 ]0 F+ Z6 Q* Z七、测试" g# k; e( G! d. a8 P
    , i- e9 K7 I( t6 I9 l# A
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!) _% @8 @" j' E, Z& @
    - v8 @" b" t# S/ j# E3 h
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?2 f, C6 ^% S* H8 e5 b* Z

    1 H; M) H* M8 ~' H& ]" ?) r+ \, j' N+ e7 H
    , L/ \9 s  D  o- y! N
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    , ]0 f' j: D2 A& C3 W0 l/ E% R+ R; g; G  T. |/ \5 L
    $ k6 V6 w7 \6 l9 R& E

    " x7 j& M. w+ ^8 x# y, g由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    2 E3 l* {" i/ ?0 F" _" l; g" M- D
    / L: P* V0 ?7 P: w! M( s7 i3 h' ^/ K$ D" x3 e- `+ {

    1 R+ w- ~& P( r5 q0 s- N0 Q: D第一,提供Socket服务
      Z1 R1 [5 G- V# V, ^1 A0 c" n! `: r- f

    ) c" L, Y$ t! c# P- g; V! W5 Q! ^* }7 T5 t4 g( {3 j
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    . U  ]1 u/ I5 h( k! k
    . h" x/ R6 e! R( D. o1 O9 j# S% X8 g
    - S* @) H6 M* S% Q$ p* P
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?5 n( G' j* Q  f! u
    " B0 v" v' B# K7 w& L

    6 ^" n: l4 {1 z5 `+ v* ]1 B; e, N5 e7 n, `: y: g% ^5 ^& z3 |' ]  w4 V& j" G
    第二,进行请求的分发& H7 ^3 O: L; A0 N/ X# _
    ( k& N; ~$ X" a3 M. q

    * m' |- A( P# Q" u
    0 W4 c0 c" o; G0 i1 ?" q- _7 U要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    % B; D8 q  A6 \4 k% w. M( M; Z" {7 t  [6 F& _! E

    " u# b. \/ k9 K2 i! g; b0 C) {& j: x$ G+ x% T
    第三,需要把请求和响应封装成request/response
    : {. d7 k) A  a* \
    ' D6 z( j) i% f- ^2 C! e/ J7 Q3 ?, T3 O' E
    , A2 |! {7 c: o6 g+ {* e
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!/ z/ ]# v  L. n, h" s- ?1 i1 q8 m
    " f! m: e0 J+ J& X5 f: x

    0 S4 U) P8 i! K0 d话不多说,先来看一眼工程截图。; Q5 l8 t' N+ I. S- j' E4 j, K
    1.jpg 8 x, G" a) ]( t8 d- ~  J
    一、封装请求对象* y( `" z# @3 x9 B
    2.jpg : i5 [- n( |8 q; |7 j

    $ i( e6 e+ b& w  [3 ]8 Y9 ^; J+ {- \

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


    3 e5 G; y. f4 L二、封装响应对象
    3 \' a& f. G/ m) k7 ` 3.jpg
    0 O% @+ Q( l# Z( F/ {% Y6 T# Q, ^/ V; \+ i

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


    - b- [6 e& ~; t三、Servlet 请求处理基类
    # f- y5 D- ?" Y* o1 L6 _
    : C' J4 _; v* x& P0 c 4.jpg   V5 V5 D8 d" u4 ], R) s0 V
    ) r& |8 f, |% m. F

    " @3 }1 [8 H4 P6 b7 a' k1 d1 D4 x; D. |
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    , m, W! P7 b  _8 F7 `4 S! l$ ]
    ( c6 Y7 k  l/ _0 o8 W& g7 Z0 W! \- @* J- R4 e
    5.jpg 8 {0 ]3 b& e; G$ U( L, T& |
    , E2 ?1 f; ~" D- c) _0 J0 _
    " Z& Q8 _; E: A. G  r5 S

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


    9 L* W' V: S5 q' @; S五、Servlet 配置 7.jpg
    ' D; A: N1 `# o# z8 q 6.jpg
    8 L) G# W) y- e, G0 W- t! _' V

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


    # `; X6 q7 K. M( ?! E六、启动类 10.jpg
    + @0 F3 c5 a* @7 v2 Z 9.jpg 3 \6 d( j  v" s, x7 _. u
    8.jpg
    $ W8 R; ?. R' j

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


    8 `) W8 n- D. [% h) D% r- ]. Z6 u七、测试 11.jpg
    5 `2 F0 v6 F3 A! P. w
    4 ~/ V6 ~# ?, w3 s$ J% N" I. Z' c6 A( f; l. J4 u% e
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。/ c# ]& B+ x: K1 f9 j
    ————————————————3 @! X. B+ o( C
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 n4 n/ d4 l/ X; G; i9 R原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    % J- j' r( r! m4 b& N' y% j: z, ]% o6 P- }* F6 D, x1 v1 Y% \
    9 F" q" F* Y  }+ r" {

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

    10.jpg

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

    9.jpg

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

    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-9 03:30 , Processed in 0.482764 second(s), 54 queries .

    回顶部