1 Tomcat5.0目录结构
Tomcat下有9个目录,分别是
bin,common,conf,logs,server,shared,temp,webapps,work 目录,现在对每一
目录做介绍。Tomcat根目录在tomcat中叫<CATALINA_HOME>。
-<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>/work –
Tomcat把各种由jsp生成的servlet文件放在这个目录下。
-<CATALINA_HOME>/temp –
临时活页夹,Tomcat运行时候存放临时文件用的。
-<CATALINA_HOME>/logs –
存放Tomcat的日志文件。
-<CATALINA_HOME>/conf –
Tomcat的各种配置文件,最重要的是 server.xml。下文将详细介绍此文件:
-<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>等。
3.2下表为server.xml配置简介:
元素名 属性 解释
server port 指定一个端口这个端口负责监听关闭 tomcat的请求
shutdown 指定向端口发送的命令字符串
service name 指定 service的名字
Connector
(表示客户端和 service之间的连接 )
port——指定服务器端要创建的端口号并在这个端口监听来自客户端的请求
minProcessors——服务器启动时创建的处理请求的线程数
maxProcessors——最大可以创建的处理请求的线程数
enableLookups——如果为 true则可以通过调用 request.getRemoteHost()进行
DNS——查询来得到远程客户端的实际主机名若为 false则不进行 DNS查询而是返回其 ip地址
redirectPort——指定服务器正在处理 http请求时收到了一个 SSL传输请求后重定向的端口号
acceptCount——指定当所有可以使用的处理请求的线程数都被使用时可以放到处理队列中的请求数超过这个数的请求将不予处理
connectionTimeout——指定超时的时间数 (以毫秒为单位 )
Engine
(表示指定 service中的请求处理机接收和处理来自 Connector的请求 )
defaultHost——指定缺省的处理请求的主机名它至少与其中的一个 host元素的 name属性值是一样的
Context
(表示一个 web应用程序通常为 WAR文件关于 WAR的具体信息见 servlet规范 )
docBase—— 应用程序的路径或者是 WAR文件存放的路径
path——表示此 web应用程序的 url的前缀这样请求的 url为http://localhost:8080/path/****
reloadable——这个属性非常重要如果为 true则 tomcat会自动检测应用程序的 /WEB-INF/lib 和 /WEB-INF/classes目录的变化自动装载新的应用程序
我们可以在不重起 tomcat的情况下改变应用程序
host
(表示一个虚拟主机)
name——指定主机名
appBase——应用程序基本目录即存放应用程序的目录
unpackWARs——如果为 true则 tomcat会自动将 WAR文件解压否则不解压直接从 WAR文件中运行应用程序
Logger
(表示日志调试和错误信息)
className——指定 logger使用的类名此类必须实现 org.apache.catalina.Logger 接口
prefix——指定 log文件的前缀
suffix——指定 log文件的后缀
timestamp——如果为 true则 log文件名中要加入时间如下
例 :localhost_log.2007-03-04.txt
Realm
(表示存放用户名密码及role的数据库)
className——指定 Realm使用的类名此类必须实现 org.apache.catalina.Realm接口
Valve
(功能与Logger差不多其prefix和suffix属性解释和Logger 中的一样)
className——指定 Valve使用的类名如用 org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息
directory——指定 log文件存放的位置
pattern——有两个值common方式记录远程主机名或 ip地址用户名日期
第一行请求的字符串HTTP响应代码发送的字节数。 combined方式比 common方式记录的值更多
一个<Server>包含一个或多个<Service>,
一个<Service>包含唯一一 个<Engine>和一个或多个<Connector>,
多个 <Connector>共享一个<Engine>;
一个<Engine>包含多个<Host>,
每个<Host>定义一个虚拟主机,包含一个或多个web应用<Context>;
<Context>元素是代表一个在虚拟主机上运行的Web应用。
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代表一个虚拟主机默认是localhosthost下可以部署多个web
application在我们实际应用中一般要考虑问题的对象就是host。
4:Tomcat主要组件类介绍
4.1 org.apache.catalina.Lifecycle
通用的组件声明周期接口一般Tomcat的组件都要实现这个接口但不是
必须的这个接口是为所有组件提供相同的start和stop。
4.2 org.apache.catalina. LifecycleListener
该接口用于监听一些重要事件包括实现了Lifecycle接口组件产生的startstop事件。
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
容器事件监听器注意的是startstop是正常的生命周期事件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的一些属性。
*2.创建一个已经被创建并且已经被传递的Response。
*3.在调用invokeNext()方法并返回后修改包含Response的HTTP Header信息。
*4.在invokeNext()调用返回后在绑定Response上的输出流上作任何调用。
*@param
request 将被处理的Request
*@param
response 将被创建的Response
*@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
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方法也必须被调用以记录cookiesheaders和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文件。