回顾
这章将讨论主机和引擎。如果你想在相同的Tomcat部署中运行不止一个context,就使用一个host。理论上,如果你真有一个context,就不需要一个主机,就如Context接口中描述的那样:
依附在一个Context上的父类容器一般是一个主机,但是了如果没有必要就可能是其他的实现或者可能被省略。
在实际中,一个Tomcat 部署总是需要一个主机。这将在后面的章节中解释。
一个引擎代表了全部Catalinaservlet引擎。如果使用,一个引擎总是最高层的容器。需要添加到引擎中的子容器一般是Host或者Context。一个引擎默认的被用于Tocmat部署中。在这个部署中,引擎有一个主机,默认的主机。
这章讨论了与主机和引擎接口相关的类。以Host接口开始,后面是StandardHost,StandardHostMapper(Tomcat 4中)和StandardHostValue类。下一步,使用一个应用来演示作为一个顶层容器的host的使用。接下来讨论Engine接口,StandardEngine和StandarEngineValue类。之后一个应用显示了engine作为顶层容器的使用案例。
The Host interface
Host接口实现了Container接口
Map方法返回正确的context来处理到来的请求。这个方法在StandardHost中实现。
StandardHost
此类实现了Host接口。这个类继承了ContainerBase类并实现了Host和Deployer接口。
如同StandardContext和StandardWrapper一样,StandardHost的构造器添加一个基本值给它的管道。
就如所见,基本值是一个StandardHostValue的实例。
当启动的时候,即其start方法调用时,StandardHost添加了两个值:ErrorReportValue和ErrorDispatcherValue。
注意在tomcat 5 中,start方法相似,除了构建了JMX对象名,将在第20章中讨论。
errorReportValueClass类的值在StandardHost中由以下决定:
对于每个到来的请求,调用host的invoke方法。由于StandardHost没有自己的invoke方法的实现,则调用其父类ContainerBase中invoke方法。Invoke方法反过来调用StandardHostValue(StandardHost的基本值)的invoke方法。StandardHostValue类的invoke方法调用StandardHost类的map方法获取正确的context处理请求。Map方法的代码如下:
注意Tomcat 4中的ContainerBase类也定义了map方法,签名如下:
在Tomcat 4中StandardHostValue的invoke方法调用了ContainerBase的map方法,反过来调用StandardHost的map方法。Tomcat 5不适用一个mapper组件并且正确地context从请求对象中获取。