QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1331|回复: 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
    : u9 j; \7 ^) I" @8 w
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    4 y. R5 l+ }2 N; \5 a
    0 E9 r5 u3 K( h0 e目录7 J- a$ b9 m/ k5 M

    3 l6 }7 h% e$ @8 e5 X# C: T从零开始写一个迷你版的Tomcat
    / e& Z  f5 \) b3 K6 X; N2 O  j1 o8 h
    第一,提供Socket服务, ^( P+ Y8 D. g- U% f- B4 E

    . ]4 m0 _+ @( ?. K第二,进行请求的分发
    / @- F0 D4 q4 B; t4 R% e5 s2 Y+ \, W4 R% x
    第三,需要把请求和响应封装成request/response
    , l1 t- `% A+ d/ V& J. e) U7 a; z; v2 E
    一、封装请求对象
    # H- _8 M% z8 q/ S0 q! d1 u# j
    2 }8 X6 v7 Y6 K7 f8 ^5 D; N, u二、封装响应对象
      T# O: O- @# n* k+ W+ k- e# t) z! t0 }
    三、Servlet 请求处理基类
    7 f2 ~% J  s/ D0 |, M* S: U. P
    ( J$ ]2 [& Q1 @: I; c) q四、Servlet 实现类) p) H; I, I1 e) m
    2 [1 e" ^/ }6 \9 E9 p
    五、Servlet 配置0 t9 S" z: C- Y- J" b
    0 F7 |% A8 H1 Y. l0 d+ p* B1 t7 m
    六、启动类
    6 F0 ^$ X+ _& j) h6 i$ Q0 [$ W
    ! c% y. t; b' ]( _. E) c4 M七、测试7 ]- }1 v( b4 u  g8 {8 `8 ]

    5 s# q$ s" l+ z+ ZTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    % |4 H9 E0 ?* `2 _& t
    . a9 l& |: ]7 D2 R7 LTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?9 e. E( j9 O+ Z3 _: F

    9 Y8 m: y$ p- G- k
    . j) U  D4 R3 H, I# e, J/ H, c% c( x0 x: v) K" g
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    3 z7 j1 v: g, `3 c, x+ d+ L# x. |$ T. m1 N
    2 f# J' }1 N# `/ T& A% v* O( U
    # k8 \6 d3 y/ u5 q, j
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    & ~: m% i  z& ~. s; _% X, ]2 J2 u! m$ l, d; p, _9 f

    8 ~, d+ p6 d: \6 D' i6 R1 f; Y2 @8 W
    第一,提供Socket服务
    , {0 {' ~+ ?6 C; l- H5 O3 b7 [; F* ?( Z" M. }9 {9 A7 j2 J2 }: w
    0 Q- g! g; X2 N4 q& B0 G
    / E8 k! ]% S1 J3 P+ f+ F% b
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!9 Q7 @2 O0 Q, q* k4 q4 K5 X, k2 @" l
    & Z* U7 L% ~/ N& T( d/ f% L
    7 E# y: X' v' j' r: a8 |

    1 p; k" p2 s, F4 b4 y) ]这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?# u. ?" v/ b/ i7 W. h% ]

    + v+ u' M; r+ N- _) \2 e& X. I! x, q: x% Z9 z2 _$ V6 g
    : {) l7 G5 ]" p  f* j
    第二,进行请求的分发
    9 T3 f: S7 K0 [0 ^
    0 t1 }5 X% b. r3 v( s8 @/ l0 r/ C; f7 g8 U. m6 Y  b5 H% U! C
    + Q" d3 x% W/ Y# l- K5 \. i
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    + \% u$ b- y  W* w! M. d/ F: R$ c1 X) a  `

    8 i, g3 A1 b8 e" L! D  J4 o( z* k1 p5 Y4 ?# h: U9 f# l7 w
    第三,需要把请求和响应封装成request/response
    * w' F. G2 c9 X8 v5 P- P0 l
    ( J7 v9 F/ x' c) {! `! j2 T  R4 w' ?3 Z& h7 R1 |4 u
    ; h. E# i6 `/ {% ^4 N) e! \, N
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!/ {1 O- N5 R7 i. @8 l1 {& R' V* D

    3 w+ {5 o" A4 H0 ]: f8 F' }: o' i: z
    话不多说,先来看一眼工程截图。  p  l2 D3 o" c4 C0 f7 F* T
    1.jpg 4 J# ^) L( y- f) y
    一、封装请求对象  i% W9 i7 t& x+ @
    2.jpg
    3 ~! c7 S9 t5 J
    , l. S1 Z+ z9 Y

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


    7 n& A  R5 f0 }6 I2 j二、封装响应对象
    % @8 i8 z. g1 ?+ }* _ 3.jpg 2 W2 u' ]/ I! X

    / W4 s* l1 H- \% N8 {) I

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


    $ ?# E8 R7 C; R+ S/ J, F三、Servlet 请求处理基类- M, Q5 f6 S1 i/ B

    9 W9 j( l; B! u4 B6 } 4.jpg + n! w( k, E' e6 v0 M+ j- L
    + B! l: }. x  `1 v- z

    . n7 }; m. o4 p
    / Q/ v6 t( r/ T" b) K5 H; k# k前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    . M' z4 p% s4 I% C1 i% A! H
    1 |" ]5 s: t. R  x
    4 J; @( l% e. D 5.jpg
    ! H! u# U* j: K+ j. y/ x2 L5 c( e  C9 M' k- `6 K8 r

      ^2 w) T% W$ f. F+ ~* Z9 `4 @

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


    ; a8 ^$ j" c4 V3 ~$ w9 H五、Servlet 配置 7.jpg ( k# P; }. L7 W" w' K9 Z
    6.jpg
    8 Q& [' S1 h+ D: D" P1 u2 V# z9 _' Y

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

    3 E* S! v+ G( u7 Z4 s  v" e
    六、启动类 10.jpg
    ! c( Z1 X/ X! c* R* t 9.jpg ) F/ Y9 Y. |) S# q
    8.jpg 0 H, A* ]& g, \. U3 F" H/ v

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


    ! X6 n* d, D; F- ^8 s; N+ r, l* ~" B七、测试 11.jpg
    " S0 e. T4 {1 L
    2 d" Q* ?8 J  _& c! k; H1 L- q+ \! o3 V+ ^- R3 g3 m5 n' }
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    5 w# Q4 m  A: ?6 `+ K% x% R4 i: w. q————————————————  P4 r8 D. s# h  r' S
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% a" b0 _) k( S2 D+ J
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480! E/ Q& z) d7 r6 w

    2 v8 v( K! S' f4 R9 t5 o/ @2 S0 }+ o/ E( t+ ?6 M1 W

    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-21 00:41 , Processed in 0.467179 second(s), 54 queries .

    回顶部