Tomcat5启动流程与配置详解 3
4.3org.apache.catalina.Container
容器是用于从客户端取得请求(request)并且处理请求并回复给客户端(response)的对象。容器可以支持(可选)pipeline,以便能在运行时按配置的顺序处理请求。
在Tomcat里面,容器在概念上存在以下几层:
-Engine-请求处理入口点,可以包含多个Host和Context。
-Host-代表一个虚拟主机。
-Context-代表单个ServletContext,可以包含多个Wrappers。
-Wrapper-代表单个Servlet,如果Servlet实现了SingleThreadModel,可以代表单个Servlet的多个实例。
容器为了实现自己的功能经常要绑定一些其他组件,这些组件的功能可能被共享,也可以被单独定制,下面是被使用的组件:
-Loader-ClassLoader,装载JavaClasses。
-Logger-实现了ServletContext的log方法,用于记录日志。
-Manage-管理与容器绑定的session池。
-Realm-用户安全管理。
-Resources-JNDI资源访问4.4org.apache.catalina.ContainerListener
容器事件监听器,注意的是start,stop是正常的生命周期事件(LiftcycleEvent)不是容器事件。4.5org.apache.catalina.Pipeline
Pipleline是Valve的集合,当invoke方法被调用时,它会按指定的顺序调用Valve,它总是要求有一个Valve必须处理传递的request(一般是最后一个)并产生response,否则就把request传递到下一个Valve。
一般一个容器仅绑定一个Pipleline实例,一般说来容器会把处理request的功能封装到一个容器绑定的Valve里(这个Valve应该在Pipleline最后被执行)。为了完成这个功能,Pipleline提供了setBasic()方法以保证Valve被最后执行,而其他Valve按顺序被调用。4.6org.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的一些属性(Changerequestpropertiesthathavealreadybeenusedtodirecttheflowofprocessingcontrolforthisrequest)。
*2.创建一个已经被创建并且已经被传递的Response。
*3.在调用invokeNext()方法并返回后修改包含Response的HTTPHeader信息。
*4.在invokeNext()调用返回后在绑定Response上的输出流上作任何调用。
*@paramrequest将被处理的Request
*@paramresponse将被创建的Response
*@paramcontext被用来调用下一个Valve的ValveContext4.7org.apache.catalina.ValveContext
一个ValveContext是这样一种机制:一个Valve可以触发下一个Valve的调用,而不必知道机制的内在实现。4.8org.apache.catalina.Engine
Engine是一个容器,是Cataline的Servlet的入口点。当发布一个连接到WebServer的Cataline时可能不使用Engine,因为Connectior将使用WebServer的资源决定使用哪个Context处理Request。附属于Engine的子容器根据Engine实现的不同可能是Host或Context(单个ServletContext)。如果使用了Engine,在Cataline的层次中它就是顶层容器,因此setParent()应改抛出IllegalArgumentException异常。4.9org.apache.catalina.Host
Host是一个容器,它代表一个虚拟主机。当发布一个连接到WebServer的Cataline时可能不使用Host,因为Connectior将使用WebServer的资源决定使用哪个Context处理Request。Host所附属的父容器通常是Engine,附属于Host的子容器通常是Context(单个ServletContext)。Host接口里面的方法多数都是关于修改Host属性及设定默认的Context。这里我们不再一一列举。4.10org.apache.catalin.Context
Context是一个容器,它代表一个ServletContext,一个CatalineEngline中的单个的WebApplication。Context所附属的父容器是Host,附属于Context的子容器是Wrapper(代表单个Servlet)。Context接口里面多数是关于WebApplication的设置的方法,我们可以参考Web.xml文件研究里面的方法,里面多数方法都是如何读取Web.xml文件里的资源。4.11org.apache.catalina.Wrapper
Wrapper是一个容器,它代表单个Servlet。Wrapper管理Servlet的生命周期,包括调用init()和destory()方法。Wrapper所附属的父容器是Context,没有附属于Wrapper的子容器,方法addChild()应该抛出IllegalArgumentException异常。Wrapper接口里面的方法都是关于读取Servlet的属性,可以参考Web.xml文件里面关于<servlet>标签的定义。4.12org.apache.catalina.Server
Server是整个Catalina容器的入口点,可以包含多个Service和顶层资源元素。一般说来实现Server接口的类也应该同时实现Lifecycle接口,当start()和stop()方法被调用的时候调用Service相应的方法。
Server负责在指定的端口监听连接,当有连接被接受的时候,Server会分析请求的第一行信息,如果是SHUTDOWN则stop服务。可以参考Server.xml文件关于Server的定义。4.13org.apache.catalina.Service
Service是一个或多个共享同以Container的Connectiors的集合。
JVM可以包含一个或多个Service实例,但它们相互之间是完全独立的,它们仅共享JVM的资源。4.14org.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.aspx
[2]tomcat5.0目录结构,http://blog.csdn.net/cesium/archive/2007/03/01/1518172.aspx
[3]tomcat虚拟主机配置,http://www.blogjava.net/zhip/archive/2006/12/28/90480.html
[4]tomcat做web服务器时,通过地址栏传中文参数时编码编译,