QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1365|回复: 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
    $ I% ~: a  U, M7 Z' n
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat7 E" Q. g- Z! C! W% R, B

    6 |) u7 G7 o  ?# w  p$ M: \# s目录& Z7 r: H% R2 s' F, l1 x
    9 e5 A: k6 F4 @0 A8 K% p$ q
    从零开始写一个迷你版的Tomcat
    * m; F& Q/ b  F* T6 }8 L
    ' C) y5 {* C! u% |+ r* N第一,提供Socket服务  Z5 U- U  C8 Y2 Z  E
    % m$ y4 t! O- @. m6 Y% c
    第二,进行请求的分发
    5 z. g! X* O5 C" E' c$ }0 z
    ; E9 y& |. q3 [! }. h1 _第三,需要把请求和响应封装成request/response
      c6 R8 u. u6 P  U, V# v; x: @% \$ D/ O( i9 q0 o# ~  Q' E3 j
    一、封装请求对象
    - |8 r5 P) N8 x/ o  q' g2 D( `
    0 x- k7 R/ J5 \9 B二、封装响应对象
    / c. n* V* D( d- l* k
    + p" r" {( O; ?2 E( o三、Servlet 请求处理基类
    ! u) F  e) ~" V' a# {( y8 k
    ; A9 E2 y! j* `6 c- H; V- s2 D四、Servlet 实现类7 n1 O. t% W' A' Z2 A8 y
    / n& Q$ Q, T+ F2 l, n5 K
    五、Servlet 配置
    ; u5 H4 Q3 |6 q* O& C4 O$ K1 K" R& \, H# T+ V
    六、启动类
    # J8 F2 ]. p9 q8 F
    ! V( {6 k( x! H& X# i, b七、测试6 N+ `, g/ d' a( J3 R. C( r

    / Y. s' @, G- Y- NTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    5 G' [' c+ F# t; q! z( [, M" |/ v- ]% j  b( r2 n# ~
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    " T, u" A9 A) r8 v4 a/ c1 U3 B7 k* @  l3 M) Z$ q* N
    % O3 d3 y9 `2 Z; k1 a

      \: \5 j1 V: W从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。: q2 n9 ~$ r/ K
    / j  r  r" t4 z/ [  X2 N. I

    0 U) w5 m9 \8 _; r; U
    " y+ _# I5 }7 K; r由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。
    1 d+ s; n! M: Q- l; ]/ R  ?0 S% y* w! u# e, t

    + P3 V* M7 U' E( r0 T& s0 U: A  c# Y& Y" w3 }) y9 `
    第一,提供Socket服务$ z$ I2 w( Z% Q( N) Q5 [; C

    3 \# T( q# t; V8 d' D/ d# R
    , I' p5 _* @1 K7 J3 z/ w/ p0 n( o) r& n" Z9 {
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!8 c9 W2 W% ?$ C% i! A9 d+ Q
    5 r0 ?# X  |+ o4 s# L
    + N$ v# ?  E8 d+ o' B2 L

    : f* Y7 o7 J( h这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    " b, l) X- [$ E, ~& G( f2 M
    : |" ]4 T8 L0 z6 v- `, g
    2 p  a. t: {# W$ J" O7 J) v. U. S
    ( O5 I  o; Q: {6 h第二,进行请求的分发* Y/ f- n7 {1 L2 _' o
    , t4 h$ C  ~' W
    % `4 Q+ Y( m1 U5 y) S* x
    ' @& j0 t4 o" j' r8 O" u
    要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    3 q+ {# L7 h7 d: M7 W
    9 \; k! c/ {/ U% K3 N) E/ r  X
    : b. O/ t: ~, ?" I3 U: K
    2 q/ \; }9 @( O7 M) v; o+ G第三,需要把请求和响应封装成request/response
    4 M9 @, d9 D/ i; J; j3 F" ^' ?- r! w8 V

      _: L  i- s+ P+ V9 T1 k9 \5 ^, @5 S/ r0 l9 Q
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!
    " g( p# C5 }( G3 ]- g% I8 ?
    1 N( p/ F9 g3 V" u8 ~% b
    9 _- {7 t) U6 L6 v5 c6 R9 i话不多说,先来看一眼工程截图。
    9 z" I8 m3 ?7 g/ Q& Q" i* u" Q 1.jpg
    % e2 n3 C7 x2 V4 r* K  `一、封装请求对象
    1 E% i9 ~9 F9 ~( i$ |7 ^ 2.jpg
    7 d$ a# n+ m' `. j9 a0 _* d0 Q+ Q) R

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

    $ `, q4 A& e: V; N' Q! F# u9 g
    二、封装响应对象
    2 f; [  ~$ \, y5 j- { 3.jpg
    ! X& F! J, m: \( B% f9 g; I- q7 V$ W  o5 }: \6 |) e8 U

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


    $ G0 K( w# @( Z4 W三、Servlet 请求处理基类
    ) B8 a: D1 F2 A! j8 f
      W1 V" X8 z$ U" v: Q3 V, f 4.jpg 4 V0 m$ D# O# r% O# t

    7 W7 T/ B; U$ T' e% {& U0 V
    # G/ Q0 L( U- P: C
    9 q" ^) }7 e+ c5 y+ b& G8 \' f* m/ t前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    * t$ C4 |6 F# [+ O
    4 o. T" A2 Q+ l2 \; e( F- L1 a
    ' H4 z* V' g* |) T" ` 5.jpg
    ; x" B& z: X5 m1 r# `$ ~' c/ M: y, O

    0 \& ~" z% ]; P$ @

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


    ; @! h  Y% U; U' N) I! J五、Servlet 配置 7.jpg / {2 S  }$ q& I2 ]
    6.jpg 0 I$ u8 C7 ]$ E) @1 @- v! q7 Y

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

    4 D" |# l' a8 [! d3 t) a) O
    六、启动类 10.jpg % }) q, q! N4 L( A$ }
    9.jpg
    * T1 I7 ^5 @/ M) V* h6 r7 N 8.jpg ! R7 I, i0 i) M! i1 Q# @- a( F

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


    2 L- o: c) Q; f* C8 G/ `6 M七、测试 11.jpg ! P7 N1 [( ]9 \2 e  s
    4 F8 O7 w* l9 c3 J/ n4 t) R
      G% `' t7 }% B) W5 w. B7 D
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。0 Q6 Y7 T* M/ s% w) b
    ————————————————$ ^/ |- o% _4 v: m
    版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。' n$ g( r/ U/ {' Z; B7 i* F
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480
    8 {& `) {1 R5 ~, w' j
    " \( Y% |4 P# \3 a$ }) c4 _/ L7 h4 e+ q2 t% d- Q3 d6 Z! J& \) h

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

    10.jpg

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

    9.jpg

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

    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-7-24 23:35 , Processed in 0.447262 second(s), 53 queries .

    回顶部