QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1149|回复: 0
打印 上一主题 下一主题

从零开始写一个迷你版的Tomcat

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

81

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-20 15:06 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    9 f9 r6 s8 G  \5 v
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat7 `7 h5 Z& y. |, v
    + a# t2 Q; T- s# G$ `7 k/ k
    目录
    ( T, Z* t+ T  ~9 I2 s; L% h# i4 A
    从零开始写一个迷你版的Tomcat! ~) f" }6 Y1 w, e( [. X

    4 v* g4 E# _# l) M& _第一,提供Socket服务( e- j) M5 u' h6 x# H6 w

    , Q0 J/ u  K) ]7 y: ~: |( E第二,进行请求的分发
    2 ?4 I( h$ D4 K
    , c$ h: e5 L1 R* \2 b* q- m/ O第三,需要把请求和响应封装成request/response: W+ p0 f# W; M* [7 ^

    0 l1 }- p5 J* ^1 Q一、封装请求对象
    0 d; H) G8 @1 h  q8 R' K" P0 A. O# ?/ q
    二、封装响应对象7 D4 r& ~6 `* B

    $ d& }4 N+ }* T( P" L" N三、Servlet 请求处理基类/ T' W+ V+ T7 R  A& w: H3 S$ a1 _% t3 ^

    + h) D4 i4 v1 O  w四、Servlet 实现类+ f/ d: o& Q' h8 H9 f6 a8 S8 ^+ f: Y
    1 Y+ R$ M5 t3 t+ w# x6 Z: T' y
    五、Servlet 配置
    7 d1 N) C$ P! }
    $ [6 F( Y7 w. V) T六、启动类. J; d7 A7 h% n* _/ Y
    9 d* J- e" T4 ^0 [: {0 P8 L& `& I: u. `
    七、测试+ p7 W# ]. O, Y0 \
    % h3 E% B$ v/ \  F7 u
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    5 S3 V1 {! |; |* |+ N8 e6 B, e- t5 F9 X; e, w9 Z
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    $ [1 a9 D8 P" o( e% T. h
    ( C, e9 j5 G' S/ a: s) p$ M
    : ?- @7 {/ ?0 b* p' i; U0 M' x
    9 Q( c" A9 x$ E3 e# K' `2 l从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。2 _) k3 t8 o* }6 U- B

    : D9 K2 B3 @  C6 i7 b* L( t: a( b/ I! g# J2 ]. _

    * ]7 E. @# q$ Y! a- p" ^" `" {: T8 ^由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。% r+ J* j5 l9 o

    ' _- [: a4 f0 M9 j
    & }9 d7 X6 `5 i# K' T' a
    + e2 }' b0 }2 A5 v  _& j0 p. ~+ J# L第一,提供Socket服务% [1 P' a  E8 k, [2 V. ~/ L$ X5 K
    ( N: V: L7 I+ K7 o
    2 s! R4 a5 \2 h/ l  n# R7 J

      c/ T6 S4 [1 v: ?; q; @' FTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!4 I! f8 {/ J) C7 }
    $ `# o( j+ L+ e, |& I
    * S2 b8 W3 D* x9 I6 U# e! `% Y

    - d8 U6 W/ h! h" m/ n( P. r1 @这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?5 X& x6 q$ ~1 J1 D1 q
    4 J1 Y0 L% J" q3 {; X

    . f" M; H% _2 @/ x. ]% I1 G
    % F6 h8 D; d6 S4 K2 v9 V* E第二,进行请求的分发" K& B" I8 {9 \& b
    $ G7 f5 R# z5 E; D$ ]/ f: c; y

    - Q/ U: R# L1 G$ c, \& ?
    - U) ~) F* m8 w' k; V4 X2 W要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。! m* z9 Y- q" L9 ?4 F6 S( I
    # ?. y" q) a, L$ C# T( j
    , L: D# w0 |5 L
    8 P7 w5 ], }  }4 [8 g
    第三,需要把请求和响应封装成request/response9 [; e, w: ?: j  u" y3 t

    ' G- E4 ]: x  e, {4 r, b' m7 j9 \
    : U+ J7 Y; B; z5 j* {
      P/ Z5 o; Q" w4 b2 v我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    $ Z" k, N* r1 E1 M
    4 `0 I7 D0 q' B* S5 z" ~+ C) z- d% G6 j
    话不多说,先来看一眼工程截图。% U) H: A. b8 l- r
    1.jpg * N' B' W: e. ?  X
    一、封装请求对象
    . {. l! f; D4 O: c 2.jpg
    9 ~; E) D% v0 m. o
    0 M! ~& N, A2 ?$ U* w

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


    6 u& E: f. H1 T: |- g; e二、封装响应对象# g. H8 I5 @' Q' P( ?6 D8 N
    3.jpg
    0 s9 f* ~0 t# f+ [  Q/ ~
    5 K/ f7 @! f+ }3 v8 w

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

    ( _  m7 e6 ^% l5 B; P8 Z, a- A
    三、Servlet 请求处理基类
    - ~0 K/ ?& u# S
    2 l1 k3 {) _& ^7 ]! T: I, ^5 H* n 4.jpg
    . Z! ~) A& B$ H# T5 B& G( t+ M& x0 o* i8 D/ F

    " e( w2 l/ }' o- @8 X  U: J  x$ D
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    * p. f# J% ^5 V0 [* ]/ J( R4 d0 _6 m4 B, L/ n

    - u* y% F6 t2 |, v0 |: W 5.jpg 0 j/ n: m+ b2 W* _  C
    # z1 F8 x- v5 i3 S; H! c7 p
    2 w% E' j; c) W* J, l( k

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

    ' A  S. [4 S" H# X* L
    五、Servlet 配置 7.jpg
    ! O! c) L1 v; S2 |( m 6.jpg % C: T5 j% ?# O5 S  M# u/ `

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


    # E! C1 A, y8 I) Z$ K* X4 W六、启动类 10.jpg 3 v; W' Z$ {6 ]$ Y+ Y% `  M
    9.jpg
    8 C( r) i, ]8 ]" r 8.jpg 6 i5 x2 m6 @" S# f3 |

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


    % i) m; L$ N9 G, q6 J七、测试 11.jpg
    7 k* M/ t' j: O6 a6 T; i  ^) P' h* X. y- L$ L9 U8 A+ d

    ; {6 t# f! e. ?3 w6 u实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。5 A0 V! w2 F: }& D; `+ h2 z2 R
    ————————————————
    2 i4 C8 }: o2 F1 _. L- W* H版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。( x& M+ [  @7 I8 Z0 H6 a/ n% r8 O
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274806 Q8 J! z/ b$ S9 D
    + X) R# c7 V3 ~. {

    " O( v( _6 s! L7 ?) D8 w6 Q. ?

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

    10.jpg

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

    9.jpg

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

    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-5-15 17:58 , Processed in 0.430288 second(s), 53 queries .

    回顶部