其实我们开发中经常用tomcat应用服务器,tomcat就一个servlet容器,能够运行基于serlvlet的应用程序并响应相应的http请求,开发时间长了,还是想想具体知道它是怎么运行的,尤其是servlet容器的机理,所以有幸拜读了外国人的《深入剖析tomcat》,感觉挺不错的,可以在此点击免费下载电子书,建议大家有时间读读,在读的过程中边读边翻阅着tomcat的源码,更有助于你理解它的各个机制,此处有tomcat 7的源码,点击可免费下载。
本人目前时间和组织语言能力及功力有限,心有余而力不足,网上看到有好心人(randyjiawenjie)做过记录,大概就是把书中重要的东西摘录的了一下,本人就就特意摘录以下了。再就是为了更有助理解,大家可以参考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()方法
servlet容器的作用
管理servlet资源,并为web客户端填充response对象。
不同级别的容器
Engine:表示整个Catalina的servlet引擎、
Host:表示一个拥有数个上下文的虚拟主机
Context:表示一个Web应用,一个context包含一个或多个wrapper
Wrapper:表示一个独立的servlet
容器都实现了Container接口,继承了ContainerBase抽象类。
管道任务
3个概念:pipeline、valve、valveContext
pipeline包含servlet容器将要调用的任务集合,定义如下:
- public interface Pipeline {
- public Valve getBasic();
- public void setBasic(Valve valve);
- public void addValve(Valve valve);
- public Valve[] getValves();
- public void invoke(Request request, Response response) throws IOException, ServletException;
- public void removeValve(Valve valve);
- }
valve表示一个具体的执行任务,定义如下:
- public interface Valve {
- public String getInfo();
- public void invoke(Request request, Response response, ValveContext context) throws IOException, ServletException;
- }
valveContext按照字面意思就是阀门的上下文,用于遍历valve
- public interface ValveContex{
- public String getInfo();
- public void invokeNext(Request request, Response response) throws IOException, ServletException;
- }
valveContext的invokeNext()方法的实现:
- public final void invokeNext(Request request, Response response) throws IOException, ServletException {
- int subscript = stage; stage = stage + 1;