QQ登录

只需要一步,快速开始

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

    / K+ F- a( b: ^3 y" i  N1 [从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat0 W7 o, k8 t% X, u( H

    8 k3 [  I' f3 ?6 h# L" g* L目录2 [! [9 C) D9 L5 y5 x( m
    ! b1 q0 |/ }4 \. I
    从零开始写一个迷你版的Tomcat3 f. f6 D& o- [/ N* O* {
    " Y- G2 ~; _# b) N
    第一,提供Socket服务5 @5 o2 S, c3 b+ K9 I  L1 w
    1 B5 E, f" E; R9 v$ {) ^7 ?
    第二,进行请求的分发
    * ?/ V. F2 b! \4 G' {4 Y
    : k/ [! b2 E0 ~6 b* x第三,需要把请求和响应封装成request/response
    8 `5 x- H9 ?+ O7 }. @* R2 r# N
    一、封装请求对象
    , q8 H- F9 {" N9 j6 h+ U9 ^
    % t8 H8 G  t. @3 r; G: P二、封装响应对象
    3 \) P$ E, a- ]' C! j7 D
    1 a' p% h3 Z% j+ S5 r0 ?  q三、Servlet 请求处理基类
    * U/ G6 p# Q# [; h3 y1 y: V' _: ?! p& ^+ u
    四、Servlet 实现类
    8 [" D6 A  N. [7 R8 |
    # `, v4 c/ F; {5 R0 E5 P五、Servlet 配置
    : ~8 Z( W7 @5 V) E4 x  j' Y) v8 H, k
    六、启动类
    $ q( J& j  O: c4 }$ P8 n% _' U8 `6 [8 [
    七、测试
    8 w$ h3 Y" M6 t5 U: f/ r
    , p( M7 ~$ ~3 e& U& k+ aTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    ( u; Z" E# S" m
    8 {8 O( G! Z9 K7 H" `8 NTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    * i  N4 ]2 O! F0 I* N  q! Y& _  K  `2 h
    . x1 L& l" T; L# A
    & Q/ B- g) m! B# |. x3 u7 r
    从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。1 A2 F0 J# r. S& C5 G

    : W  H. z  G. O+ ^. a. U9 T+ H8 w& z! j- ]5 r
    3 F/ v3 {) q  K2 k
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。1 g* H$ f8 A5 O; n, w+ z
    ( A8 K, ?" ]$ m% U2 e2 `

    8 Y$ |  I) |" w9 z0 A- k# g! n. u7 s$ U8 }& e' g
    第一,提供Socket服务$ @3 N2 U( K1 R2 ~6 {" \7 m

    * K" n% O5 j5 ~% k' o0 d4 D0 e3 H( t2 V5 J' S
    7 ?. ]8 z( m7 P' d0 B1 H4 l9 P* b
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    8 T% P9 B0 j$ Y% q7 u& m% G6 A$ w- p4 h
    0 C0 ]  ~# v9 @! O( H

    9 O' ?7 ?8 o2 Z$ r- C; c这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?9 L9 M9 d* v5 R, W& m
    & H( c7 M$ R5 V$ c1 b

    5 |, ]% i/ z+ A- K6 J7 O
    6 s& l+ u2 H# Z, P第二,进行请求的分发
    ( L7 K8 G$ _4 i% H/ K! B! p. O0 |  y

    % Q1 q# k: s; ?' U  j  m$ O) U" Q- G! w/ `, J2 [
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    * c5 \/ t5 X- p3 j1 l' |, k! n# s: u/ W! o
    + [. v- y* i$ ^! h  F7 X" R
    ! V! D) q% O  O* U& e
    第三,需要把请求和响应封装成request/response
    5 V2 |0 C. f) o! O; K+ a* b  D& x5 y1 @1 f. C, ^

    ; Z. F% c8 ^7 l8 T* \. E& |; \0 U6 R3 j2 e# G, ^- i
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    ! h' {; u# F" |' b9 }, d0 Q2 j$ f! d/ i0 A, m' V) |

    : h5 r5 U, |  M8 ?" O6 J$ D话不多说,先来看一眼工程截图。/ N% A- V7 T0 P
    1.jpg 1 G1 v& s/ d% J; d( u. `
    一、封装请求对象
    ! g- z3 y/ u3 I- Z& S 2.jpg - o- j; i2 d( b& n) o6 Z) B; l; o

    $ F$ i9 J9 T6 ~. q+ v- I' K& q

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

    5 H, k: M/ Q9 h6 k% I& s$ \1 f9 M# w
    二、封装响应对象' F" d( a/ K0 h+ t
    3.jpg 5 j! @2 q4 |: J5 k# u# n
    9 a' ~( a4 v5 v7 a  e2 W* L$ [

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


    4 D) S' k) q8 J$ x三、Servlet 请求处理基类
    * M1 k/ o+ @9 f1 h4 G3 x! x' q/ M1 ]
    4.jpg
    1 B! p  Z+ l0 \2 ]. B$ R' i* ~2 I% V) Z  |0 b( }6 a' g. |

      [5 c2 b) [6 v" g$ F1 Z7 D- c4 H! @7 G
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。9 |9 |7 `; G& T3 h$ m4 j/ \
    : b" b# O# G  z
    * [0 \' g" ~9 E0 }: ~
    5.jpg
    9 t/ B0 e, @- [' a5 z2 H% P/ h  E# R1 n5 M/ t& C
    4 B* P% U/ Y) T6 v; d; p

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

    5 a* a4 N' q/ S9 [+ A# W# o' R; R
    五、Servlet 配置 7.jpg
    ( p5 k( ^" l  G' _2 }, @ 6.jpg
    ( I. m; V3 g2 V4 P5 i) `

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


    9 N& J& t8 j' o% K( Q8 T六、启动类 10.jpg % N0 `6 x+ _5 Q' j" v$ Q
    9.jpg : i% B7 m4 ^/ N( e
    8.jpg ( C8 e# T5 Q$ G5 @% f; Y& f

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


    9 a* i- ~3 k& i七、测试 11.jpg   I6 @6 w" X0 f) m$ Q: R

    8 A, `. R$ _( W. x" C
    0 [; E+ f  @( q: f实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    1 N( Q4 M- N+ ~9 ^————————————————
      `- A# e. o3 I( Y: O) Y版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : a5 c5 O8 S0 u9 f0 b原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480! k0 D5 F. l7 V0 A; _* z

    ( [' o( s% i, H! _' w+ b$ X5 m5 e( f8 ~, y

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

    10.jpg

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

    9.jpg

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

    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-10 15:16 , Processed in 1.190301 second(s), 53 queries .

    回顶部