?? Tomcat下有9个目录,分别是bin,common,conf,logs,server,shared,temp,webapps,work 目录,现在对每一目录做介绍。Tomcat根目录在tomcat中叫<catalina_home>。
-<catalina_home>/bin-
??? 存放各种平台下启动和关闭Tomcat的脚本文件。startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件。
-<catalina_home>/common-
??? 在common目录下的lib目录,存放Tomcat服务器和所有web应用都能访问的JAR。
-<catalina_home>/shared-
??? 在shared目录下的lib目录,存放所有web应用能访问的,但Tomcat不能访问的JAR。
-<catalina_home>/server-
??? 在server/webapps目录中,存放Tomcat自带的两个APP-admin和manager应用,使用来管理Tomcat-web服务用的。在server/lib目录中,存放tomcat服务器所需要的各web应用不能访问种jar。
-<catalina_home>/webapps-
??? web应用的发布目录,把 java开发的web站点或war文件放入这个目录下就可以通过tomcat服务器访问了。
2.Tomcat的启动
??? Tomcat的启动是从解析bat文件开始,bat文件最终调用org.apache.catalina.startup.Bootstrap开始类的加载。
2.1 TOMCAT自己的类载入器(ClassLoader)加载流程如下:
?????? +---------------------------+
?????? |???????? Bootstrap???????? |
?????? |???????????? |???????????? |
?????? |????????? System?????????? |
?????? |???????????? |???????????? |
?????? |????????? Common?????????? |
?????? |???????? /????? \????????? |
?????? |???? Catalina? Shared????? |
?????? +---------------------------+
其中:
-Bootstrap –
??? 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar。
- System -
①载入$CATALINA_HOME/bin/bootstrap.jar? 初始化Tomcat,执行Main方法。
②$JAVA_HOME/lib/tools.jar? Sun的工具类,包括编译Jsp为Servlet的工具类。
- Common -
??? 这个目录下的类虽然对TOMCAT和所有的WEB APP都可见。但是Web App的类不应该放在这个目录下,所有未打包的Class都在$CATALINA_HOME/common/classes下,所有打包的jar都在$CATALINA_HOME/commons/endorsed和$CATALINA_HOME/common/lib下,默认情况会包含以下几个包:
①jndi.jar JNDI API接口,这个包仅在Java1.2时候装入,1.3以后的版本JDK已自动装入。
②naming-common.jar JNDI接口实现类,Tomcat用这些类在内存中使用Context。
③naming-resources.jar JNDI实现,Tomcat用它们定位Web App的静态资源。
④servlet.jar Servlet,Jsp API。
⑤xerces.jar XML解析器,特定的Web App可以在自己的/WEB-INF/lib 中覆盖。
- Catalina -
??? 装入Tomcat实现所有接口的类,这些类对Web App是完全不可见的,所有未打包的类在$CATALINA_HOME/server/classes,所有jar包在$CATALINA_HOME/server/lib下。一般情况该ClassLoader将Load下面几个包:
①catalina.jar Servlet容器的Tomcat实现包。
②jakarta-regexp-X.Y.jar 正则表达式,请求过滤时使用。
③servlets-xxxxx.jar Servlet支持包。
④tomcat-coyote.jar Tomcat的Coyote连接实现包。
⑤tomcat-jk.jar Web Server绑定包,允许Tomcat绑定Apache等作为Web Server。
⑥tomcat-jk2.jar 功能同上。
⑦tomcat-util.jar Tomcat工具类,可能被一些Connector用到。
⑧tomcat-warp.jar 用于Apache Server包。
- Shared -
??? 载入所有WEB APP都可见的类,对TOMCAT不可见。 所有未打包的类在$CATALINA_HOME/shared/classes,所有jar包在$CATALINA_HOME /lib下。默认情况包含下面几个包:
①jasper-compiler.jar Jsp编译器,编译Jsp为Servlet。
②jasper-runtime.jar Jsp(已编译成Servlet)运行支持包。
③naming-factory.jar 支持Web App使用JNDI的封装包。
-WebAppX -
??? Web App ClassLoader,Web App被部署是在该ClassLoader被创建的时候。所有class都在WEB-INF/classes下,所有jar在WEB-INF/lib下。特别注意WEB APP自己的ClassLoader的实现与众不同:
??? 它先试图从WEB APP自己的目录里载入,如果失败则请求父ClassLoader的代理。这样可以让不同的WEB APP之间的类载入互不干扰.另,Tomcat Server使用的是Catalina?? ClassLoader,一般的Web App使用的是WebApp ClassLoader。
2.2 下面总结Tomcat类加载过程
Bootstrap($JAVA_HOME/jre/lib/ext/*.jar)
System($CLASSPATH/*.class和指定的jar)
Common($CATALINA_HOME/common 下的classes,lib,endores三个子目录)
Catalina ($CATALINA_HOME/server/下的classes和lib目录仅对Tomcat可见)
Shared($CATALINA_HOME/shared/下的classes和lib目录以及$CATALINA_HOME/lib目录)
??? 仅对Web应用程序可见,对Tomcat不可见WebApp($WEBAPP/Web-INF/*仅对该WEB应用可见classes/*.class lib/*.jar)
2.3加载类和资源的顺序为:
1、/Web-INF/classes
2、/Web-INF/lib/*.jar
3、Bootstrap
4、System
5、$CATALINA_HOME/common/classes
6、$CATALINA_HOME/common/endores/*.jar
7、$CATALINA_HOME/common/lib/*.jar
8、$CATALINA_HOME/shared/classes
9、$CATALINA_HOME/shared/lib/*.jar
3.server.xml
3.1配置tomcat组件的XML文件server.xml:
①顶层类元素[Top Level Elements]: 位于整个配置文件的顶层, 包括<server>和<service>。
②连接器类元素[Connectors ]: 客户和服务(容器类元素)间的通讯接口。接受客户请求,返回响应结果<connector>。
③容器类元素[Containers]: 处理客户请求并且生成响应结果,包含3个:<engine> <host> <context>。
④嵌套类元素[Nested Components]: 可以加入到容器中的元素,包括:<logger> <valve><realm>等。
表示客户端和service之间的连接
如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
表示指定service中的请求处理机,接收和处理来自Connector的请求
指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范
表示此web应用程序的url的前缀,这样请求的url为
这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序
如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口
如果为true,则log文件名中要加入时间,如下例:localhost_log.2007-03-04.txt
指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口
功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样
指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多
??? 一个<server>包含一个或多个<service>,一个<service>包含唯一一个<engine>和一个或多个<connector>,多个 <connector>共享一个<engine>;一个<engine>包含多个<host>,每个<host>定义一个虚拟主机,包含一个或多个web应用<context>; <context>元素是代表一个在虚拟主机上运行的Web应用。<context>标签的描述(Apache官方文档):
??? Please note that for tomcat 5.x, unlike tomcat 4.x, it is NOT recommended to place <context> elements directly in the server.xml file. Instead, put them in the META-INF/context.xml directory of your WAR file or the conf directory as described above.
3.3分析server.xml
-Server-
??? server元素是JVM的入口点,整个配置文件只有一个,因为server不是容器(container),因此不能嵌套子组件。server在某一指定的端口监听shutdown命令。server可以包含一个或多个service实。
-Service-
??? service有共享同一个Container的一个或多个Connectors组成,一般Service就是一个Engine,但没有明确规范要求如此。因为Service不是一个Container,因此不能在里面嵌套子组件(比如Loggers/Valves)。
-Connector-
??? connector就是一个Tomcat与客户端的连接,Tomcat有两种典型的Connector:http,JK2.http connector监听来自Browser的连接(通常在我们熟悉的8080端口),JK2.来自其他WebServer的请求(默认在8009端口监听)。Connector会把获得的请求交给Engine处理。
-Engine-
??? Engine下可以配置多个虚拟主机Virtual Host,每个虚拟主机都有一个域名。当Engine获得一个请求时,它把该请求匹配到某个Host上,然后把该请求交给该Host来处理。Engine有一个默认虚拟主机,当请求无法匹配到任何一个Host上的时候,将交给该默认Host来处理。
-Host-
??? host代表一个虚拟主机,默认是localhost,host下可以部署多个web application,在我们实际应用中一般要考虑问题的对象就是host。
4.Tomcat主要组件类介绍
4.1 org.apache.catalina.Lifecycle
??? 通用的组件声明周期接口,一般Tomcat的组件都要实现这个接口(但不是必须的),这个接口是为所有组件提供相同的start和stop。
4.2 org.apache.catalina. LifecycleListener
??? 该接口用于监听一些重要事件(包括实现了Lifecycle接口组件产生的start,stop事件)。
4.3 org.apache.catalina.Container
??? 容器是用于从客户端取得请求(request)并且处理请求并回复给客户端(response)的对象。容器可以支持(可选)pipeline,以便能在运行时按配置的顺序处理请求。
??? 在Tomcat里面,容器在概念上存在以下几层:
-Engine-请求处理入口点,可以包含多个Host和Context。
-Host-代表一个虚拟主机。
-Context-代表单个ServletContext,可以包含多个Wrappers。
-Wrapper-代表单个Servlet,如果Servlet实现了SingleThreadModel,可以代表单个Servlet的多个实例。
??? 容器为了实现自己的功能经常要绑定一些其他组件,这些组件的功能可能被共享,也可以被单独定制,下面是被使用的组件:
-Loader-ClassLoader,装载Java Classes。
-Logger-实现了ServletContext的log方法,用于记录日志。
-Manage-管理与容器绑定的session池。
-Realm-用户安全管理。
-Resources-JNDI资源访问
4.4 org.apache.catalina. ContainerListener
??? 容器事件监听器,注意的是start,stop是正常的生命周期事件(LiftcycleEvent)不是容器事件。
4.5 org.apache.catalina. Pipeline
??? Pipleline是Valve的集合,当invoke方法被调用时,它会按指定的顺序调用Valve,它总是要求有一个Valve必须处理传递的request(一般是最后一个)并产生response,否则就把request传递到下一个Valve。
??? 一般一个容器仅绑定一个Pipleline实例,一般说来容器会把处理request的功能封装到一个容器绑定的Valve里(这个Valve应该在Pipleline最后被执行)。为了完成这个功能,Pipleline提供了setBasic()方法以保证Valve被最后执行,而其他Valve按顺序被调用。
4.6 org.apache.catalina.Valve
??? Valve是被绑定在一个Container上的请求处理组件,一组Valve被按顺序绑定在一个Pipleline上。
??? 一个Valve可能按照一定的顺序执行下面的动作:
*1.检查并且(或者)修改指定的Request和Response属性。
*2.检查Request属性,生成相应的Response并返回控制权到调用者。
*3.检查Request和Reponse属性,包装这些对象并增强它们的功能,然后把它们传到下一个组件。
*4.如果相应的Response没有被产生(并且控制权也没有被返回)调用Pipleline上的下一个Valve(如果有)通过方法context.invokeNext()。
*5.检查(但不修改)Response属性(调用后面的Valve或Container产生的)。
??? Valve一定不能作下面的事情:
*1.改变Request的一些属性(Change request properties that have already been used to direct the flow of processing control for this request)。
*2.创建一个已经被创建并且已经被传递的Response。
*3.在调用invokeNext()方法并返回后修改包含Response的HTTP Header信息。
*4.在invokeNext()调用返回后在绑定Response上的输出流上作任何调用。
???? *@param*@param*@param context 被用来调用下一个Valve的Valve Context
4.7 org.apache.catalina.ValveContext
??? 一个ValveContext是这样一种机制:一个Valve可以触发下一个Valve的调用,而不必知道机制的内在实现。
4.8 org.apache.catalina.Engine
??? Engine是一个容器,是Cataline的Servlet的入口点。当发布一个连接到Web Server的Cataline时可能不使用Engine,因为Connectior将使用Web Server的资源决定使用哪个Context处理Request。附属于Engine的子容器根据Engine实现的不同可能是Host或Context(单个Servlet Context)。如果使用了Engine,在Cataline的层次中它就是顶层容器,因此setParent()应改抛出IllegalArgumentException异常。
4.9 org.apache.catalina. Host
??? Host是一个容器,它代表一个虚拟主机。当发布一个连接到Web Server的Cataline时可能不使用Host,因为Connectior将使用Web Server的资源决定使用哪个Context处理Request。Host所附属的父容器通常是Engine,附属于Host的子容器通常是Context(单个Servlet Context)。Host接口里面的方法多数都是关于修改Host属性及设定默认的Context。这里我们不再一一列举。
4.10 org.apache.catalin. Context
??? Context是一个容器,它代表一个ServletContext,一个Cataline Engline中的单个的Web Application。Context所附属的父容器是Host,附属于Context的子容器是Wrapper(代表单个Servlet)。Context接口里面多数是关于Web Application的设置的方法,我们可以参考Web.xml文件研究里面的方法,里面多数方法都是如何读取Web.xml文件里的资源。
4.11 org.apache.catalina.Wrapper
??? Wrapper是一个容器,它代表单个Servlet。Wrapper管理Servlet的生命周期,包括调用init()和destory()方法。Wrapper所附属的父容器是Context,没有附属于Wrapper的子容器,方法addChild()应该抛出IllegalArgumentException异常。Wrapper接口里面的方法都是关于读取Servlet的属性,可以参考Web.xml文件里面关于<servlet>标签的定义。
4.12 org.apache.catalina.Server
??? Server是整个Catalina容器的入口点,可以包含多个Service和顶层资源元素。一般说来实现Server接口的类也应该同时实现Lifecycle接口,当start()和stop()方法被调用的时候调用Service相应的方法。?
??? Server负责在指定的端口监听连接,当有连接被接受的时候,Server会分析请求的第一行信息,如果是SHUTDOWN则stop服务。可以参考Server.xml文件关于Server的定义。
4.13 org.apache.catalina. Service
??? Service是一个或多个共享同以Container的Connectiors的集合。
JVM可以包含一个或多个Service实例,但它们相互之间是完全独立的,它们仅共享JVM的资源。
4.14 org.apache.catalina. Connector
??? Connector是一个从客户端接受请求(request)并生成回应(reponse)的组件。一个Connection通常执行下面的逻辑:
1)从客户端程序接受请求。
2)创建Request和Response,并把下面这些属性设置到这些对象。
??? 对所有的Request,connector,protocol,protocol,response,scheme,secure,serverName,serverPort,serverPort属性必须被设置。contentLength,contentType通常也被设置。
??? 对所有的HttpRequests,method,queryString,requestedSessionCookie,requestedSessionId,requestedSessionURL,requestURI,secure属性必须被设置。另外所有addXxx方法也必须被调用以记录cookies,headers和locales信息。
??? 对所有的Responses属性connector,request,stream属性必须被设置。对HttpResponses来说,connector不会为它设置额外headers信息。
5.WEB应用程序的目录结构
??? 在WEB上发布的J2EE应用程序都有自己特定的目录结构。假设创建一名为HELLOAPP的WEB项目。
-HELLOAPP-WEB应用根目录,所有JSP\HTML等文件均存放于此。
-HELLOAPP/WEB-INF-存放WEb应用的发布描述文件web.xml。
-HELLOAPP/WEB-INF/classes-存放各种class文件,servlet类文件也存放于此。
-HELLOAPP/WEB-INF/lib-存放WEb应用所需的各种JAR文件。
6 .参考资料
[1] Tomcat简介 ,http://blog.csdn.net/SouthTitan/archive/2006/07/03/871509.aspxhttp://blog.csdn.net/SouthTitan/archive/2006/07/03/871509.aspx
[2] tomcat5.0 目录结构,http://blog.csdn.net/cesium/archive/2007/03/01/1518172.aspxhttp://blog.csdn.net/cesium/archive/2007/03/01/1518172.aspx
[3] tomcat 虚拟主机配置 ,http://www.blogjava.net/zhip/archive/2006/12/28/90480.htmlhttp://www.blogjava.net/zhip/archive/2006/12/28/90480.html
[4] tomcat做web服务器时,通过地址栏传中文参数时编码编译,
http://blog.csdn.net/gnemy/archive/2007/02/13/1509433.aspxhttp://blog.csdn.net/gnemy/archive/2007/02/13/1509433.aspx
[5]Apache网站官方文档。
本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/19865
相关推荐
### Tomcat5启动流程与配置详解 #### 一、Tomcat5.0目录结构 Tomcat作为一款广泛使用的开源Web服务器软件,其5.0版本的目录结构清晰且功能明确,便于用户理解和维护。以下是对Tomcat5.0各个目录的具体介绍: 1. *...
本文将深入探讨Tomcat 5的启动流程、目录结构以及配置详解。 1. **Tomcat 5.0 目录结构** - **bin**: 包含操作系统特定的启动和关闭脚本,如`startup.bat`和`shutdown.bat`,分别用于启动和停止Tomcat服务。 -...
1.8 Tomcat5启动流程与配置详解 1.9 HttpServlet详解 1.10 Ant使用入门 1.11 Maven Ant之间的比较 1.12 详解MANIFEST.MF文件 1.13 Maven入门--概念与实例 1.14 Subversion 1.15 jar war ear区别 1.16 如何在...
#### 三、配置Tomcat启动参数的重要性 在Windows环境中以Service方式启动Tomcat时,默认的JVM参数设置往往较低,这可能导致在运行大型应用程序时遇到内存不足的问题,例如常见的`java.lang.OutOfMemoryError: Perm...
Tomcat启动分析与配置详解 Tomcat是一款广泛使用的开源Java Servlet容器,它实现了Java EE的Web应用程序规范。理解Tomcat的启动过程和配置对于优化服务器性能和管理Web应用至关重要。本文将深入解析Tomcat的组成...
### Linux 下配置 Tomcat 开机启动 #### 概述 本文档主要介绍如何在 Linux 系统中配置 Apache Tomcat 服务器实现开机自动启动。通过编写一个简单的 Bash 脚本,并将其设置为系统服务的方式,可以确保 Tomcat ...
### jdk1.6与绿色版tomcat5.5安装配置详解 #### 一、安装配置JDK 1.6.0_17 **1.1 下载JDK** 由于JDK 1.6.0_17的安装包较大,通常需要从官方网站或其他可靠来源下载。本教程中提到的绿色版本JDK可以更方便地进行...
《Tomcat与Java Web开发技术详解(第2版)》是由孙卫琴编著的一本深入探讨Java Web开发和Tomcat应用服务器的经典书籍。这本书详细介绍了如何使用Tomcat进行Java Web应用程序的部署和运行,是Java开发者的重要参考资料...
### Tomcat6安装与配置详解 #### 一、Tomcat6的安装步骤 **1. 下载Tomcat** 首先,访问Tomcat官方网站(http://tomcat.apache.org/)进行Tomcat的下载。用户可以选择ZIP格式或EXE格式进行下载,其中ZIP格式无需安装...
### Linux下Nginx+Tomcat整合的安装与配置详解 在现代的Web服务器架构中,Nginx作为高性能的反向代理服务器和负载均衡器,常被用来与Tomcat等应用服务器配合使用,以提高网站的响应速度、稳定性和安全性。本文将...
### JSP+Tomcat开发环境安装及配置知识点详解 #### 软件准备与环境搭建 **1. JDK (Java Development Kit)** JDK是Java开发的基础,包含了编译、运行Java程序所需的工具和库。文章提及的JDK 1.6版本虽已过时,但在...
【标题】:Tomcat启动详解 【描述】:Tomcat是Apache软件基金会的Jakarta项目下的一个开源项目,是一款广泛使用的Java应用服务器,主要用于运行Servlet和JSP。本资料主要探讨Tomcat的启动过程,包括启动配置、环境...
从 `Bootstrap` 类开始,逐步初始化类加载器、加载配置文件,直到启动服务器并监听端口,最终形成一个完整的 Tomcat 启动过程。这一过程不仅揭示了 Tomcat 内部工作原理,也为进一步理解和优化 Tomcat 配置提供了...
首先,书中会详细介绍Tomcat的安装和配置过程,包括不同操作系统下的安装方法、环境变量设置以及服务器的启动和停止。这涵盖了基础的系统管理员知识,让读者能够快速搭建起开发环境。 其次,书中的核心内容会讲解...
【Tomcat 6.0配置与使用详解】 Tomcat是一款广泛应用的开源Java Servlet容器,用于部署和运行Java Web应用程序。本文将深入解析Tomcat 6.0的下载、配置、目录结构及其主要组件,帮助你更好地理解和使用这款服务器。...
《Tomcat启动优化与并发优化配置详解》 Tomcat,作为Java Web应用最常用的服务器,其性能优化对于提升系统整体效率至关重要。本文将深入探讨Tomcat的启动优化和并发优化配置,帮助开发者们更好地理解并实践这些关键...