QQ登录

只需要一步,快速开始

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

    . |' J1 ~3 x" V% [  {从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat8 Q+ x# b/ B) L# b; O% C- p
    + v3 {* M- Y$ G; M6 K5 O8 H0 z
    目录
    6 E5 \* E' M1 V4 D
    4 p# T/ K, p! @& e* }5 s; l2 B从零开始写一个迷你版的Tomcat
    6 p  ^, x6 G) `+ [2 r, L
    5 a% v' r( B' R/ z3 C第一,提供Socket服务6 t5 s- S9 W; N

    ' W5 R* l1 z+ ]" G  r% \3 y5 h第二,进行请求的分发
    ! o! T# h# D+ l3 J
    0 p* }- f1 D- Q+ C; z4 n第三,需要把请求和响应封装成request/response. |0 Y3 z$ u! ?) o

    5 {& H( M; |; }一、封装请求对象
    2 q8 I$ `7 G6 ~( u. X
    8 K% x, }* K, ]$ A5 A二、封装响应对象: W! \4 q5 A9 g+ V! Q- D

    ' M4 K% z7 \  P) V0 W三、Servlet 请求处理基类% c3 q0 K" \. |; Q, l( d- z* d, d  c

    . a3 F* q) G/ c/ I$ d四、Servlet 实现类; ]3 i; G% E+ Q% k7 \4 P% W
    ( T6 f8 t0 c3 H' i0 t
    五、Servlet 配置
    / t* r( K5 Z: @9 C& \6 X2 V/ I0 y4 h: Z5 V+ s" t' H
    六、启动类% D& u5 u- L- B! |" c% c

    7 D0 o7 O% V- x七、测试2 d- B; k( }! v. l

    6 L6 B$ q. i; \( K+ ZTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    : ?/ [( b! x6 Z$ X  w: ?9 p5 E
    ; X2 s* x0 F8 U( _3 F, rTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?" z* y7 _' X0 z3 Q4 c

    5 k# b% q2 W. _
      t& R9 S2 h  R5 m5 [
    5 L" D' g% C/ H: g从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。
    . I$ E  _1 z* H$ s9 R$ F- W1 ~$ g7 u" L6 _4 q# f) @

    . `7 \& k& l9 _- N) Z( K
    % ?# W/ L: \2 q9 `0 W由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。! G4 @: a, ?) w' \3 b2 V! B
    - ]' C; b  f" b) J
    ! m" |' }) _" {" i0 x1 ?* d' m% [
    4 W, a6 V8 A) o: J5 x
    第一,提供Socket服务
    ! b2 Y6 u% w4 @# u+ A2 C- n6 Z8 I% }( r; O7 b
    / M  t& ~& s1 r& _2 E; `- F5 M
    2 @2 Z/ R4 E. o2 n) l
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!" M$ s7 I7 H# M' I% Z

    , l* d  [7 `$ ~7 }; B; G0 k0 X( C* ~+ t
    + p+ n7 M& c5 N; h% R; O: V1 p  g# `
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    3 t; B7 |/ K0 T' l
    / _2 |; l. z- p6 l& `% L9 E4 ?0 H6 U& _. i
    & B1 ^9 h4 l) y* G- M. y3 T
    第二,进行请求的分发
    # F0 a- X& n7 `2 f2 w$ H
    ( w* M( G8 c  r# w
    ' K0 u1 S5 m* A7 H
    7 J- q& s) L  `) M要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。# |. |/ T- {* M* }4 H) ?& n

    % `% V" i8 d. Y9 [; M/ D
    ) Q! P* D, C! r4 p  B2 I7 f- c8 c! L4 U  K: A' X
    第三,需要把请求和响应封装成request/response6 ?2 l* ?& W: K

    6 B- V: S* Y! L# Q. w! Y1 Z3 O" g) O$ G7 P9 j
    ' [- v: Y9 a3 i' x% h1 g9 n
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!8 Q7 @1 Z( e, i5 `7 S7 T3 G

    . Z7 h) L) J1 f% I; R4 w2 \7 J: i, Q; F
    话不多说,先来看一眼工程截图。
    8 k. T- A) e- O+ T! V 1.jpg
    2 l0 n7 k7 u$ g; W一、封装请求对象" }9 k. L1 j! L+ M$ T5 n6 P
    2.jpg
    + A9 Q9 s! m/ S$ q2 t7 ?1 W9 K9 N! Q' p) `+ @

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

    $ x/ J/ x  C7 b1 w; Y
    二、封装响应对象
      Z& I5 D; w* L) G0 F* y' J 3.jpg   [4 E: ~/ c4 I& A: ?# N8 A7 \" C
    " s  H+ K$ m/ ?; }# _/ l/ B

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


    8 x. i+ V- ?: K4 N. {8 F6 I, ?三、Servlet 请求处理基类
    ' h& a' L0 Y* R! r, q
    * j' ~& I; J4 e2 I+ ~+ \ 4.jpg $ z& `) a2 {3 S: ?. I0 Z% y: I# h

    # G/ T+ z; }8 t! X/ H2 @8 T; {  R8 A7 b# J5 c
    / i: \8 X7 g* ~7 I( r* Y
    前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。# Q# \3 U! _& ~1 \1 ]8 ~! P

    9 a4 v4 ^' J: r% k4 ]5 f9 n' L8 A$ A" `1 k
    5.jpg # L( F. H# W; z0 b& S7 z9 s6 H

    : O# K: t* S2 ^# N% [- e; m/ ?5 s! ~7 U, v  t

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

    1 \* V; m! O1 g! O9 T, `
    五、Servlet 配置 7.jpg 1 D) u2 @6 u) j4 j
    6.jpg + N) n5 J2 L  E" D$ Y# ^

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


    5 P+ {. \' b  K4 W1 p$ b% g2 j六、启动类 10.jpg
    . R0 Y4 L; v( f6 H( B 9.jpg 0 a' b, I& f, Z3 @7 k
    8.jpg
    * w5 U2 m; L9 N/ R

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

    . I& J9 Q' U" T5 p- k7 j
    七、测试 11.jpg
    $ h8 F8 t7 ^" X* T
    8 o2 e5 }" C$ i. F
    9 _, J  l: }, ~实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。# K9 ?/ @% P+ r3 O, w4 b
    ————————————————5 G1 V8 T1 B$ A" R4 Z
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    : z/ d6 e! D  M# ]- h原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480- c, n7 j; a0 l

      g" m( }- x+ n$ N: |) H4 [% n8 k2 f

    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 18:33 , Processed in 2.043441 second(s), 54 queries .

    回顶部