QQ登录

只需要一步,快速开始

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

    - |  {# e* r% }' i从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    2 o5 ]3 H4 X8 w! U- i3 [# I: T) a" Y2 S% M
    目录
    & Z: m7 P9 t8 R7 ?" g2 N8 l7 F; w: J( ]
    从零开始写一个迷你版的Tomcat! ^7 p3 c$ b4 \6 h) a& g! u

    8 F8 |" N; U7 b9 ^4 L4 H0 m第一,提供Socket服务. X) a% @* G8 x( m0 ~5 _' ~# s9 u
    % F& ^- z, s& e* a6 z$ T! a
    第二,进行请求的分发3 H9 G$ n0 K' ?% K

    , {! a3 O4 E; |第三,需要把请求和响应封装成request/response
    6 [$ _' [3 ]: m2 d* i+ @" ?" W* G) |  S7 G# y7 V6 g! p7 Q9 m: X$ Y
    一、封装请求对象/ D2 r4 o+ k. `! r3 E+ ?+ Q

    0 x& \, Y, b6 @& G$ z: J二、封装响应对象
    3 j' ~4 R. B* c, f7 O* Z+ X$ R: K) u* K1 `% Z5 n6 Y, {1 n! P
    三、Servlet 请求处理基类; b4 J7 v1 b- T0 E4 s  p8 C7 h

    7 B7 Q5 B# ^, r' @5 T0 c四、Servlet 实现类
    6 T  H, W8 R% ?
    7 ~% {1 O) v3 K$ N/ H$ y* F4 V五、Servlet 配置
    ' ?+ [3 y0 [9 Q4 o& z1 h* t
    9 O' P, c: Z  [3 F* p六、启动类
    + D1 s$ I1 G* D. E. b# T
    1 d6 p8 f# r# z7 d0 I七、测试) o. W. ]; P" m0 c' N; L- N9 v/ m
    ; a! L# ]* c9 L8 X# N) T, e5 B
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!( z7 a5 m' p3 ^: D$ q3 M. B. \# F

    # J+ c; {5 C( N* l# TTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    , Z/ J/ x% |' X! ]9 Y0 ?9 T
    / K4 `& o$ j, L: _. w& v: M8 w& F- {& V
    5 \/ {$ T' A% C% O: g3 x* V
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。7 S7 r0 @7 |& u% V. ?

    6 @" u- u6 ?6 q- n$ ^
    7 x' e1 n" S- S, H2 r+ ~
    7 m- m0 T( z& W* ?4 N+ x9 \由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。( G  M. ^* N* O3 V
    : W; o, t+ J, ^7 ]3 v
    7 h$ b# Q5 ?8 O$ a" w3 P! N' T

    % e2 o" B% Y+ i. d9 g: M1 }9 M4 O' u第一,提供Socket服务  i( v$ e# Q6 I# z) C  U
    2 d. V% L6 r, q8 r

    1 O0 ]  M+ q4 {, y, S
    4 f& P+ b0 Z- a1 f! DTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    0 G# s9 H* I, F0 J( |9 Y
    # i/ c8 ~! R6 T$ o" D) |( K5 K1 g/ F8 ?. g' _

    : N7 T" u$ O: n  e( g( J  V0 s4 R这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?+ b1 Y- E/ A' j3 N% ?) D
    / X: j) \1 S2 Z+ v( V

    1 X" F+ Y$ A" R9 S. N( \( T- x* o" g; L% a# y. j
    第二,进行请求的分发
    + Q4 t8 |# @$ F6 ?+ m
    6 \6 n2 Y; U5 z' l6 l! x# [5 `5 G, s. f  c
    ) @: K* I1 q& v' \1 N' I! z
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。. s6 v, q* ^# p) j& \0 u

    $ o8 s/ k2 }/ [0 R6 Y1 z: V# v
    3 B$ E+ S  t1 C! T6 Y; a7 {8 Q! Y# w8 }
    第三,需要把请求和响应封装成request/response
    # g" V+ K/ s4 s; ]5 ~) ?! s8 p# H
    # B* I! {+ G) r2 ^+ N
    / }/ s, I. L3 A/ V5 t4 T1 q( v  @0 b$ p5 I# z! j  q* Q$ o
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    ! \% y" k* j# Q$ `$ |! h2 N5 l. [" s% ]
    ( C" ^& {( I; ]. K( ~
    话不多说,先来看一眼工程截图。
      b3 x! I7 l: V) m: p& A! C. b0 Z 1.jpg
    ' D5 w/ I0 Q3 w一、封装请求对象4 u/ _* b* ]9 G  ^. c7 O
    2.jpg 9 x; G0 m8 T1 `% B. f" }1 U0 S

    # a& j& e% H) |6 k" }. m

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

    # v1 [' r8 j6 J: i/ _- n: O
    二、封装响应对象
    ; l' y: P1 M' Z" X. ]3 d* P 3.jpg ) s' ]8 o  E) p
    6 O" j: u4 p, H2 e' Q

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


    + m# g) [! f) m: w# E& X* v三、Servlet 请求处理基类
    5 S4 A9 h. y( w4 u( ]) [, K+ k5 j3 K0 D
    4.jpg : F+ p) B) f1 h8 m5 Z$ K

    7 J5 K. M7 u+ G1 V6 F8 w) d9 W6 |2 c  I& B- V
    , @5 b( R% @6 i% T( L! @( d- J
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。4 s7 x9 l( @  u; \

      z6 h2 }8 c3 d7 b. u5 C7 h; l6 B# @# e& A
    5.jpg
    - k# G  F' y& L, M0 X3 q0 _; J; v% T- z. _
    6 ]3 z' a0 H) L* y: w. ]

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


      M3 t# l7 U' X4 U五、Servlet 配置 7.jpg ( B$ Z! F+ {; i# p
    6.jpg 1 U2 C0 T$ Q* x# v; A# C

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


    & k4 l4 A+ ]$ c6 ~3 K六、启动类 10.jpg 6 I2 Q* w- W7 L5 i
    9.jpg + Q9 Y5 O8 ?0 R/ ?5 Q. ~+ g
    8.jpg
    - Y4 S2 f  Q4 K  O. C. B

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


    0 m1 W! u' a5 ]0 b% ~% q& [: }七、测试 11.jpg
    7 P' R2 c) j% V: Z; u+ G% w; H6 L5 X3 u
      I& j6 B  t( q: H6 U& U
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。0 N8 g: |. Q" b2 r7 H
    ————————————————. f' o5 B  `9 a( K7 D5 V9 \
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 _! N/ G0 t4 m0 b8 w+ N- s( Z原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480  P( W8 Y/ H/ c' `9 |1 S. Z/ a

    # z4 ]" @' c# [" R' e
    ' M5 t' e. t6 j4 Z# v! u3 i6 T

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

    10.jpg

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

    9.jpg

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

    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-6-9 19:45 , Processed in 1.823791 second(s), 54 queries .

    回顶部