知识小罐头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中的各个组件不陌生 ...
随机推荐
- 浅谈cookie,sessionStorage和localStorage
cookie:cookie在浏览器和服务器间来回传递 cookie数据不能超过4k 同时每次http请求都会携带cookie,所以cookie只适合保存很小的数据,比如会话标识 cookie只在设置的 ...
- 前端BUG监控神器
有时候,看到用户的反馈,我们往往会一脸茫然,因为反馈的信息太少了. 比如有用户反馈登录不了.为了解这个问题,一般的流程是这样的:首先试试自己能不能登录网站,发现没问题:然后查看后台日志,发现最近没有登 ...
- 提示“本地连接没有有效的ip配置-未修复“窗口
很多人在使用电脑时可能会遇到了这样一个网络问题,电脑无法连接网络,使用自带网络诊断工具诊断提示:"本地连接没有有效的ip配置".这种网络故障多数是出在使用路由器共享上网的windo ...
- 单机部署-consul
在本机开发环境中,直接通过以下命令可以启动一个单机consul服务器: ./consul agent -server -data-dir=/tmp/consul -bootstrap -adverti ...
- linux清除全屏快捷键(Ctrl+L)
Linux用户基本上都习惯使用clear命令或Ctrl+L组合快捷键来清空终端屏幕.这样做其实并没有真正地清空屏幕,但当用鼠标向上滚时,你仍然能看到之前的命令操作留下来的输出.
- SpringBoot---页面跳转之WebMvcConfigurerAdapter
摘要:在springboot中定义自己的方法继承WebMvcConfigurerAdapter方法可以实现扩展springMvc功能,要全面实现接管springmvc就要在自己的方法上加上@Enabl ...
- Filter、Interceptor、Aspect 区别及实现
Fliter 过滤器 请求在到达Controller之前进行与返回去之后 调用 入参为 reuqest,response,chian,过滤器获取不了具体调用哪一个类,哪一个方法. 实现: 1.继承 F ...
- 理解 Node.js 的 Event loop
问题 考察如下代码,脑回路中运行并输出结果: console.log("1"); setTimeout(function setTimeout1() { console.log(& ...
- (leetcode:选择不相邻元素,求和最大问题):打家劫舍(DP:198/213/337)
题型:从数组中选择不相邻元素,求和最大 (1)对于数组中的每个元素,都存在两种可能性:(1)选择(2)不选择,所以对于这类问题,暴力方法(递归思路)的时间复杂度为:O(2^n): (2)递归思路中往往 ...
- .net core redis 驱动推荐,为什么不使用 StackExchange.Redis
前言 本人从事 .netcore 转型已两年有余,对 .net core 颇有好感,这一切得益于优秀的语法.框架设计. 2006年开始使用 .net 2.0,从 asp.net 到 winform 到 ...