第二章 Tomcat简介
2.1 Tomcat概述
Tomcat是完全由Java语言编写的Servlet容器。
Tomcat除了能够充当运行Servlet的容器,还提供了作为Web服务器的一些实用共能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。
2.2 Tomcat作为Servlet容器的基本功能
Servlet是一种运行在服务器上的小插件。Servlet最常见的用途是扩展Web服务器的功能,可作为非常安全的、可移植的、易于使用的CGI的替代品。Servlet具有以下特点:
- 提供了可被服务器动态加载并执行的程序代码,为来自客户的请求提供相应服务。
- Servlet完全用Java编写,因此要求运行Servlet的服务器必须支持Java语言。
- Servlet完全在服务端运行,因此它并不依赖于浏览器。不管浏览器是否依赖于java语言,都能请求访问服务端的Servlet。
Tomcat作为Servlet的容器,其基本功能是负责接收和解析来自客户的请求,把客户的请求传送给响应的Servlet,并把Serlvet的响应结果返回给客户。
Servlet容器响应客户请求访问特定Servlet的基本流程:
- 客户发出要求访问的Servlet的请求。
- Servlet容器接收到请求,对其解析。
- Servlet容器创建一个ServletRequest对象,在ServletRequest对象中包含了客户端你请求信息以及其他关于客户的信息,如请求头、请求正文以及客户机的IP地址。
- Servlet容器创建一个ServletResponse对象。
- Servlet容器调用客户所请求的Servlet的service() 服务方法,并把ServletRequset对象和ServletResponse对象作为参数传给该服务。
- Servlet从ServletRequest对象中获取客户的请求信息。
- Servlet利用ServletResponse对象生成响应结果。
- Servlet容器把Servlet生成的响应结果发送给客户。
2.3 Tomcat的组成结构
Tomcat本身由一系列的可配置组件构成,其中核心组件是Servlet容器组件,它是所有其他Tomcat组件的顶层容器。用<CATALINA_HOME>来表示Tomcat安装的根目录。
Tomcat的容器组件可以在<CATALINA_HOME>/conf/server.xml文件中配置,每个Tomcat组件在Server.xml文件中对应一种配置元素。
<Server>
<Service>
<Connector/>
<Engine>
<Host>
<Context>
</Context>
</Host>
</Engine>
</Service>
</Server>
Tomcat的元素可以分为四类:
- 顶层类元素:
<Server>和<Service>
,它们位于配置文件的顶层。 - 连接器类元素:
<Connector>
代表介于客户与服务器之间的通信接口,负责将客户的请求信息发送给服务器,并将服务器的响应结果发送给客户。 - 容器类元素:代表处理客户请求并生成响应结果的组件。
<Engine>、<Host>、<Context>和<Cluster>
。Engine组件为特定的Service组件处理所有客户请求。Host组件为特定的虚拟主机处理所有的客户请求,Context组件为特定的Web应用处理所有的客户请求。Cluster组件负责为Tomcat集群系统进行会话复制、Context组件的属性复制以及集群范围内WAR文件的发布。 - 嵌套类元素:代表可以嵌入到容器中的组件,如
<Vlaue>和<Realm>
元素等。
提示:
Tomcat的组成结构是由自身的实现决定的,它与Servlet的规范无关。不同的服务器开发商可以用不同的方式来实现服务Servlet规范的Servlet容器。
<Server>
元素:代表整个Servlet容器组件,它是Tomcat的顶层元素,可以包含一个或多个<Service>
元素。<Service>
元素:包含一个<Engine>
元素以及一个或多个<Connector>
元素,这些<Connector>
元素共享一个<Engine>
元素。<Connector>
元素代表和客户程序实际交互的组件,负责接收客户请求以及行客户返回响应结果。<Engine>
元素:每个<Service>
元素只能包含一个<Engine>
元素。<Engine>
处理在同一个<Service>
中所有<Connector>
元素接收到的客户请求。<Host>
元素:一个<Engine>
可以包含多个<Host>
元素。每个<Host>
元素定义了一个虚拟主机,他可以包含一个或多个Web应用。<Context>
元素:是使用最频繁的元素,每个<Context>
元素代表了运行在虚拟主机上的一个Web应用。一个<Host>
元素可以包含多个<Context>
元素。
上图可以表名,Connector组件负责接收客户的请求并向客户返回一个响应结果,同一个Service中多个Connector共用一个Engine,同一个Engine组件可以有多个Host组件,同一个Host组件可以有多个Context组件。
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
2.4 Tomcat的工作模式
Tomcat作为Servlet容器有一下三种工作模式:
(1)独立的Servlet容器
Tomcat作为独立的Web服务器来单独运行,Servlet容器组件作为Web服务器的一部分而存在。这是Tomcat的默认工作模式。
在这种模式下,Tomcat是一个独立运行Java程序。和运行其他Java程序一样,需要启动一个Java虚拟机进程来运行Tomcat。
(2)其他Web进程内的Servlet容器
在这种模式下,Tomcat分为Web服务器插件和Servlet容器组件两部分。Web服务器插件在其他Web服务器进程的内部地址空间启动一个Java虚拟机,Servlet容器组件在此Java虚拟机中运行。如有客户端发出调用Servlet的请求,Web服务器插件获得此请求的控制并将它转发(JNI通信机制)给Servlet容器组件。
注:JNI(Java Nativ Interface),Java本地调用接口,Java程序可以采用其他语言编写的本地程序进行通信。
(3)其他Web服务器进程外的Servlet容器
在这种模式下,Tomcat分为Web服务器插件和Servlet容器组件两部分。Web服务器插件在其他Web服务器外部地址空间启动一个Java虚拟机进程,Servlet组件在此虚拟机中运行。采用IPC通信(进程间通信)。
进程外的Servlet容器对客户请求的响应速度不入进程内Servlet容器,但进程外容器有更好的伸缩性和稳定性。