原创作者: Budi Kurniawan & Paul Deck   阅读:4170次   评论:2条   更新时间:2011-12-31    

书名:深入剖析Tomcat
原书名:How Tomcat Works:A Guide to Developing Your Own Java Servlet Container
ISBN:9787111369974
作者:Budi Kurniawan    Paul Deck
译者:曹旭东
定价:59.00元
出版时间:2012年1月
出版社:机械工业出版社

了解本书更多信息 ,请点击【互动网 】【卓越网 】【豆瓣网

 

【内容简介】

本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。本书主要内容:
  • 如何开发Java Web服务器。
  • Tomcat是否会为每个servlet类创建多个实例。
  • Tomcat如何运行一个实现SimpleThreadModel接口的servlet类。
  • servlet容器的两个主要模块:连接器和servlet容器。
  • 如何构建或者扩展已有的连接器。
  • 4种servlet容器:Engine、Host、Context和Wrapper。
  • Tomcat如何管理Session,以及如何在分布式环境下扩展Session管理器。
  • Tomcat中的类载入器和如何创建自定义载入器。
  • Tomcat如何实现安全性和基本/基于表单/摘要的身份验证。
  • Tomcat中的领域与登录配置是如何工作的。
  • Tomcat如何处理配制文件(server.xml),以及如何通过Digester库将XML元素转换为Java对象。
  • Tomcat中的关闭钩子。
  • JMX、Apache的 Commons Modeler和Tomcat中的JMX托管资源。

【作者简介】

Budi Kurniawan是《Java for Web With Servlets, JSP and EJB》的作者,同时也是一位IT咨询师,主要研究方向包括互联网与面向对象程序设计。除了其他一些计算机图书,他已经在10多种出版物上发表了约100 篇文章,其中包括一些享有盛誉的Java杂志,如《Java.net》、《JavaPro》、《JavaWorld》等。Budi也是 Brainysoftware.com的应用程序File Upload Bean的作者,在世界范围内很多公司都获得授权并使用该应用程序。

Paul Deck是一个有15多年经验的IT架构师,参与了很多项目的开发,这些项目遍布在美国、加拿大、中国和澳大利亚。他喜欢旅行,对网络、互联网编程、设计模式和用户界面交互设计非常感兴趣。

 

 

《深入剖析Tomcat》(How Tomcat Works)译者序 Top

Tomcat是Apache 软件基金会(Apache Software Foundation)的一个顶级项目,由Apache、Sun和其他一些公司及个人共同开发,是目前比较流行的Web服务器之一。作为一个开源的、小型的轻量级应用服务器,Tomcat深受广大程序员的喜爱,具有占用系统资源少,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断地改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
虽然Tomcat易于使用,便于部署,但Tomcat本身是一个非常复杂的系统,包含了很多功能模块。这些功能模块密切合作,各司其职,构成了Tomcat的核心结构。作者从最基本的HTTP请求开始,直至使用JMX技术管理Tomcat中的应用程序,逐步深入,逐一剖析Tomcat的基本功能模块,并配以示例代码,使读者可以逐步实现自己的一个Web服务器。
当然,本书并不能完全覆盖Tomcat,书中并没有包含Tomcat的太多设计思路及具体的实现细节,而是更注重对Tomcat基本结构的分析介绍。在每一章中都有与本章内容相关的示例应用程序,帮助读者更好地理解该章的内容。
本书由曹旭东翻译,由于时间仓促,加上译者水平有限,书中难免有疏漏之处,望广大读者予以指正。
曹旭东
http://caoxudong818.iteye.com/

《深入剖析Tomcat》(How Tomcat Works)前言 Top

欢迎阅读本书。本书剖析了Tomcat 4.1.12版本和Tomcat 5.0.18版本的基本结构,并解释了其servlet容器Catalina的内部工作原理。Catalina是开源、免费的,也是最受欢迎的 servlet容器之一。Tomcat本身是一个复杂的系统,包含了许多不同的组件。若你想学习Tomcat的工作方式,应该从了解这些组件开始。本书描 述Tomcat的总体结构,并针对每个组件建立一个简单的版本,使你更好地理解组件的工作机制,之后对真实组件进行描述。

“本书结构”一节会对全书的章节设置做一个总体介绍,并说明构建的应用程序的总体结构。在“准备必需的软件”一节,说明需要下载使用哪些软件,如何为代码创建目录结构等。

本书读者对象

本书适合于所有使用Java技术工作的开发人员。

  • 如果你是一名JSP/Servlet程序员或Tomcat用户,并想了解servlet容器是如何工作的,那么本书很适合你;
  • 如果你想加入Tomcat开发团队,那么本书很适合你,因为你首先要学习已有的代码是如何工作的;
  • 如果你不是一名Web开发人员,但对软件开发很有兴趣,那么你可以从本书中学习到一个大型应用软件(如Tomcat)是如何设计和开发的;
  • 如果你想对Tomcat进行配置或定制,你应该阅读本书。

为了更好地理解本书所讲述的内容,你需要理解Java中的面向对象编程知识,以及Servlet编程方面的知识。如果你对后者还不熟悉,那么你学习 起来可能会有些困难。你可以先学习一下Servlet编程方面的知识,例如看一下Budi的《Java for the Web with Servlets, JSP, and EJB》一书。为了使你更好地理解本书的内容,每一章的开头都会有一段与该章内容相关的背景信息的介绍。

servlet容器是如何工作的

servlet容器是一个复杂的系统,但是,它有3个基本任务,对每个请求,servlet容器会为其完成以下3个操作:

创建一个request对象,用可能会在调用的Servlet中使用到的信息填充该request对象,如参数、头、cookie、查询字符串、 URI等。reqeust对象是javax.servlet.ServletRequest接口或 javax.servlet.http.ServletRequest接口的一个实例。

创建一个调用Servlet的response对象,用来向Web客户端发送响应。 response对象是javax.servlet.ServletResponse接口或javax.servlet.http.ServletResponse接口的一个实例;

调用Servlet的service()方法,将request对象和response对象作为参数传入。Servlet从request对象中读取信息,并通过response对象发送响应信息。

当你阅读具体的章节时,你会看到关于servlet容器Catalina的详细描述。

Catalina框图

Catalina是一个成熟的软件,设计和开发得十分优雅,功能结构也是模块化的。上一节“servlet容器是如何工作的”中提到了 servlet容器的任务,基于这些任务可以将Catalina划分为两个模块:连接器(connector)和容器(container)。

图I-1很简单,在后续的章节中,你会逐个接触到所有的组件。

图I-1 Catalina的主要模块

现在,回到图I-1,这里的连接器负责将一个请求与容器相关联。它的工作包括为它接收到的每个HTTP请求创建一个request对象和一个 response对象。然后,它将处理过程交给容器。容器从连接器中接收到request对象和response对象,并负责调用相应的Servlet的 service()方法。

但是请记住,上面所描述的处理过程只是Catalina容器处理请求的整个过程的一小部分,犹如冰山的一角,在容器中还包括很多其他的事情要做。例 如,在容器调用相应的Servlet的service()方法之前,它必须先载入该Servlet类,对用户进行身份验证(如果有必要的话),为用户更新 会话信息等。因此,当你发现容器使用了很多不同的模块来处理这些事情时,请不要太惊讶。例如,管理器模块用来处理用户会话信息,载入器模块用来载入所需的 Servlet类等。

Tomcat 4和Tomcat 5

本书涵盖了Tomcat 4和Tomcat 5两个版本。下面是这两个版本的一些区别之处:

  • Tomcat 5支持Servlet 2.4和JSP 2.0规范,Tomcat 4支持Servlet 2.3和JSP 1.2规范;
  • Tomcat 5默认的连接器比Tomcat 4默认的连接器执行效率更高;
  • Tomcat 5使用共享线程来执行后台任务,而Tomcat 4的组件使用各自的线程执行后台任务,因此,相比于Tomcat 4,Tomcat 5更节省资源;
  • Tomcat 5不再使用映射器组件来查找子组件,因此,代码更简单。

本书结构

本书共20章,前两章概述了全书内容。第1章介绍了HTTP服务器是如何工作的,第2章介绍了一个简单的servlet容器。第3章和第4章着重于连接器的说明,第5~20章介绍容器中的各个组件。下面是每一章的内容简介。

注意 每一章都配有一个应用程序用于对该章所介绍组件进行实际应用的说明。

第1章:本书从介绍一个简单的HTTP服务器开始。为了建立一个可以运行的HTTP服务器,你需要了解java.net包下Socket类和ServerSocket类的内部运行机制。该章有详细的背景信息介绍,使你可以理解该章中应用程序的运行机制。

第2章:阐明一个简单的servlet容器是如何工作的。该章有两个与servlet容器有关的应用程序,可以服务于静态资源的请求和简单 Servlet的请求。此外,你会学习到如何创建request对象和response对象,并将它们传递给被请求的Servlet的service() 方法。此外,在该servlet容器中有一个可以运行的Servlet,可以从Web浏览器中进行调用。

第3章:将对Tomcat 4中的默认连接器的精简版进行说明。该章中建立的应用程序可以作为一个学习工具,有助于理解在第4章中讨论的连接器。

第4章:对Tomcat 4的默认连接器进行说明。该连接器已经弃用,而是推荐使用另一个称为Coyote的执行速度更快的连接器。但是,原先的默认连接器更简单、更容易理解。

第5章:讨论容器模块。容器由org.apache.catalina.Container接口表示,共有4种类型的容器,分别是Engine、Host、Context和Wrapper。该章提供了两个分别与Context和Wrapper相关的应用程序。

第6章:对Lifecycle接口进行说明。该接口定义了Catalina组件的生命周期,并提供了一种优雅的方法来通知其他组件在该组件中发生了 某种事件。此外,Lifecycle接口提供了一种优雅的机制来启动和关闭Catalina中所有的组件,只需要启动/关闭一次即可。

第7章:介绍日志记录器组件,该组件用于记录错误消息和其他的相关消息。

第8章:对载入器组件进行介绍,载入器是Catalina中的重要模块,负责载入Servlet和Web应用程序中所需要的其他类。该章还将说明Web应用程序的重载是如何实现的。

第9章:介绍管理器组件。该组件负责在会话管理中管理会话。该章介绍了几种不同类型的管理器,并说明了管理器组件是如何持久化一个session对象的。在该章末尾,介绍如何使用StandardManager实例构建一个使用session对象保存数据的应用程序。

第10章:该章将讨论Web应用程序的安全限制,以限制对某些内容的访问。你会学习到一些与安全相关的实体,如主体、角色、登录配置和身份验证等。该章有两个应用程序,分别在StandardContext对象中安装了验证器阀,并使用基本验证来对用户进行身份验证。

第11章:对org.apache.catalina.core.StandardWrapper类进行了详细阐述,该类表示Web应用程序中的一 个Servlet对象。该章还说明了过滤器和Servlet的service()方法是如何调用的。该章的应用程序使用StandardWrapper实 例来表示实际的Servlet对象。

第12章:介绍org.apache.catalina.core.StandardContext类,该类表示一个Web应用程序。该章还说明了 如何对一个StandardContext对象进行配置(这是在接收到HTTP请求时进行的)、如何支持Web应用程序的自动重载,以及Tomcat 5如何通过一个共享线程来执行其相关联组件中的周期性任务。

第13章:对另外两种容器(Host和Engine)进行说明。该章对这两种容器的标准实现org.apache.catalina.core.StandardHost和org.apache.catalina.core.StandardEngine进行了说明。

第14章:对服务器组件和服务组件进行介绍。服务器组件提供了一种优雅的机制来启动或关闭整个servlet容器,服务组件可作为一个容器和一个或多个连接器的持有者。该章通过应用程序来说明如何使用服务器组件和服务组件。

第15章:说明如何通过Digester组件来对Web应用程序进行配置。Digester是Apache软件基金会的一个开源项目。即使你对这个 不熟悉也没有关系,该章会简要介绍Digester库,说明如何使用该库来将XML文档中的节点转换为Java对象。该章然后说明Tomcat是如何通过 ContextConfig对象来对StandardContext对象进行配置的。

第16章:对Tomcat中的关闭钩子进行说明。不论用户如何关闭Tomcat(即通过发送关闭命令,或是突然直接关闭控制台),通过使用关闭钩子,Tomcat总是可以执行一些清理工作。

第17章:对使用批处理文件和Shell脚本来启动和关闭Tomcat进行说明。

第18章:对部署器组件进行说明,该组件负责部署和安装Web应用程序。

第19章:对一个特殊接口(ContainerServlet)进行说明。使用该接口,Servlet对象可以访问Catalina中的内部对象。此外,该章会对用来管理已部署应用程序的Manager应用程序进行说明。

第20章:对JMX进行说明,并阐述Tomcat是如何为其内部对象创建MBean,并使这些内部对象可托管的。

每一章的应用程序

每一章都会有一个或多个应用程序用来解释Catalina中的某个特定组件的使用方法。一般情况下,在该应用程序中你会找到该组件的精简版,或是为 说明如何使用Catalina组件而编写的代码。在每一章的应用程序中编写的所有的类和接口都在ex[章号].pyrmont包下。例如,第1章的应用程 序类会在ex01.pyrmont包下。

准备必需的软件

本书的应用程序会运行在J2SE的1.4版本下。源文件的压缩包可以从作者的网站www.brainysoftware.com上下载。该压缩包包 含了Tomcat 4.1.12的源代码,以及本书中的应用程序的代码。假设你已经安装了J2SE的1.4版本,而且环境变量path也已经包含了JDK的路径,那么只需执 行下面的步骤。

1)解压缩zip文件。解压缩后会有一个名为HowTomcatWorks的新文件夹。HowTomcatWorks是工作目录,其下有一些子目 录,包括lib(包含所有必需的库文件)、src(包含所有源文件)、webroot(包含一个HTML文件和三个Servlet示例文件)和 webapps(包含示例应用程序);

2)进入到工作目录中,编译Java文件。若你使用Windows操作系统,则运行win-compile.bat批处理文件。若你使用Linux操作系统,则执行下面的命令(必要时,不要忘记用chmod命令修改文件的执行权限):

./linux-compile.sh

注意 更多的信息可以在压缩包的Readme.txt文件中找到。

《深入剖析Tomcat》(How Tomcat Works)目录 Top

译者序

前 言

1 章 一个简单的 Web 服务器 1

1.1   HTTP1

1.2   Socket 3

1.3  应用程序 5

1.4  小结 13

2 章 一个简单的 servlet 容器 14

2.1   javax.servlet.Servlet 接口 14

2.2  应用程序 116

2.3  应用程序 227

2.4  小结 30

3 章 连接器 31

3.1   StringManager 31

3.2  应用程序 33

3.3  小结 52

4 章  Tomcat 的默认连接器 53

4.1   HTTP 1.1 的新特性 54

4.2   Connector 接口 55

4.3   HttpConnector 56

4.4   HttpProcessor 58

4.5   Request 对象 61

4.6   Response 对象 62

4.7  处理请求 62

4.8  简单的 Container 应用程序 66

4.9  小结 70

5 章  servlet 容器 71

5.1   Container 接口 71

5.2  管道任务 73

5.3   Wrapper 接口 77

5.4   Context 接口 78

5.5   Wrapper 应用程序 78

5.6   Context 应用程序 84

5.7  小结 92

6 章 生命周期 93

6.1   Lifecycle 接口 93

6.2   LifecycleEvent 94

6.3   LifecycleListener 接口 94

6.4   LifecycleSupport 95

6.5  应用程序 97

6.6  小结 104

7 章 日志记录器 105

7.1   Logger 接口 105

7.2   Tomcat 的日志记录器 106

7.3  应用程序 111

7.4  小结 112

8 章 载入器 113

8.1   Java 的类载入器 113

8.2   Loader 接口 114

8.3   Reloader 接口 116

8.4   WebappLoader 116

8.5   WebappClassLoader 120

8.6  运行应用程序 124

8.7  小结 124

9 章  Session 管理 125

9.1   Session 对象 126

9.2   Manager130

9.3  存储器 136

9.4  应用程序 139

9.5  小结 142

10 章 安全性 143

10.1  领域 143

10.2   GenericPrincipal 144

10.3   LoginConfig 145

10.4   Authenticator 接口 145

10.5  安装验证器阀 146

10.6  应用程序 147

11 章  StandardWrapper159

11.1  方法调用序列 159

11.2   SingleThreadModel160

11.3   StandardWrapper161

11.4   StandardWrapperFacade 170

11.5   StandardWrapperValve 171

11.6   FilterDef 172

11.7   ApplicationFilterConfig 174

11.8   ApplicationFilterChain 175

11.9  应用程序 175

11.10  小结 177

12 章  StandardContext 178

12.1   StandardContext 的配置 178

12.2   StandardContextMapper 184

12.3  对重载的支持 187

12.4   backgroundProcess() 方法 188

12.5  小结 190

13 章  Host Engine191

13.1   Host 接口 191

13.2   StandardHost 193

13.3   StandardHostMapper 195

13.4   StandardHostValve 196

13.5  为什么必须要有一个 Host 容器 197

13.6  应用程序 1198

13.7   Engine 接口 199

13.8   StandardEngine 201

13.9   StandardEngineValve 201

13.10  应用程序 2202

13.11  小结 203

14 章 服务器组件和服务组件 204

14.1  服务器组件 204

14.2   StandardServer 206

14.3   Service 接口 209

14.4   StandardService 211

14.5  应用程序 215

14.6  小结 219

15 章  Digester 220

15.1   Digester 221

15.2   ContextConfig 234

15.3  应用程序 243

15.4  小结 244

16 章 关闭钩子 245

16.1  关闭钩子的例子 246

16.2   Tomcat 中的关闭钩子 250

16.3  小结 250

17 章 启动 Tomcat251

17.1   Catalina 251

17.2   Bootstrap 259

17.3  在 Windows 平台上运行 Tomcat264

17.4  在Linux平台上运行Tomcat278

17.5  小结 290

18 章 部署器 291

18.1 部署一个Web应用程序291
18.2 Deploy接口299
18.3 StandardHostDeployer类302
18.4 小结306

第19章 Manager应用程序的servlet类307

19.1 使用Manager应用程序307
19.2 Containerservlet接口309
19.3 初始化ManagerServlet309
19.4 列出已经部署的Web应用程序311
19.5 启动Web应用程序312
19.6 关闭Web应用程序313
19.7 小结314

第20章 基于JMX的管理315

20.1 JMX简介315
20.2 JMX API316
20.3 标准MBean318
20.4 模型MBean321
20.5 Commons Modeler库326
20.6 Catalian中的MBean332
20.7 创建Catalina的MBean335
20.8 应用程序339
20.9 小结342

第1章 一个简单的Web服务器 Top

本章介绍Java Web服务器是如何运行的。Web服务器也称为超文本传输协议(HyperText Transfer Protocol,HTTP)服务器,因为它使用HTTP与其客户端(通常是Web浏览器)进行通信。基于Java的Web服务器会使用两个重要的类:java.net.Socket类和java.net.ServerSocket类,并通过发送HTTP消息进行通信。本章先介绍HTTP协议和这两个类,然后介绍一个简单的Web服务器。

1.1 HTTP

HTTP允许Web服务器和浏览器通过Internet发送并接收数据,是一种基于“请求-响应”的协议。客户端请求一个文件,服务器端对该请求进行响应。HTTP使用可靠的TCP连接,TCP协议默认使用TCP 80端口。HTTP协议的第一个版本是HTTP/0.9,后来被HTTP/1.0取代,随后HTTP/1.0又被当前版本HTTP/1.1取代。HTTP/1.1定义于RFC(Request for Comment,请求注解) 2616中,可以从http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf下载。

注意 本节简单地介绍HTTP 1.1,目的是帮助你了解Web服务器应用程序发送的消息。若你对此有兴趣,想了解更多信息,请阅读RFC 2616。

在HTTP中,总是由客户端通过建立连接并发送HTTP请求来初始化一个事务的。Web服务器端并不负责联系客户端或建立一个到客户端的回调连接。客户端或服务器端可提前关闭连接。例如,当使用Web浏览器浏览网页时,可以单击浏览器上的Stop按钮来停止下载文件,这样就有效地关闭了一个Web服务器的HTTP连接。

1.1.1 HTTP请求

一个HTTP请求包含以下三部分:

 

  • 请求方法—统一资源标识符( Uniform Resource Identifier URI )—协议 / 版本
  • 请求头
  • 实体

HTTP请求的示例如下所示:
POST/examples/default.jsp HTTP/1.1
Accept:text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

lastName=Franks&firstName=Michael

请求方法—URI—协议/版本部分出现在请求的第一行,
POST /examples/default.jsp HTTP/1.1
其中POST是请求方法,/examples/default.jsp表示URI,HTTP/1.1表明请求使用的协议及其版本。

每个HTTP请求可以使用HTTP标准中指定的诸多请求方法中的一种。HTTP 1.1支持的7种请求方法包括:GET、POST、HEAD、OPTIONS、PUT、DELETE和TRACE。其中GET和POST是Internet应用中最常用的两种请求方法。


URI指定Internet资源的完整路径。URI通常会被解释为相对于服务器根目录的相对路径。因此,它总是以“/”开头的。统一资源定位符(Uniform Resource Locator ,URL)实际上是URI的一种类型(参见http://www.ietf.org/rfc/rfc2396.txt)。协议版本指明了当前请求使用的HTTP协议的版本。
请求头包含客户端环境和请求实体正文的相关信息。例如,请求头可能会包含浏览器使用的语言,请求实体正文的长度等信息。各个请求头之间用回车/换行(Carriage Return/LineFeed, CRLF)符间隔开。


在请求头和请求实体正文之间有一个空行,该空行只有CRLF符。这个空行对HTTP请求格式非常重要。CRLF告诉HTTP服务器请求实体正文从哪里开始。在有些Internet编程书籍中,CRLF被认为是HTTP请求的第4部分。


在前面的HTTP请求的示例中,请求实体正文很简单,如下所示:
lastName=Franks&firstName=Michael

当然,在一个典型的HTTP请求中,HTTP请求实体正文也可以很长。

1.1.2 HTTP响应

与HTTP请求类似,HTTP响应也包括三部分:

  • 协议—状态码—描述
  • 响应头
  • 响应实体段

下面是一个HTTP响应的示例:

HTTP/1.1 200 OK

Server: Microsoft-IIS/4.0

Date: Mon, 5 Jan 2004 13:13:33 GMT

Content-Type: text/html

Last-Modified: Mon, 5 Jan 2004 13:13:12 GMT

Content-Length: 112

 

<html>

<head>

<title>HTTP Response Example</title>

</head>

<body>

Welcome to Brainy Software

</body>

</html>

HTTP响应头的第一行与HTTP请求头的第一行类似。第一行指明了使用的协议是HTTP/1.1,请求发送成功(状态码200表示请求成功),一切都正常执行。

 

从上面的示例中可以看出,它与请求头类似,响应头也包含了一些有用的信息。响应实体正文是一段HTML代码。响应头和响应实体正文之间由只包含CRLF的一个空行分隔。

  • 大小: 150.1 KB
评论 共 2 条 请登录后发表评论
2 楼 至尊宝_唯一 2012-02-11 23:10
这本书的中文版出的太晚了,有点老了,Tomcat6与Tomcat5有很大的区别啊。但英文版的确是好书
1 楼 lost_alien 2012-01-07 11:00
这算什么啊。。。。都2012年了,还tomcat4,5呢??这本书的英文版都出了多少年了。。。好歹你们加点新东西啊。。。。

发表评论

您还没有登录,请您登录后再发表评论

文章信息

Global site tag (gtag.js) - Google Analytics