QQ登录

只需要一步,快速开始

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

    4 u* }* f/ \( E从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    , l5 `; q) C, X. M5 U1 A4 O) n) d: u! c: r; B7 R
    目录
    + B  Z0 _% ^7 X: J
    , l  z) {: F; ~* _- s( {  m从零开始写一个迷你版的Tomcat7 p$ n; |! C; L# v0 N% ~
    " J/ \1 [7 M2 V' U0 Z
    第一,提供Socket服务
    & U4 q  b8 R) V( L* _6 g) X, x$ E
    ! I8 @: t2 c& B* E; _6 f第二,进行请求的分发
    & m1 R: ~7 O  B: L
    ' j1 B5 V0 x, q# v$ t% p- d第三,需要把请求和响应封装成request/response5 Y" X. {1 _& i0 Q9 p7 a

    ( v- I) O0 P" h- q0 c) V一、封装请求对象. K" H: F4 [$ D" p

    0 i) k  t4 r0 u) E7 H二、封装响应对象5 n% p2 @3 r& X9 K9 r9 `, c

    $ |0 I$ V. K- ]  G% M三、Servlet 请求处理基类5 U9 }0 K% ]1 d# s; z! M" Q
    - |. J- p: S7 E  d
    四、Servlet 实现类
    1 }9 E0 e# @; Z6 U. z8 V+ O; d" V0 n$ l* }% h5 v+ ?8 {
    五、Servlet 配置
    4 [& D1 a6 f+ D  x3 Z3 E( {! p$ E
      {5 p" p" A1 Z6 c六、启动类
    3 U2 X# B8 w  m) c/ X, U" G2 y
    ) t: N! x. _: F" h8 x$ ^七、测试* K  O. y4 h% R6 k3 I* J) [' c2 j

    * C0 z: w4 K0 O8 P4 l1 D9 MTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    5 m, i5 n) S. ~
    ' h8 e8 F% o4 ?& B) X( W" R) }5 K; [Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?. `6 q, S0 r9 A8 c1 q, B

    ' X; ~) o3 ~- p& S4 a
    $ Y: X- S9 g" K; }. v, {
    ) d' ?& J4 z8 F从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    * N# E3 c, M. j0 x8 n  U9 i1 a
    ( z0 a( P' j9 I8 G2 b# Q' \8 d! `! p: n1 x6 }3 i& v6 e
    / e# L  K4 c! i% R9 B* }9 B4 m2 x
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。2 W% N! J8 ^0 k/ X1 U

    ; K1 h8 c" |7 N* n# o
    ! L: {- t0 ^, f
    # V. C! C! T" ~7 |第一,提供Socket服务
    9 m  L) P  A% w( a! h% q! O% ~% l' ?. E
    2 a' s) Q3 M( R' A: s4 G) H
    + P) {8 ?. @7 x6 U& ]  O7 H
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    + `; t# U% N) {- Q! D) m, M, x* G6 {
    5 _9 g& d8 H  t9 t
    4 M- v! ]) z# b  }# x6 A; D+ f: n9 O( C& k0 E( B! c1 }
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    4 J/ e- T" b7 I& [, l# c
    , |5 Y/ H8 g3 X- G  Q3 O0 z; \
    - V- P$ {$ r5 {2 d+ S$ q' L6 l8 w  {; P
    第二,进行请求的分发: s3 x/ u3 f$ c" B7 |

    " {1 h+ I, O5 l& H* N! Q% m6 Z
    . O+ P8 B( ]7 W$ w6 k) S8 B7 b; i- Q+ S' @7 n) P/ I
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。! Q! j" |# h; e/ p4 [1 V

    ; \$ r* H/ b- \9 @- Z5 C  t7 c2 n# B* N$ p0 s

    2 v* _# Q; ^5 n7 z. s6 ]% |0 O第三,需要把请求和响应封装成request/response0 A2 n. i  k7 ]

    " E. u* u: A- e0 ]% t% S9 r2 n8 o9 b' j
    / s- H. M1 u/ i
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!  `0 _9 A0 s5 @! W" V& Q
    5 o+ v8 ^( j$ [6 P2 E* N
    ) K2 M/ t( M/ v
    话不多说,先来看一眼工程截图。
    1 q, X" j: X3 D2 V 1.jpg / Z5 N- N8 N0 _0 H' d
    一、封装请求对象* g& ^6 X# V( m# L" e' i0 C; J
    2.jpg . C+ K! j9 Y2 Z

    8 A8 y4 ]7 O: {+ l! I

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


    ( C# P5 W1 ]' d3 \二、封装响应对象
    5 s* e* ?  ]) \  v# n$ L% o 3.jpg & W4 [8 ^* `1 H. Z8 ^
    6 ^$ A; f+ }. C5 P! r5 b) H- Z

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


    / V; L! L1 e! [# R; j/ }& C2 _三、Servlet 请求处理基类
    6 _# ]; p8 Q( w& f& W3 @
    5 S4 m- d2 ]+ c0 M. F8 V+ S% ? 4.jpg 3 E  R' z+ q" y1 l  K1 [

    8 `3 Y. n% h/ \1 g7 `$ `
    0 G, O- M8 v% S/ a% _* U% p; p6 d, ]
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。, `" d/ v0 ^0 X% |# R
    8 F4 H" U$ i- X2 @! [4 Y
    8 x. ^) P$ L9 h( n8 X% z1 M
    5.jpg 3 d; y0 T4 k4 e! f+ u* p

    0 e3 P% L! g2 i! u9 H+ y3 D: t: |" ]) _" m% _

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

    2 Q# x2 t2 A0 K
    五、Servlet 配置 7.jpg
    ( @$ K3 V' k- n6 u 6.jpg " E3 v- V3 d; c

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

    - Q1 g" Q# {8 M8 R4 N: \' d( X2 _
    六、启动类 10.jpg
    - m  ^1 ^. Q/ w4 Z' B. `+ Z2 m 9.jpg
      T0 T4 [8 c, d8 q3 v4 s 8.jpg * W! B+ M( ~9 A2 g8 {% Z  c

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

    # K2 s3 m. Z+ F% J
    七、测试 11.jpg + I7 w+ o0 ^+ w
    - S- f1 v% G" g' X# d( Q' b
    ; v9 M: U5 K3 N
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。. ~0 k% w; P( p. r7 G7 X
    ————————————————
    * ~* x8 o1 X; I2 i版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。9 a, j# Y4 t( I+ t
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480& `8 M3 Q+ \! `4 @
    $ i5 v$ H2 _# S
    . \( V# D: r8 G% N4 W  X7 o

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

    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-19 21:52 , Processed in 1.683447 second(s), 54 queries .

    回顶部