QQ登录

只需要一步,快速开始

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

    + }& o' e4 }7 m' u; O从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat# {8 F& r$ W- f) g) T( R0 a
      c* ~3 F% m( g8 z. _
    目录
    # t% s' ]/ d+ h2 r5 C0 y, n7 S6 V: \
    从零开始写一个迷你版的Tomcat, V' x' P# I9 \$ P" |' d) W5 {
    , i; S- a( r% |4 r+ s3 r) h
    第一,提供Socket服务; l+ z- z$ z* A' @3 f6 X1 k5 _
    . W& j, s- _  m4 x2 t' h' c- ?
    第二,进行请求的分发
    : I# E2 U: X* d& W
    ! k4 u" Z3 q) E$ T- Z; p, C第三,需要把请求和响应封装成request/response( Y) K- a$ {2 h
    ! d+ b5 u, a1 Q- H" S* M* t9 |& Z
    一、封装请求对象2 K* |9 e1 W( ~

    3 L  o7 T4 z- W) R# E二、封装响应对象
    7 W' {& p  V- y( p/ Q% G- S8 C* m
    三、Servlet 请求处理基类
    . u  g# _% R( m+ H3 e) ]8 j; J
    + f7 {: h9 a: f1 {2 s9 [四、Servlet 实现类
    5 H( C) h- Q$ `0 O5 L+ Y9 I; a9 \5 v- s
    五、Servlet 配置
    + I% Z; @  d3 d
    # n! B& V5 d1 [2 o/ v: o( p六、启动类  |" V/ Z2 d/ }) O$ V- f. p

      P/ @6 ?- I8 d2 L1 H七、测试; L5 S) Q6 j0 C" }3 C$ A

    0 `6 j4 f1 ?2 l7 n3 hTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!1 H# I+ _  `, L. y4 f' C
    , R; i: i- b, V( K5 R+ k0 K% p
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?7 F4 ?& H3 v* _& s7 T+ S& B

    4 O/ s3 `0 p! |( E$ {. z6 ]2 Q! W9 @) s( h" a6 M% _

    + b1 Z  R: C. |% x2 Z/ A从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。0 M+ |3 G, F( r" n) K
    0 ?  @  i+ E+ b3 I& v* _/ r
    4 e. L4 ^7 P2 o- j* t

    % G. j' `2 `. F由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    : j: I  l: d$ [. E+ e! P5 M& x
    0 q. j4 x, G1 ]5 p5 Y! |  ]" t3 r: @6 C1 Z! F& E& u, r

    ; X  [1 K6 K( ?. x第一,提供Socket服务: L+ s) u3 g. c. f% ^: Z8 S

    1 D9 g4 L/ o2 k& x, S
    . Z' M& ^+ t% s1 m; |& w0 @6 C  j/ k6 B( ]: M( y
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    ; p7 F, y. d0 C
    ) L4 z& X& x& M: {' f, `6 k4 r/ N4 f) T3 a4 V) u1 k
    2 N+ {. f7 X9 c/ n" ~1 k9 V
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?$ g$ ?' I( M2 q, v# f

    " n* K$ ?* f  C0 k, K, c8 y% i' t/ p. t- R5 H" u" b
    7 F% g" N  D$ t
    第二,进行请求的分发
    + d1 u" j) U$ d3 i
    + |" ]" d6 D% p0 B; p' n
    * v3 p) x& O: w/ q( N
    9 q* ], d: ~9 T0 H; s要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。( N$ c; a: W. `6 b6 B
    ' M: E" B! Z7 u; N& K9 D$ ^

    , Y* V5 l) `' ~1 w  q6 U0 P7 N
    3 x4 x: T, T; m第三,需要把请求和响应封装成request/response1 c* X6 x+ E9 d: b1 \# D: t
    ' v8 z3 o+ g3 j
    1 [2 `2 {9 d& m. a$ a' }
    6 L5 ]1 g3 P8 F6 ]3 T  F2 h* K
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!% D: G; m0 Q; z1 c+ K' K
    ) T) Z% s% @: A4 g2 z
    ! N8 N0 B8 c3 j4 A- F3 X
    话不多说,先来看一眼工程截图。
    : A; d- V3 d1 t! c; D 1.jpg
    3 V4 `+ V0 A0 |2 j  [+ \: E一、封装请求对象0 U+ D) Y( Y$ D8 K, U  v0 [
    2.jpg $ n, Z/ ?0 H, Y8 l! a5 U, T

    7 v2 N7 k' N6 s/ R- a+ Y, g# i

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


    ! v9 Q1 B& B9 L8 @* w二、封装响应对象
    ) z6 \  Z6 u$ z5 y  ?% E# P 3.jpg " r3 v, b9 \- [5 k( @4 j- E1 X0 \

    ! k" t& A1 b! d

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


    & a% T7 E( N$ i9 h& q. g三、Servlet 请求处理基类
    & E0 Z4 {. A; {3 V. Z& X+ ~% u8 e9 O2 f2 G. [# x1 {
    4.jpg
    - K# H& e6 l% `3 y7 {; N, @! ]- \( i. V& v# d4 ]5 Z7 K

    9 i  O) D& z9 c
    3 j- X! R& E, h+ }7 c前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    3 U, k$ P! Q- Q. w3 @7 H1 Q) k: J$ N9 p; x0 p6 _& W

    7 |, ^  |6 Y3 O; u 5.jpg $ D8 w/ s6 o& K/ J3 W: @4 F

    , T+ i9 c* i2 @4 [  ^( D
    & H6 j" @% S" p5 C" |

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

    3 c: ~5 G* i( b( x6 s! J2 m
    五、Servlet 配置 7.jpg
    " n# L9 o- T9 P( ?3 E4 Z! Y8 w5 E 6.jpg % q: J9 x0 x8 @: y1 [

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


    3 n! [5 F0 Q$ L: \$ ?2 r六、启动类 10.jpg & H: R4 X5 b7 F! b# m2 E' c" G
    9.jpg 6 _0 o( [5 N1 B& G+ U0 N
    8.jpg , W1 R; G/ X/ Q: N  u$ n$ }

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

    / C! _2 z, H" a% g, ^
    七、测试 11.jpg
    & c1 A, z) u3 V1 ^" }/ j
    8 ^: A9 z5 i, q' b% i) ^  l2 l' |; Q. S) O4 q( E: P, P
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    ; j$ }. J+ t8 Q7 L! l————————————————+ q% R) G0 q- B7 @2 i8 m
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。, ]* V" a; X; H$ ?" G8 h* w
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    - p4 l2 P( Q; G5 w1 e" S3 v* m5 U" c% X1 x3 C
    9 D3 O2 m5 B% ]

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

    10.jpg

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

    9.jpg

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

    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 02:24 , Processed in 0.950381 second(s), 53 queries .

    回顶部