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

  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. BZOJ_2142_礼物_扩展lucas+组合数取模+CRT

    BZOJ_2142_礼物_扩展lucas+组合数取模 Description 一年一度的圣诞节快要来到了.每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物.不同的人物在小E 心目中的重要性不同 ...

  2. BZOJ_4590_[Shoi2015]自动刷题机_二分答案

    BZOJ_4590_[Shoi2015]自动刷题机_二分答案 Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题 ...

  3. CentOS DesktopEntry

    IBM Developer  :  https://www.ibm.com/developerworks/cn/linux/l-cn-dtef/index.html [Desktop Entry] N ...

  4. Eigen实现坐标转换

    (<视觉SLAM十四讲>第三讲习题7)设有小萝卜一号和二号在世界坐标系中.一号位姿q1 = [0.35, 0.2, 0.3, 0.1],t1=[0.3, 0.1, 0.1].二号位姿q2= ...

  5. 设计模式-策略模式(strategy pattern)

    来说说设计模式吧,最近开始看设计模式,觉得挺有意思的.设计模式网上的资料的挺多的,而且大部分是大家相互转来转去的.感觉也挺没有意思.我就自己写一点吧! 开始 学习设计模式,我会用自己的画的UML类图来 ...

  6. javascript正则表达式学习(二)--位置匹配

    文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...

  7. 解决VS2019中.net core WPF 暂时无法使用 Designer 的临时方法

    目录 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法 安装 vs 2019 professional/enterprise版本 在vs的设置里,勾选.NE ...

  8. 一段简单的显示当前页面FPS的代码

    写前端代码,尤其是做一个前端框架的时候,经常需要及时知道代码的大致性能,这时候如果能有个好的办法能一直看到当前页面的fps就好了. 整体思路是一秒有一千毫秒,先记录当前时间作为最后一次记录fps的时间 ...

  9. Protocol Buffers(3):阅读一个二进制文件

    目录 Proto文件 序列化 二进制文件解析 反序列化 参考 博客:blog.shinelee.me | 博客园 | CSDN 这篇文章中,我们将定义一个相对复杂的数据结构,直接分析其序列化后的二进制 ...

  10. 刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?

    1.万物皆可布尔 一般语言中的 if 语句语法是这样的: if (条件表达式){    执行语句} 而在 Python 中,if 后面不仅可以是条件表达式,还可以是任意对象.例如: my_list = ...