QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1150|回复: 0
打印 上一主题 下一主题

从零开始写一个迷你版的Tomcat

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

81

听众

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' X3 s( Y- g$ ~
    从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat
    : Q1 i" \+ {* b6 J; Q% G5 r0 |+ ~. ~2 W  T" b! }0 P
    目录
    5 n+ U6 d+ j. O5 O1 W* D2 ~1 s3 m  c
    从零开始写一个迷你版的Tomcat; [8 c/ D; a) Z. @* E. A) S$ T- F
    " l! x$ W: d  g9 t' M2 x
    第一,提供Socket服务
    9 j8 u% y1 W: H5 m$ c/ W7 Q. G2 N$ \1 B3 K( }- [
    第二,进行请求的分发7 E8 d( r  N9 e; O$ k

    2 ~7 K6 o: ]* F  ?第三,需要把请求和响应封装成request/response" k! D) e! {. x2 @: e

    5 @( w% V5 A+ X- f( G一、封装请求对象
    ( R; O' P  f+ G. ~) K0 H$ @7 |, x' ~; o- N6 ?/ `
    二、封装响应对象  T/ D3 `* I7 P9 w$ G: r7 {$ M

    ' R- e+ d  V2 [+ Y0 s! p% q三、Servlet 请求处理基类
    6 g- X! @9 Z6 O3 b0 f, B/ s$ k& X7 n; |8 n" f! v# i
    四、Servlet 实现类1 F" s$ d3 H. t) u

    ! `# U. l9 Q5 A五、Servlet 配置
    8 B* ]. y% m$ p0 k7 B! o" n, a9 G/ X' N  j" r8 T
    六、启动类/ u% e4 _  p; z3 v
    5 {+ [! c$ m" F2 D
    七、测试2 U- L- ?8 d9 b

    . v5 v. _2 P5 w4 T4 _& o5 Q' PTomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    0 p' P/ T& r9 m2 E3 B* o: ^
    9 X( U1 Z4 ^8 @# m- x3 a) I9 YTomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
    ; m. W) P9 n. @' r# s( _7 O
    , D  l  [+ O5 U, `1 N  {# h9 R
    , M+ y8 w* `  K+ C0 g
    " i. |$ `* i1 w' s9 F从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。- @7 V" I) u; G" z0 @1 j

    ( z1 U) O9 L; P6 e" i
    / q: K0 d1 s& p" {
    , m# J# h6 O0 a! e由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。  e. Q& }$ \9 g% Q+ `" V: B
    ; t( Z& E' t" M) r3 m/ X7 H

    2 Q- }1 m* U- Q7 I+ w! P
    # s. S' M& X* \! I0 C第一,提供Socket服务
    : f+ B' P. b7 G
    * U/ a7 b5 I/ r8 T( f: v* d4 q( j* P, G; D
      n. ^+ ^3 O3 [+ v) E3 I3 o
    Tomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    5 j0 d( H0 j6 E7 i3 H  n* `
    ( s  X/ X: \" x( _( T  q" P
    # v. X) R; T  `% n8 f1 o4 I# B0 {( I* ?+ C+ H  d+ D
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    9 c% L9 X; K" m( x) ^: E8 e% ?1 ~# b/ }! Z* S1 j, {
    1 F0 @, r# i2 T- i
    5 W; v- V* K$ W) d/ t( M
    第二,进行请求的分发: }. d+ E  H% ^! H* S  Z

    2 ?9 O5 E  l; E5 V9 Y$ i
    7 }: F! c7 g. {6 ~; |- q
    $ F/ i# ]0 @% }  G6 S: {" E要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    & m3 G' Y, H9 p! X8 v: P
    5 P0 |  i  d$ M- W( I4 [8 `
    9 T5 o; u3 i  @* X* V- Z  @# s4 P+ a; I6 T4 D9 I* g: K- T
    第三,需要把请求和响应封装成request/response& h5 a& y3 q2 c' \& F1 R
    5 ]( {( P- x$ z  `" j

    - _- a2 w- y: q) s1 x( V1 _& N
    & c7 @8 {' g9 L我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!; s8 q: t5 m0 F% K! F
    . _; P+ V) Y. [+ \$ j" H' s
    9 v: h* k- k+ e7 N3 d
    话不多说,先来看一眼工程截图。
    9 \  e% z% Y. Z3 r1 G 1.jpg
    4 `# q. H' U! ^- w* y一、封装请求对象
      ?0 K1 l& ], I9 [2 L# w0 w 2.jpg % x% ?- C5 W- D9 U& E

    6 s' s9 Z# w! b/ g1 K. N

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


    9 y- A* I9 `( w: ]: G二、封装响应对象9 y& b6 v0 a: z2 j* K6 b
    3.jpg 2 G( s' I" c" v
    : G/ P7 h3 i( M* q

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


    % V* E1 j8 k4 S# v! X6 z2 l4 `* [三、Servlet 请求处理基类' L  M9 _( {) \% g$ _
      a% C, c* F9 Q
    4.jpg
    + Z" O2 l* ~) z/ H5 l8 R$ [  e/ _
    3 p( \2 F7 B% ]" C

    5 r5 H8 ]+ ^: M( N# x" c" P3 g前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    ( e$ l0 q2 G! R& F5 p( @/ g1 K3 u
    ( [8 j5 B9 X0 u1 [
    9 ?7 f$ n# e. ^% N/ H& o 5.jpg
    1 x5 x9 A+ R2 \1 Z8 H9 J0 B- c* Q9 {+ f# z. U. B' ?% s9 g

    * a3 O7 y9 N2 ~# q( k3 p+ M: L& G

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


    / G" a/ ~0 z- R五、Servlet 配置 7.jpg
    9 Z$ ~: M  V% `( A6 V- ] 6.jpg ' @$ H9 F8 X# p) u, G2 ?/ ]$ ]6 R( b3 S) T

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


    8 m1 i4 ^0 X7 T' }0 D& s六、启动类 10.jpg 4 I; u" m9 t( w% r
    9.jpg
    4 O6 T  s# N/ U6 c9 c! u4 O 8.jpg 2 a0 T* b" }  {- ^& O+ C3 `4 n

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

    " o' ]: @0 B3 L& j* I" z
    七、测试 11.jpg 2 s: K8 Z: v! R& f# s& [0 y7 P# `
    . ?8 e# Z+ j) r+ T$ f; s
    8 |  D  L4 F/ y# W0 A9 L' P+ @6 U2 ]
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。
    0 Q# }& W5 e2 G  K+ L) w* z8 f! b————————————————
    3 J" a7 G2 v& K2 t版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。* R4 M) a5 b" H- U- ?, ^) |+ u" ?  K/ f
    原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/1062274807 I  D$ Q0 U3 q0 f* i- o7 {
    / Y1 k. C1 g. O6 @7 c. _  g/ \
    6 Z3 Q" A8 r: W

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

    10.jpg

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

    9.jpg

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

    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, 2025-5-15 23:59 , Processed in 0.401358 second(s), 53 queries .

    回顶部