欢迎来到《Tomcat如何工作》。本书剖析了Tomcat 4.1.12和5.0.18以及解释了其免费、开源和最流行的servlet容器(代号为Catalina)的内部工作原理。Tomcat是一个复杂的系统,由许多的不同的组件组成。那些想学习Tomcat的人往往都知道从哪里开始。本书要做的是提供全景,然后建立一个每个组件的简化版本,让大家更容易理解该组件。只有在这之后,才能解释真正的组件。
你应该先阅读本简介,因为它解释了本书的结构,并简要介绍了所构建的应用程序。“准备必备软件”为你提供了有关需要下载哪些软件的说明,如何为你的代码创建目录结构等。
本书是为所有从事Java技术工作的人编写的。
为了理解本书的讨论,你需要了解Java中的面向对象编程以及servlet编程。如果你不熟悉后者,有大量关于servlet的书籍,包括Budi的《Java for the Web with Servlet、JSP和EJB》。为了使教材更容易理解,每一章开始都会有一些背景信息,这些信息是理解讨论中的主题所需要的。
一个servlet容器是一个复杂的系统。不过,基本上servlet容器要服务于一个servlet的请求,基本上要做三件事:
javax.servlet.ServletRequest
接口的一个实例或 javax.servlet.http.ServletRequest
接口。 javax.servlet.Servlet.ServletResponse
接口的一个实例或 javax.servlet.http.ServletResponse
接口。 在阅读这些章节时,你会发现关于Catalina servlet容器的详细讨论。
Catalina是一款非常精致的软件,设计和开发都很优雅。它也是模块化的。根据“Servlet容器如何工作”一节中提到的任务,你可以把Catalina看作是由两个主要模块组成:连接器和容器。
当然,图1.1中的框图是简单化的。在接下来的章节中,你将在后面的章节中逐一揭开所有的小部件。
图1.1:Catalina的主要模块
现在,回到图I.1中,连接器的作用是将请求与容器连接起来。它的工作是为它收到的每一个HTTP请求构造一个请求对象和一个响应对象。然后,它将处理过程传递给容器。容器从连接器接收请求和响应对象,并负责调用servlet的服务方法。
但请记住,上面的描述只是冰山一角。容器要做的事情有很多。例如,在调用一个servlet的服务方法之前,它必须加载servlet,验证用户(如果需要的话),更新该用户的会话等等。那么,一个容器使用许多不同的模块进行处理也就不足为奇了。例如,管理器模块用于处理用户会话,加载器用于加载servlet类等。
本书涵盖了Tomcat 4和Tomcat 5。以下是两者之间的一些区别:
本书共有20章。前两章作为介绍。第1章介绍了HTTP服务器的工作方式,第2章介绍了一个简单的servlet容器。接下来的两章重点介绍连接器,第5章至第20章介绍了容器中的每个组件。以下是每个章节的摘要。
注意,对于每一章,都有一个与所解释的组件相似的附带应用程序。
第1章通过介绍一个简单的HTTP服务器来开始本书。要构建可用的HTTP服务器,你需要了解 java.net
包中两个类的内部工作原理: Socket
和 ServerSocket
。本章中已经有足够的背景信息介绍了这两个类,让你了解附带的应用程序是如何工作的。
第2章介绍了简单的servlet容器如何工作。本章附带了两个Servlet容器应用程序,它们可以处理对静态资源的请求以及非常简单的servlet。特别是,你将学习如何创建请求和响应对象,并将其传递给被请求的servlet的服务方法。还有一个可以在servlet容器内运行的servlet,你可以从web浏览器调用。
第3章介绍了Tomcat 4的默认连接器的简化版本。本章中构建的应用可以作为学习工具来理解第4章中讨论的连接器。
第4章介绍了Tomcat 4的默认连接器。不推荐使用此连接器,而推荐使用更快的连接器Coyote。但是,默认连接器更简单易懂。
第5章讨论了容器模块。容器由 org.apache.catina.Container
接口表示,容器有四种类型:引擎(engine)、主机(host)、上下文(context)和包装器(wrapper)。本章提供了两个使用上下文和包装器工作的应用程序。
第6章介绍了 Lifecycle
接口。该接口定义了Catalina组件的生命周期,并提供了一种优雅的方式来通知其它组件该组件中发生的事件。此外,生命周期接口提供了一种优雅的机制,可通过一次启动/停止来启动和停止Catalina中的所有组件。
第7章介绍了记录器,它们是用于记录错误消息和其它消息的组件。
第8章介绍了关于加载器。加载器是一个重要的Catalina模块,负责加载servlet和其他web应用程序所使用的类。本章还介绍了应用程序的重载是如何实现的。
第9章讨论了管理器,即会话管理中管理会话的组件。它解释了各种类型的管理器,以及管理器如何将会话对象持久化到存储中。在本章的最后,您将学习如何构建一个使用 StandardManager
实例来运行servlet的应用程序,该servlet使用会话对象来存储值。
第10章涵盖了Web应用的安全约束,用于限制对某些内容的访问。你将学习与安全相关的实体,如主体(principals)、角色(roles)、登录配置(login config)、身份验证器(authenticators)等。你还将编写两个应用程序,在 StandardContext
对象中安装一个身份验证器阀,并使用基本的身份验证来验证用户。
第11章详细解释了 org.apache.catalina.core.core.StandardWrapper
类,该类在web应用程序中表示一个servlet。特别是,本章解释了过滤器和servlet的服务方法是如何调用的。本章所附的应用程序使用 StandardWrapper
实例来表示servlet。
第12章介绍了代表web应用程序的 org.apache.catina.core.StandardContext
类。特别是这一章讨论了 StandardContext
对象是如何配置的,每次传入的HTTP请求都会在其中发生什么,它如何支持自动重载,以及Tomcat 5如何共享一个线程,在其相关组件中执行周期性任务。
第13章介绍了另外两个容器:主机和引擎。你还可以找到这两个容器的标准实现: org.apache.catina.core.core.StandardHost
和 org.apache.catina.core.standardEngine
。
第14章提供了服务器和服务组件。服务器为整个servlet容器提供了一个优雅的启动和停止机制,服务作为一个容器和一个或多个连接器的支架。本章所附的应用程序展示了如何使用一个服务器和一个服务。
第15章介绍了通过Digester(一个令人兴奋的Apache软件基金会的开放源码项目)来配置一个Web应用程序。对于那些还没有入门的人来说,本章用一节来温和地介绍Digester库,以及如何使用它将XML文档中的节点转换为Java对象。然后,它解释了 ContextConfig
对象,用于配置一个 StandardContext
实例。
第16章解释了Tomcat使用的关机钩子,无论用户如何停止,Tomcat总是会得到一个清理的机会(即适当地通过发送关机命令或不适当地直接关闭控制台)。
第17章讨论了通过使用批处理文件和shell脚本来启动和停止Tomcat。
第18章介绍了部署程序,即负责部署和安装Web应用程序的组件。
第19章讨论了一个特殊的接口,即 ContainerServlet
,用来让servlet访问Catalina内部对象。特别是,它讨论了可以用来管理已部署的应用程序的管理器应用程序。
第20章讨论JMX,以及Tomcat如何通过为那些对象创建MBean使其内部对象可管理。
每一章都有一个或多个应用,重点介绍了Catalina中的某个特定组件。通常,你会找到所解释的组件的简化版或解释如何使用Catalina组件的代码。各章应用程序中的所有类和接口都位于ex[章号].pyrmont包或其子包中。例如,第1章中的应用程序中的类都是 ex01.pyrmont
包的一部分。
本书所附的应用程序使用J2SE 1.4版本运行。压缩后的源文件可以从作者的网站上下载,网址为
https://www.brainysoftware.com
。它包含了Tomcat 4.1.12和本书中使用的应用程序的源代码。假设你已经安装了J2SE 1.4,并且你的路径环境变量中包含了JDK的位置,请按照以下步骤进行操作:
./linux-compile.sh 复制代码
注意,更多信息可以在ZIP文件中包含的Readme.txt文件中找到。