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

  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大概的轮廓就清晰了不少,哈哈!

知识小罐头07(tomcat8请求源码分析 下)的更多相关文章

  1. 知识小罐头06(tomcat8请求源码分析 中)

    更正上一篇一个小错误,Connector中首先是将socket请求过来的信息封装成一个普通的Request对象(上一篇我写成HttpRequest对象,失误失误,根本就木有HttpRequest这样的 ...

  2. 知识小罐头05(tomcat8请求源码分析 上)

    这一篇我们不看源码,就大概理一下Tomcat内部组成部分!前面花费了两篇博客的篇幅来说说了一般的maven web项目并部署到tomcat运行,其实都是为这篇做铺垫的! 其实我下载了tomcat7,t ...

  3. 知识小罐头09(tomcat8启动源码分析 下)

    初始化已经完成,现在就是启动这些组件,Tomcat中的start方法就是用于启动的,其实start的原理还是和上一篇说的初始化几乎一样!这里我就大概说一下,看几个比较关键的地方就行了. 前面的步骤就大 ...

  4. Tomcat处理HTTP请求源码分析(下)

    转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...

  5. Tomcat处理HTTP请求源码分析(上)

    Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...

  6. # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#

    Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...

  7. Tomcat处理HTTP请求源码分析(上)(转)

    转载自:http://www.infoq.com/cn/articles/zh-tomcat-http-request-1 很多开源应用服务器都是集成tomcat作为web container的,而且 ...

  8. Okhttp同步请求源码分析

    进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...

  9. 知识小罐头08(tomcat8启动源码分析 上)

    前面好几篇都说的是一个请求是怎么到servlet中的service方法的,这一篇我们来看看Tomcat8是怎么启动并且初始化其中的组件的? 相信看了前面几篇的小伙伴应该对Tomcat中的各个组件不陌生 ...

随机推荐

  1. logrus_hook.go

    package) //表示自身栈中跳过6个,:]     entry.Data["file"] = fileName     entry.Data["func" ...

  2. 【bzoj 4407】于神之怒加强版

    Description 给下N,M,K.求     Input 输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意 ...

  3. 如何在ST官网下载STM32固件库

    1.首先要注册一个ST账号,下载的时候需要. 2.找到工具与软件 3.进去之后选"产品列表" 4.在产品列表里选STM32微控制器软件,直接点下图标号2,不要点左边的加号 5.进去 ...

  4. 解决 'boost/iterator/iterator_adaptor.hpp' file not found’ 及控制台":CFBundleIdentifier", Does Not Exist

    "react-native": "0.46.1" 这个问题产生原因: * /Users/Vanessa/.rncache 中 boost_1_63_0.tar. ...

  5. javascript && php &&java

    java && javascript && php 轰炸!!!恢复 1.javascript简介 *是基于对象和时间的驱动语言,应用于客户端. -----基于对象: * ...

  6. 测试修改hosts文件py小工具

    import sys,osparm_list=sys.argvHOST_PATH=r'C:\liuliang\flask_test\test\hosts'class HostFile(object): ...

  7. set命令详解

    我们依然是围绕这几个话题展开学习: 1.什么是set命令? 2.为什么要用set命令? 3.怎样使用set命令? 1.什么是set命令? ♦ set命令作用主要是显示系统中已经存在的shell变量,以 ...

  8. 深入理解Java 栈数据结构

    栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈 ...

  9. MIP 脚本域名地址变更公告

    尊敬的 MIP 开发者: MIP 团队为了解决 MIP-Cache 页面下 cookie 相互覆盖问题,增强站点品牌露出,在 2017 年 8 月将 MIP 的脚本域名和 MIP-Cache 页面域名 ...

  10. hive删除表和表中的数据

    hive删除表和表中的数据,以及按分区删除数据 hive删除表: drop table table_name; hive删除表中数据: truncate table table_name; hive按 ...