QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1353|回复: 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
    # @0 a- }; `3 Z4 F9 T
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat$ T$ M" I2 r  D

    # q4 [) M) i4 S7 w目录7 m5 p- W5 O  C: x
    & i2 I1 P- Q- F8 e- H7 s* v/ V8 Q
    从零开始写一个迷你版的Tomcat
    + m. T+ U& T; X7 l
    # s" [' b6 ]7 f- h第一,提供Socket服务
    ' t) y% Y/ w+ N' o5 T, ^; f7 T1 p$ H8 x2 Q8 \$ v3 ^; X
    第二,进行请求的分发
    ' h: T$ g# d3 h3 [! K# c& Y  d* N5 o! b: w
    第三,需要把请求和响应封装成request/response; F" A+ v, r9 a! O+ A

    9 s6 _4 Z& y; B$ c& ?* n一、封装请求对象& R9 w7 y  {# P3 M& u1 N7 i, L0 f
    ) U5 ^7 a8 E+ W8 D* M5 a( w6 {- B
    二、封装响应对象1 P- ^; `7 _9 ?+ K( V; J
    ' S! A; x, C" `9 P& h
    三、Servlet 请求处理基类
    - o4 V5 T) }! L- ~5 D" \. k! B: a' t
    ! ?, K7 G: }0 g  T- p# G' k四、Servlet 实现类+ R+ M* b4 |! F* [7 r
    ; L, i  A9 {' _. Z# @
    五、Servlet 配置
    # {- K, a+ K' T) R5 r5 R
    4 W& q7 `; n+ k3 t六、启动类! M+ s4 n- t2 _- y

    * W2 q5 T- D4 _& C2 F七、测试+ ]0 r  G2 v  h, ]. L2 O% |
    + x; d, f5 j' ~4 U
    Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!1 p" o" q9 O; v. [/ C: r

    / s; r; \! i  xTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    - s" L# r$ u$ r$ B: [
    2 M5 X. M) O/ u' R
    1 P+ C4 v' ?. k# w2 P( S7 b- j/ [7 M: ?0 a9 H# I/ X; v
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    ' Z$ B/ g8 g1 D: P1 K; a- B9 d. k
    , x% L+ `2 O( r' t; v! _, `0 |
    3 A4 `7 z8 F" i! I2 A6 ?- y( ?. @3 v5 N! Q2 s9 i& K! N6 r
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    " p( B9 A+ C( c1 [6 V2 r- G* K0 L- p$ d/ L5 l! l' \! d& [8 w
    - Y# @& [, l2 [$ m  ^& O% \' B9 p
    3 |! ~4 z3 n( ]
    第一,提供Socket服务% U2 J' }9 k' F, y' u/ o

    $ R0 p: ^: h1 z1 n, x% d4 P  x1 ~6 Q4 K

    ; s8 r) w" a# x9 QTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!6 [5 w2 r9 n6 K/ n+ M+ {; j

    " \3 d; F( h9 g( H  |: f1 n' I+ \% A. P2 J  ~5 {! [% v9 S
    1 R5 ^& h6 m! D. ~3 x
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 h/ `$ g& x  c0 R9 l6 Z8 i

    8 h# W( s% p3 {/ q% I
    1 q% Q( F5 \+ U4 c9 L0 i0 |: f+ ^  ]0 ]. V
    第二,进行请求的分发# ^0 ]3 N; g: f$ e
    5 U" N7 V9 K# F' K% P9 t

    % J2 E7 U9 |7 F# S! V! u4 ^( W, |( X: ]! T
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。2 R9 G) r% N9 V
    $ P. C+ W  i+ Q( x. W

    % L8 V4 W% o/ @3 {+ i9 q- y' c1 `8 i( B7 o0 P
    第三,需要把请求和响应封装成request/response
    8 M4 L- X- L5 S0 G% `; y, c$ K, e/ q6 O4 B6 I
    ) i1 H3 m6 `( X+ |4 S
    . G/ K& H4 _* U( H+ z9 g
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!& \; j9 @" A6 t) f! M
    0 I5 Z+ F/ U9 H* K$ d

    * G$ S' c6 A: T. e3 B1 t/ c3 w2 y话不多说,先来看一眼工程截图。+ T/ O2 J' k% S4 {8 D3 `* A, }
    1.jpg
    " C6 P% M, W' D! @9 ?3 l# m一、封装请求对象
    9 v" K& {( |! b) }1 M; D 2.jpg - r* F# C6 f( x8 G" X- X
    - {$ @7 |) w  M$ K2 E9 y' ~# t

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


    # x7 ]/ b+ y! U  y1 R4 N! r二、封装响应对象
    ) F0 I+ ]) n/ H; V6 u) O- r' p 3.jpg 6 z2 [* G7 L7 h: a

    & g, w" `) [0 n: l: w

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

    - Y6 ~5 N3 L! s8 l
    三、Servlet 请求处理基类( U' c5 V* y: a# X" J" s" J* ]

    6 ?2 ?4 p" w/ D* u' }6 A& } 4.jpg
    + T& E& S! J' F
    ( ]% ?& g3 e/ h0 Q! C7 }) [/ O# ~! m; C; |! n5 U- m. `
    % {( M6 o1 A9 r. N8 i$ P! w
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。7 i7 j* l9 y6 h
    ) R/ J3 G$ P) q' @* ^
    ! A' z; S) t1 @, a  k
    5.jpg
    8 m/ c9 W; ^0 ]/ y( R% `. y* H
    " _/ i. L/ `: O/ ~& n5 ?: ~+ C- i6 D% i

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

    $ k& {# W) y5 I3 g: h
    五、Servlet 配置 7.jpg
    / Z  [$ ^3 m2 M. z- Q& s 6.jpg ) R6 J) s$ i% L( n7 H

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


    " [# ?: ~) d8 F六、启动类 10.jpg $ k8 d+ p/ S  `$ M
    9.jpg " y, |$ K, E2 b2 k
    8.jpg ! }1 e, w" p& H4 f+ v2 a- N

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

    9 E6 r  ?$ u, k2 P' o' n2 k
    七、测试 11.jpg
    $ p. K: _6 D/ y
    8 s( g# k1 _8 s! P: [, i& v+ t
    ( S. C( x8 F0 Z% x8 j) S  N  A$ ^实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。& q3 E$ V1 ^& m% Z7 g2 l4 q3 p& I
    ————————————————
    0 c& R9 s. S0 A' P版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    & h9 J7 f, K- T; {- k原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480* m, l- \5 @# G7 ]! a

    6 H: g: I' Q5 T- z! o. n) r, ]9 N6 H# l; [& G$ Q/ @4 v" K

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

    10.jpg

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

    9.jpg

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

    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-11 21:10 , Processed in 0.449080 second(s), 54 queries .

    回顶部