知识小罐头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大概的轮廓就清晰了不少,哈哈!
知识小罐头07(tomcat8请求源码分析 下)的更多相关文章
- 知识小罐头06(tomcat8请求源码分析 中)
更正上一篇一个小错误,Connector中首先是将socket请求过来的信息封装成一个普通的Request对象(上一篇我写成HttpRequest对象,失误失误,根本就木有HttpRequest这样的 ...
- 知识小罐头05(tomcat8请求源码分析 上)
这一篇我们不看源码,就大概理一下Tomcat内部组成部分!前面花费了两篇博客的篇幅来说说了一般的maven web项目并部署到tomcat运行,其实都是为这篇做铺垫的! 其实我下载了tomcat7,t ...
- 知识小罐头09(tomcat8启动源码分析 下)
初始化已经完成,现在就是启动这些组件,Tomcat中的start方法就是用于启动的,其实start的原理还是和上一篇说的初始化几乎一样!这里我就大概说一下,看几个比较关键的地方就行了. 前面的步骤就大 ...
- Tomcat处理HTTP请求源码分析(下)
转载:http://www.infoq.com/cn/articles/zh-tomcat-http-request-2 很多开源应用服务器都是集成tomcat作为web container的,而且对 ...
- Tomcat处理HTTP请求源码分析(上)
Tomcat处理HTTP请求源码分析(上) 作者 张华 发布于 2011年12月8日 | 8 讨论 分享到: 微博 微信 Facebook Twitter 有道云笔记 邮件分享 稍后阅读 我的阅读清单 ...
- # Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析#
Volley源码解析(二) 没有缓存的情况下直接走网络请求源码分析 Volley源码一共40多个类和接口.除去一些工具类的实现,核心代码只有20多个类.所以相对来说分析起来没有那么吃力.但是要想分析透 ...
- Tomcat处理HTTP请求源码分析(上)(转)
转载自:http://www.infoq.com/cn/articles/zh-tomcat-http-request-1 很多开源应用服务器都是集成tomcat作为web container的,而且 ...
- Okhttp同步请求源码分析
进阶android,OKhttp源码分析——同步请求的源码分析 OKhttp是我们经常用到的框架,作为开发者们,我们不单单要学会灵活使用,还要知道他的源码是如何设计的. 今天我们来分析一下OKhttp ...
- 知识小罐头08(tomcat8启动源码分析 上)
前面好几篇都说的是一个请求是怎么到servlet中的service方法的,这一篇我们来看看Tomcat8是怎么启动并且初始化其中的组件的? 相信看了前面几篇的小伙伴应该对Tomcat中的各个组件不陌生 ...
随机推荐
- 搭建 vue2 单元测试环境(karma+mocha+webpack3)
从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...
- java基础学习周计划之3--每周一练
每周一练第一周 一. 关键代码:1.斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...数列第一项和第二项是1, 从第三项开始, ...
- linux.go
func LockFile(file *os.File) error { return syscall.Flock(int(file.Fd()), syscall.LOCK_EX) }
- Ceilometer + Aodh + Gnocchi 介绍
一. Ceilometer 1. 概述 Openstack ceilometer主要用于监控虚拟机.服务(glance.image.network等)和事件.虚拟机的监控项主要包括CPU.磁盘 ...
- js操作中要去注意的一些问题
1.js中注意问题 font-size 改成fontSize padding-top 改成paddingTop js中不认识-,所以要以小驼峰方式操作属性或者以[" "]方式,例[ ...
- 汽车之家汽车品牌Logo信息抓取 DotnetSpider实战[三]
一.正题前的唠叨 第一篇实战博客,阅读量1000+,第二篇,阅读量200+,两篇文章相差近5倍,这个差异真的令我很费劲,截止今天,我一直在思考为什么会有这么大的差距,是因为干货变少了,还是什么原因,一 ...
- 你真的知道final关键字吗?
概述 final在英文中是最终的,不可更改的.在Java中final修饰变量,函数和类,就像这个单词的意思,一旦使用赋值之后不可更改. final修饰的变量不可以被改变 finalTest类 publ ...
- 【重学计算机】操作系统D5章:文件系统
1. 文件系统 文件系统概述 文件的组织: 逻辑结构:流式.记录式 物理结构:顺序.连接.直接.索引 文件的存取:顺序.直接.索引 文件的控制:逻辑控制.物理控制 文件的使用:打开.关闭.读.写.控制 ...
- OAuth2.0记录
阮一峰老师讲解OAuth2.0 http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 举例详解: https://www.cnblogs.com/ ...
- 包装类及 LeetCode 每日一题
1.包装类与创建对象 Java 为8大数据类型都提供了相应的包装类,并提供属性和方法,更方便的操作基本数据类型.包装类位于java.lang包中. 对于这几种类型的基本数据,都有相似的方法实现基本数据 ...