查看: 179|回复: 0

[Java学习] 阿里大神----教你如何深入剖析tomcat之servlet容器

发表于 5 天前
太阳http代理AD
其实我们开发中经常用tomcat应用服务器,tomcat就一个servlet容器,能够运行基于serlvlet的应用程序并响应相应的http请求,开发时间长了,还是想想具体知道它是怎么运行的,尤其是servlet容器的机理,所以有幸拜读了外国人的《深入剖析tomcat》,感觉挺不错的,可以在此点击免费下载电子书,建议大家有时间读读,在读的过程中边读边翻阅着tomcat的源码,更有助于你理解它的各个机制,此处有tomcat 7的源码,点击可免费下载。
本人目前时间和组织语言能力及功力有限,心有余而力不足,网上看到有好心人(<span style="font-family:Microsoft YaHei">randyjiawenjie</span>)做过记录,大概就是把书中重要的东西摘录的了一下,本人就就特意摘录以下了。再就是为了更有助理解,大家可以参考Tomcat 容器与servlet的交互原理,简单介绍了serlvet的原理和生命周期,还有学习tomcat源码(2) 实现servlet容器功能,这篇文章主要还是电子书的代码及解释,升华的文章Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析。
主要是《深入剖析tomcat》的第五章和第十一章。个人觉得如下3点是关键:
1. pipeline相关概念及其执行valve的顺序;
2. standardwrapper的接受http请求时候的调用序列;
3. standardwrapper基础阀加载servlet的过程(涉及到STM);
顺便问一句,应该每一个servlet程序员都知道filter。但是你知道Filter在tomcat的哪一个地方出现的吗?答案是standardwrapper基础阀会创建Filter链,并调用doFilter()方法
对Java感兴趣的同学可以加入到我们的学习 交流群:450936584 每天都会分享最新的视频和资料 可以免费领取学习视频和资料
servlet容器的作用
管理servlet资源,并为web客户端填充response对象。
不同级别的容器
Engine:表示整个Catalina的servlet引擎、
Host:表示一个拥有数个上下文的虚拟主机
Context:表示一个Web应用,一个context包含一个或多个wrapper
Wrapper:表示一个独立的servlet
容器都实现了Container接口,继承了ContainerBase抽象类。
管道任务
3个概念:pipeline、valve、valveContext
pipeline包含servlet容器将要调用的任务集合,定义如下:
[java]view plaincopy
  • publicinterface Pipeline {
  • public Valve getBasic();
  • publicvoid setBasic(Valve valve);
  • publicvoid addValve(Valve valve);
  • public Valve[] getValves();
  • publicvoid invoke(Request request, Response response) throws IOException, ServletException;
  • publicvoid removeValve(Valve valve);
  • }

valve表示一个具体的执行任务,定义如下:
[java]view plaincopy
  • publicinterface Valve {
  • public String getInfo();
  • publicvoid invoke(Request request, Response response, ValveContext context) throws IOException, ServletException;
  • }

valveContext按照字面意思就是阀门的上下文,用于遍历valve
[java]view plaincopy
  • publicinterface ValveContex{
  • public String getInfo();
  • publicvoid invokeNext(Request request, Response response) throws IOException, ServletException;
  • }

valveContext的invokeNext()方法的实现:
[java]view plaincopy
  • publicfinalvoid invokeNext(Request request, Response response) throws IOException, ServletException {
  • int subscript = stage; stage = stage + 1;
  • if (subscript < valves.length)
  • { valves[subscript].invoke(request, response, this); }
  • elseif ((subscript == valves.length) && (basic != null))
  • {
  • basic.invoke(request, response, this);
  • }
  • else
  • {
  • thrownew ServletException (sm.getString("standardPipeline.noValve"));
  • }
  • }

一个阀门的invoke方法可以如下实现:
[java]view plaincopy
  • publicvoid invoke(Request request, Response response, ValveContext valveContext) throws IOException, ServletException {
  • //Pass the request and response on to the next valve in our pipeline
  • valveContext.invokeNext(request, response);
  • // now perform what this valve is supposed to do ...
  • }

如果pipeline由valve1、valve2、valve3组成,调用valve1. Invoke()会发生什么?执行顺序是什么样的?假设valveN(N=1,2,3)的invoke()方法实现如下:
[java]view plaincopy
  • valveContext.invokeNext(request, response);
  • System.out.println(“valve1 invoke!”);

如果注意到了invokeNext()的实现,这层调用类似与下面的图:
类似与递归调用,输出为
[java]view plaincopy
  • “valve3 invoke!”
  • “valve2 invoke!”
  • “valve1 invoke!”

注:加群要求 学习交流群:450936584
1、想学习JAVA这一门技术, 对JAVA感兴趣,想从事JAVA工作的。
2、工作0-5年,感觉自己技术不行,想提升的
3、如果没有工作经验,但基础非常扎实,想提升自己技术的。
4、还有就是想一起交流学习的。
5、小号加群一律不给过,谢谢。
群内每天会分享最新的视频和资料,可以免费领取学习视频和资料
转发此文章请带上原文链接,否则将追究法律责任!



太阳http代理AD
回复

使用道具 举报