QQ登录

只需要一步,快速开始

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

    + A/ R# X5 _& S从零开始写一个迷你版的Tomcat从零开始写一个迷你版的Tomcat0 V% {- C  H4 n# O

    & C# ?- B5 s6 V- F' G, B目录: b( Q/ ^2 O1 y  m4 a

    $ [* {% ?+ k3 U2 ?4 N3 k3 B2 m从零开始写一个迷你版的Tomcat7 [1 @% ~8 Z1 j0 ?

    ! e* v0 J9 k, s0 g7 B7 @第一,提供Socket服务
    ; _! M' s; ?: `" Q6 _' R1 X# H; }
    - D8 x# \% n3 m( B+ g* l5 E第二,进行请求的分发
    $ r. Z8 W& t9 s( ^; a  P( ]( Z9 E. W) o- p
    第三,需要把请求和响应封装成request/response
    3 S$ p" A) ]) f( L, ?. f
    - N, S! V) ~+ {一、封装请求对象' l% I# B4 z/ N8 `
    6 H$ S4 D8 x$ j. P  X5 a
    二、封装响应对象
    2 O8 s% {3 g* [* u& e9 q
    . g4 g. L. B6 C三、Servlet 请求处理基类
    . _. b; f# d& g( ?
    $ I# V- s& \2 h9 |四、Servlet 实现类
    " L5 ?* x' F2 L2 O0 P* E7 w1 G  B
    五、Servlet 配置
    ( D, x. w/ X* `* Q* ?( a6 \2 p! j1 p1 o2 y, v6 v1 n7 [4 C
    六、启动类
    & Z3 G( e2 l( E. m% P# `+ X; o% _% h2 n
    七、测试) p3 K$ V. v2 r7 L/ Y# i) P

    & y0 R2 e. m6 |: a- ~Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道。这是一只神奇的猫,今天让我来抽象你,实现你!
    : t" A, [$ ?5 e& m# V5 w8 b3 b5 X) D) W, U7 o$ ^8 k& t
    Tomcat是非常流行的Web Server,它还是一个满足Servlet规范的容器。那么想一想,Tomcat和我们的Web应用是什么关系?
      F* f7 {5 b" \9 A( g9 Q1 Q( }1 l( T5 B

    . _- Z7 ^' q9 V  p
      H5 }& p4 k; S3 S! ]从感性上来说,我们一般需要把Web应用打成WAR包部署到Tomcat 中,在我们的 Web应用中,我们要指明URL被哪个类的哪个方法所处理「不论是原始的Servlet 开发,还是现在流行的Spring MVC都必须指明」。" z" G9 n: Z5 \( U$ g* u$ m& g

    + I0 H$ n" E3 n
    ; \- J! o! L3 b' }4 u' Z- ~/ M4 c( Q9 S- `, {  D8 r, u
    由于我们的Web应用是运行在Tomcat中,请求必定是先到达Tomcat的。Tomcat 对于请求实际上会进行如下的处理。- I6 g# O0 K. n! g

    ( C/ R  C) g0 b; X6 u# _6 D- k5 L1 m6 A

    + x* j* b2 v- c; |第一,提供Socket服务+ K5 @4 l  U$ z* ^. S5 L
    7 ~  S" l& Z9 D4 Z" J9 ~3 q/ W
    # F) \7 o, o% b

      C  @* V( _0 v; n4 _6 d% dTomcat的启动,必然是Socket服务,只不过它支持HTTP协议而已!
    9 q' p+ o6 f+ f& W; X5 R
    + E/ p' W: l; w( @% ^) m. w5 J8 ]3 `  o! j% w& k8 }
    ' G; ^" N* }, s4 ]9 ?2 U
    这里其实可以扩展思考下,Tomcat既然是基于Socket,那么是基于BIO or NIO or AIO 呢?
    8 }6 N  X2 A3 q& ?  @$ F8 h7 K) {" q! B. s8 G4 ?0 y- K
    9 M# a0 X* i7 V& k

    " e- ^; c: Y' }9 K- m+ i第二,进行请求的分发
    ' [2 K2 S; W6 `, j, s% J' C2 M" l0 v  p% y* W3 n1 H

    - L: r( }2 t$ j: t0 ]0 s+ U
    : K* ~5 y8 Q$ P+ Q要知道一个Tomcat可以为多个Web应用提供服务,很显然,Tomcat可以把URL下发到不同的Web应用。
    : f$ ]2 ^! k1 i& o1 s
    # A/ H1 W' I: ]& B/ `- F' t
    + P) d+ @: O$ s# f4 u/ }+ Z/ _/ _" P% B
    第三,需要把请求和响应封装成request/response6 B& J: e( |4 Y% E. v
    0 u4 b6 x4 Z. j) R  o
    . h( a8 ?6 f* p" E3 ?! X, Z
    + `6 G' R; `8 ^( P! h9 ~1 O# E
    我们在Web应用这一层,可从来没有封装过request/response 的,我们都是直接使用的,这就是因为Tomcat已经为你做好了!9 o/ o- x- i! R3 o; l
    : D( T7 J4 R# a( |- u1 Y4 `
    + N% w, J9 P) ?$ A, t( C
    话不多说,先来看一眼工程截图。: q* o0 i: Q0 q" f
    1.jpg 5 u+ G) L0 ^5 Y& v( t
    一、封装请求对象
    5 O$ G( }4 O+ w$ j! r$ u) Q! F* [ 2.jpg
    ; m4 _; O2 A8 W( g" \8 |5 W* [" _( f

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


    : p* S! b; s2 N+ z; c/ k+ q二、封装响应对象
    % ^4 M5 Y$ C/ |& @: T& X; v; u 3.jpg ) ^8 z) {/ @2 `# F& ]' E% X

    ; a9 k0 ~  i" Z7 d5 |6 o! x. t

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


    5 n' V8 b- O# v三、Servlet 请求处理基类% u/ f6 w4 |- G$ F7 L

    # s2 i/ q! }" o9 b$ f 4.jpg & x  _" p! p7 t! s
    8 F% h3 }) B& ^3 p. V9 {/ X3 L
    . N" F9 v+ r" B2 u0 F! J) n4 S! S

    & I3 P; V9 r$ n* ]# I& V& p前文说Tomcat是满足Servlet规范的容器,那么自然Tomcat需要提供API。这里看到了Servlet常见的doGet/doPost/service方法。
    3 {# y) K6 c3 R: ]6 W3 l7 k+ v( R% ?% y- `8 ^

    5 w- W. s9 n' B, t! @ 5.jpg
    : g& a9 }: o' I6 \! g* w- m/ c8 f/ w4 l) x
    ! M. L: i" _! T9 ^& t; R# R& ^

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

    9 f8 y/ T) U6 a1 i8 U3 P
    五、Servlet 配置 7.jpg   Q1 w. U. h" c# r  p8 ~0 _
    6.jpg
    , o+ l& U4 b3 |# v& R% {' }

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

    6 y+ B! m8 `0 M8 w& N* G2 i+ ^" E
    六、启动类 10.jpg # X6 J/ n+ n% V, c5 y5 S% r, z& s: D
    9.jpg
    , z; n( z& b9 x% b* E 8.jpg
    $ N. }1 Y+ P# \: d

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

    ! k' P& m& a4 P! U0 n  F
    七、测试 11.jpg
    0 E; Q% L8 R0 x' Y& i9 m. a  |% l8 p% K/ t& z' {3 k4 j
    % u+ l6 `7 f7 _9 q* n2 v$ b
    实现一个简易版的Tomcat就这么7大步搞定,大家都来动手实现一下吧,代码最好不要复制,自己动手一个个敲,这样实现之后,对Tomcat就没那么陌生了。- H. y7 ]+ i' X: Q6 `/ p
    ————————————————
    ; k/ }4 n6 z* i0 C版权声明:本文为CSDN博主「踏雪无痕的狼-Java程序员」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      y* i- O& ?8 Z" }. w. P5 D6 W* ~原文链接:https://blog.csdn.net/z1c5809145294zv/article/details/106227480$ p2 c4 h: {$ h) U
    ( h2 `* T6 K9 W. o" @, l$ j8 t% }

    ' z! U  e7 r  r! w

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

    10.jpg

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

    9.jpg

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

    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-9-9 12:09 , Processed in 0.417162 second(s), 54 queries .

    回顶部