• 知识小罐头07(tomcat8请求源码分析 下)


      感觉最近想偷懒了,哎,强迫自己也要写点东西,偷懒可是会上瘾的,嘿嘿!一有写博客的想法要赶紧行动起来,养成良好的习惯。

      ok,继续上一篇所说的一些东西,上一篇说到Connector包装了那两个对象,最后变成了HttpServletRequest和HttpServletResponse对象,这两个对象应该就是原生servlet的service方法可以使用的了,但是隔了这么多堵墙,要怎么穿过这么多墙进去呢?

      我们还是从上一篇的Adapter的这里开始说,下图所示:

      一看到这么长的调用简直就是日了狗了,但是仔细一看,嘿嘿!其实都是我们比较熟悉的东西,getService就是取到包装Connector和Container的Service,然后拿到Container,再拿到Engine中的管道,管道里面的阀门很多,我们先拿到第一个阀门(第一个阀门里面肯定有指向下一个阀门的游标,只需要执行第一个阀门,后面一系列的阀门都会执行的),最后的invoke()应该就是阀门中的方法了(哎,没细看,居然不是反射啊!我前面一篇应该没说成反射吧。。。不好意思,我去修改一下)。

      总结起来就是一句话,将Request和Response作为形参,调用Container的管道第一个阀门中的invoke方法,就会一直到最后的Wrapper中的Servlet的service方法了!

      下面我们就大概看一看这个过程。

    1.断点调试

      我也在网上看了很多大佬的博客,最然很多博客都把源码分析的非常详细,但是都有一个缺陷,就是你根本不知道从这个类调用的方法是另外某某抽象类的什么什么方法啊?难道要一个一个的手动去找吗?贼坑!根本的原因就是很多博客也是看其他人的博客,直接Ctrl+H找那个类,然后截图...这样的教程无论写得怎么样,反正我是评价不高的,因为你这博客是给你自己看的!

      就像我听过的一个牛逼数学家高斯的故事:高斯可谓是不得了的数学家,数学难题对他来说都是小菜一碟,很多数学难题他一个晚上就做出来了!最牛的就是搞定了困扰了数学家两千年之久的正十七边形尺规作图问题。那一年,高斯只有19岁!高斯死前都说过,我死了之后在我的墓碑上给我刻一个正十七边形就可以了!然而高斯这货有个很坑的地方:有同时代的人就评价他,高斯就像一个狡猾的狐狸,他最后给你看一个结果,但是他用尾巴把所有他得到这个结果的痕迹全部给你扫的干干净净,就给你一个非常完美而漂亮的结果。

      写博客就是让自己站在一个新人的角度,重头开始再来剖析整个过程!新人嘛,假如分析的切入点和过程都不知道,看的再多效果其实不是很大!

      我承认我水平很菜,但是我会尽量把我怎么思考这些问题的过程给表达出来,适不适合你,自己判断;

      不说废话了,断点位置如下:

      方式一:Ctrl+H搜索一个类StandardWrapperValve,打断点!

      

      方式二:断点位置可以打的更深一点的,搜索一个类JspServlet,Ctrl+F12找到service方法,在下面这里打断点

      然后调试启动tomcat

      最后就是浏览输入localhost:8080就ok了

    2.简单看一看管道和阀门的类

       Ctrl+N,搜一个Valve的接口,然后选中那个接口,Ctrl+H看看继承树,我们就看几个后面要用到的Valve(日了狗啊,一直把阀门看作Value,正确的应该是Valve)

      例如StandardEngineValve,Ctrl+F12,看看类中所有的方法就是那个invoke方法最重要!

      其他的Valve差不多的,可以自己打开看看,无非就是做一些事情,然后就调用下一个容器的invoke方法

      而管道又是一个什么呢?Ctrl+N,搜一个Pipline,看看继承树,发现只有一个实现类;

      进入那个类,Ctrl+F12,看看类中所有的方法

     3.接上一篇继续

      上一篇说到这里

       

      我们只看看Engine的阀门的invoke方法

      这个invoke方法就是调用下面这个阀门的invoke方法,对request或者response进行一些处理

     

      跑了这么多阀门,终于到了Host的阀门了

      跑了大半年,终于跑到了Context的阀门这里来了,这里其实就是判断请求路径是否合法,如果是包含META-INF或者WEB-INF的就抛异常!下面说的比较清楚判断规则

     

     

       

      快筋疲力竭了,终于差不多就到终点了,到达Wrapper的阀门

     

      其实还可以继续跟进,看看这个doFilter方法里面是什么鬼

     

       到这里应该就差不多了,有兴趣的小伙伴可以继续跟进,我感觉应该就是拿到Request中的url的具体servlet(jsp其实也是servlet),然后就去执行了,但是细节比较多,我又比较懒,就到这里吧!

       其实内容也没有多少吧!(主要是我大删特删,很多细节直接跳过,嘿嘿!),就是request和response像两条鱼一样慢慢游,经过了九九八十一难,终于到了servlet中的service方法的这么一个过程吧!后面应该就是说说Tomcat启动原理了,然后Tomcat大概的轮廓就清晰了不少,哈哈!

  • 相关阅读:
    取出某块内存的二进制数据
    拷贝构造函数的第一个参数必须是自身类类型的引用
    大小端,memcpy和构造函数
    类型装换和内存数据显示
    ERROR: iterator not incrementable || iterator not decrementable
    什么时候删除指针后,要给指针赋NULL
    chapter11、4concurrent.future模块
    chapter11、3多进程 multiprocessing
    chapter8.3、二分查找
    chapter8.2、面向对象三要素--继承
  • 原文地址:https://www.cnblogs.com/wyq1995/p/10158888.html
Copyright © 2020-2023  润新知