QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1330|回复: 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
    7 `1 S3 y$ b8 c0 Y' `" Q
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    ; l" P  `  v2 i  ]' k' O2 d0 }/ @3 b- R( C. @
    目录
    & ^! C! g6 s% n3 z& w0 u
    3 f8 r1 }+ H( D从零开始写一个迷你版的Tomcat; D! S/ g9 N* ^" L

    # a# C5 h' m: T  U第一,提供Socket服务
    2 S/ g4 e; k- S; y1 x$ X4 ^6 [  R( f2 ?" A5 R
    第二,进行请求的分发8 c. G" _6 N. ], {* v

    0 k+ t- I8 D4 i3 b0 D- A; `第三,需要把请求和响应封装成request/response- y; j& x" X3 x" z6 M" }9 C
    1 C6 F4 U) J  R: j
    一、封装请求对象3 Z) V# F- X0 n" d% |- m

    ) w/ {) i  x5 R3 [( s- S/ B: M二、封装响应对象
    2 X8 J" S1 X2 q  K" F+ i7 [7 I8 g( F. h$ R/ P5 a( N* E. h; _/ ^
    三、Servlet 请求处理基类# Y" ^+ k4 ?+ j0 U; K, P# [0 i- c& N
    + A1 x# o+ M7 @6 A5 c0 B
    四、Servlet 实现类
    6 }% u" i$ P1 |4 @4 f  L0 t/ {: O
    / R: u7 X5 H' ~: |4 P五、Servlet 配置
    5 X! U; N" B( Z2 ?8 C" d3 r* W
    ' g; w7 L+ E$ T# ^! I六、启动类6 ^) c+ U& M, O  V- H
    $ c5 w6 G& t1 }, }* Z; K/ v3 x# t# r
    七、测试2 l8 H% A% Y0 I" v7 O2 o* Z( H4 C

    ; c4 G) g6 W3 D7 L% u, z, c; F1 B9 MTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    / V1 e# g5 D4 r6 K: E( O3 _
    0 V9 O% ^/ ], \# a3 x6 mTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    ' i7 r4 H% |0 V' h; e9 S( C/ |; W, I7 K2 J/ D( x" u. f8 _6 Y  _6 r( _
    + |+ o& d* s  U1 w
    ' y2 K3 I9 @" [3 M: y; Q
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    # ^7 r- N6 L& @( Q4 K6 `3 s; g/ J1 T- ~& R; e3 S) N9 h! C/ r
    7 y1 \6 D  H5 g3 I# \3 J
    9 l7 y0 L4 `: B
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    ! c0 U* ^( Z& O
    6 R- |  C8 |" l; Q8 K) a
    ; Z0 u: O: E# W7 ^
    ' K' Q" H0 u6 k5 g9 K+ X第一,提供Socket服务
    6 o( ~4 K/ j  Z/ e' v, S; ?4 ^
    2 T6 i+ I! J9 m  n+ p9 O

    7 H: ?3 P+ `0 A3 \' C! yTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    ( Z7 z. k4 B+ L7 l9 r* @. F/ M3 m4 |  q: P6 g

    ( a3 f* X5 A9 u" f2 N2 S) U$ H: `6 t8 C2 ~+ W# k4 X
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?+ f$ ?8 E8 l, \$ B* p" D, ?$ q
    - G7 B* O' p) o
    ) N1 I# `& b5 y5 q
    + \8 m: z; @8 u4 y5 ~9 f* _
    第二,进行请求的分发& K- n; k" b  \

    # F: n9 F+ {" _' A0 l$ i% m& c% c/ H. K- L

    8 C$ w8 \* H- A' n0 `要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    1 u$ a2 `/ Y2 X/ t
    , p) P# X; F; D- |; L6 n8 k# `
    8 C; B% M# x# @" M7 h, n/ x5 A6 ?
    4 w' [9 z" X! h( {$ `3 L第三,需要把请求和响应封装成request/response
    3 k& H4 V1 Z* o: [
      ?1 ^% s* I9 Z, s: ~5 s6 `0 o& p% b* k  c; w& i

    3 N- m, [. O3 B1 T1 w  l我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!1 V' p* q$ r  H

    ! N4 ]( B" K  I7 x/ x' m
      i1 d1 s3 a* I" ?# Z; ^5 s  j6 K话不多说,先来看一眼工程截图。, |" j2 }- K7 |% f8 n4 B  r) Y
    1.jpg ! a$ h3 G  n  g6 B# m8 K4 Q3 D
    一、封装请求对象
    3 Z8 e* Y; _1 K0 D9 j" P6 Z% o 2.jpg
    , t8 ^% H) P* C! }3 e6 I: ~1 _2 J7 H8 C

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


    * g' V0 }  T. k& F二、封装响应对象: U1 l" M+ `3 V1 |
    3.jpg , j: e, l  Y# h5 T
    $ }3 `+ ~1 ~9 X" f( O$ R9 S

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


    ( |) k0 ~$ q7 S) g# H$ C三、Servlet 请求处理基类
    ' T( q, W, I. [% m4 }5 w$ y+ L7 O9 D6 q" [( m) M
    4.jpg
    ! C, a& U; V- t; _% V2 e
    7 a+ m9 {( f) k7 u, R4 S) P
    9 z( w" j+ X' h& [
    4 I. d% R$ {. p7 |7 X0 M前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    2 n/ ~! ?9 K$ [
    ; `+ u3 \. W3 Q8 A7 `; A' F+ Z/ n! h) I
    5.jpg 3 m6 k* |1 ~% P6 R6 Y9 T

    3 x  [' T* B# L" M+ a* h$ G, O+ g8 i! J/ w" I9 X+ c) l$ L

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


    ) C! M6 N2 ^1 z% ]1 s, q五、Servlet 配置 7.jpg 1 d' j/ c* b) C" L0 i. M- C
    6.jpg
    ( f/ Q1 k( j& k$ N" G

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

    3 w: g6 z4 h+ H4 v2 l8 k
    六、启动类 10.jpg 7 {( K0 y5 O/ t% p5 e, {
    9.jpg ) K0 H% T! w2 L; `& n  [
    8.jpg 7 v+ u8 H7 \" p

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

    : H% i* ], W" Y3 d( u
    七、测试 11.jpg
    & d% m- X6 b! ?, b% H0 l0 c- l9 b4 o- U7 {$ c  r

    # I; s" ?" i, K* T1 Z实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
      C: q8 G. ]- d' [————————————————$ Q" ]* e/ [$ a% {# Z7 ~0 q
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    . x/ E' X" E' C原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    . Z- K4 y% g1 _% V% k3 D4 f( r" |. s6 k2 I: g# r

    ; e0 \4 B3 q* O

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

    10.jpg

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

    9.jpg

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

    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-4-20 19:30 , Processed in 0.445993 second(s), 53 queries .

    回顶部