QQ登录

只需要一步,快速开始

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

    + R7 x4 }4 e0 t0 J3 L从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat- K" H; _: |3 T! v: y
    : M7 t* ?; q5 H- V* I- M
    目录1 n. `) n2 g4 h( ^( @, b
    ( h* q( n  @0 M3 X
    从零开始写一个迷你版的Tomcat
    2 ~; b- i0 E  o& X% k' f7 x3 g" N8 t0 ^3 k  J
    第一,提供Socket服务
    2 O- c  S7 w/ i+ y- `; W$ ~, j0 l& O4 t. L) e7 o* a3 e- C) f( m
    第二,进行请求的分发
    / S3 u5 O1 X6 C7 F4 d. }! F
    $ e3 u/ a( X8 ]! G第三,需要把请求和响应封装成request/response+ C$ d4 q) W3 ~+ C+ n3 n  O) n7 @7 a
    7 U! ^) b+ n+ |7 ?
    一、封装请求对象& F5 T. [, W8 N* K( G! {$ k

    # E6 R' z8 ^. W, z% y$ `: G  Z二、封装响应对象8 q  [. `( m) f4 i( H

    % U0 H) c; S' p! z. w! ~3 e+ O三、Servlet 请求处理基类& B5 c8 t. S9 N! V5 b: V2 k

    3 K0 L! W$ _$ j0 \7 H; c. _四、Servlet 实现类# N& N( \4 U2 o. ?8 n& z
    6 T+ w# i1 \7 M( I
    五、Servlet 配置
    6 e: W9 r  l2 J! s1 U% }! E  S
    2 G" k6 Q% u5 l$ F" R. J4 K! W六、启动类
    - F1 U( q. g% g9 F
      _1 h$ V6 d. O! K( Q七、测试' W' F6 S- ?6 }& I
      S3 V" D* D1 z: x
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ! h4 ?' b$ F' k6 w  x
    2 B+ \. `9 M2 I8 c( U8 j( L2 vTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    3 m9 i+ C* r/ f6 c% s4 L9 U+ @. Q7 x: \+ {: F9 U# Y' T0 q$ l6 C

    3 a/ n& g2 |# ?/ z3 e# y
    7 b$ e" i' p4 P  a从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。# C9 r: s: k- _& ]# f4 J* z

    0 h2 J' x& m2 [4 e* j0 r
    & |7 Y, {9 B- W) e9 j1 Q3 ]# p, \8 v/ R: y$ R
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。1 }6 Q+ ^2 I: t" A! b: H' d' o

    ! {$ L$ y* i1 v& Q5 z, h& A6 Y0 T
    $ u' L3 J5 P4 @5 [
    0 T+ T/ E$ q/ S9 e; q/ g) N5 a第一,提供Socket服务
      q  n9 c5 }" V' Q3 W: R4 S+ \9 F! O1 h9 K& }) U

    9 ^8 {: |" g7 d. Q7 L" w9 Q, w6 f) m( P6 T- [7 r
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    - p! p+ {- h0 m1 ]
    , `6 v- \4 f9 m% r) l; x  n0 P- R* p! |
    & h! l! o) i  M/ b
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    , k" G3 V6 c) L# Y: s' ~
    7 v( L9 ~2 l  z! U; _# r3 d8 e2 L0 J# o0 ]" }

    ' @& ?! |# z& k; C4 ?第二,进行请求的分发7 T( ~! U; S0 F; Q& W
    / O+ [) T! `# o  D+ M
    * s1 X+ j' |% P

    ) U+ l8 v. d2 v; t% j要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    " W' q+ Y$ y' N( J" h6 c$ W
    ' g! v. m/ M. X9 ^. L  j1 C
    ) ~$ p+ o' a# f% x' A( l" K) v8 z- t& j5 k# ]; v. `5 w; r" B
    第三,需要把请求和响应封装成request/response
    6 g$ t1 g  ^& Y% j1 @7 V9 s. R% z' E
    - p' E) |' O; Y
    - a' E) t" b$ W2 D5 {5 h% l
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!0 H3 Q# f( T! F- y
    ) ^6 ^) ]5 o1 F% k) ~* s( g
    " {- p! B: E6 L
    话不多说,先来看一眼工程截图。
    * X1 I- A& y. }* ]% _& p 1.jpg
    : D9 A! l8 k1 R一、封装请求对象
    4 x' T! G: `0 n: \% _% W 2.jpg 8 d+ O$ G. v6 q8 p2 a

    1 c  m7 k; |/ o- e+ k, ?- `2 ~

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


    # M; i( L1 J% E& G6 W/ \0 m' t/ K, k二、封装响应对象
    ' _& O! }. F5 ^" m0 f 3.jpg
    $ F2 ]! g8 m# u: P# a" ?" g6 [5 u- Y3 j6 C" i# w/ h5 B$ ~8 n

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

    0 Q" A8 P! y& ^! [7 t8 x
    三、Servlet 请求处理基类
    + M1 K5 n3 _7 Q; T1 @. a0 ?) R( k' ~$ v  D3 w9 h# W
    4.jpg ' _# {' A3 D" I5 c7 t$ f; e
    " E1 ~1 V# |' J  m

    0 ^8 N1 X4 N# h( @6 G" m7 i( Z  @+ z' o; g' [
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    3 ~8 [# v" s, h2 U( L: Y0 f$ }: D5 H+ J6 k8 b) [! s7 D

    ) C  S6 R8 ~' g; @$ [( `* [& A6 d 5.jpg
    6 }, U2 `( G# x# n9 M, Y. B3 z6 o( V

    0 a1 C+ Q; b9 P% t6 l9 u

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


    0 ?. a9 }6 W" R: _5 l: U五、Servlet 配置 7.jpg 5 n8 E- O4 Q9 m
    6.jpg
    $ s& z# |2 k$ Y" y$ y4 e' S

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


    & _* M" k, c& b# X$ I! ^六、启动类 10.jpg
    , ]0 d: K0 p( L9 F: w5 R 9.jpg 6 n: B4 ~- t2 P
    8.jpg : b; W0 u3 m& Q8 P7 y/ d+ d

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

    ) `0 b( z- `% l" d
    七、测试 11.jpg
    % s: ~3 \7 }# q8 T! Q% G4 j& [0 i6 \) y7 t0 h; p

    4 c# v6 b6 p5 `实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    * o$ M+ |& v' {+ ?" \1 E1 x————————————————  o* {' f- W) }' J
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, {  A) y* r; v5 I( m: g7 q% N
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480' ?* u6 S4 E, {: |
    / b2 B8 [4 U8 _. n( i% W( @

      w# O2 K3 W9 [3 C

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

    10.jpg

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

    9.jpg

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

    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, 2025-8-23 11:16 , Processed in 0.479379 second(s), 54 queries .

    回顶部