我们知道web应用是用Context实例表示的,而Context是部署到Host实例中的,因此tomcat的部署器是关联的Host实例。Context实例可以用WAR文件部署,也可以把整个web应用的文件夹复制到webapp目录下,而部署器在部署时会扫描webapp目录下的web应用程序,并且还会启动一个监控线程定期扫描webapp目录下的web应用是否发生了更新,如果有更新则重新部署更新的web应用;
一、UML图:
1、部署器的接口是Deployee,其中install方法可以安装一个web应用,findDeployedApp可以查找已经安装到Host中的web应用程序,start方法启动指定的Context,stop方法关闭指定的Context;
2、StandardHost类和StandardHostDeployer类均实现了Deployer接口,StandardHost类的install方法都是委托给StandardHostDeployer类实现的,而StandardHostDeployer的install方法又会调用StandardHost类的addChild方法将Context的name和对象实例保存到Hash表中,代码如下:
3、HostConfig类作为Host实例的监听器,在Host实例启动时会发出一个START_EVENT事件,HostConfig实例在收到START_EVENT事件时会调用start方法,在start方法中会去扫描webapp目录下的应用程序并安装到Host中,然后启动这些Context应用,同时会启动一个线程在后台定时扫描webapp目录下的Context应用是否有发生更新,扫描更新时调用的checkWebXmlLastModified方法检查web应用是否有更新,如果有更新则重新安装并启动Context;
deployApps方法会扫描webapp目录下的web应用并安装启动,threadStart方法会启动一个线程,在线程的run方法中定期扫描webapp目录下web应用是否有更新并重新发布Context应用(默认是间隔15秒扫描一次):
4、deployApps会扫描webapp目录下的xml文件、WAR文件和web应用目录:
安装web应用目录时,会创建StandardContext实例,并设置其Path和DocBase属性,安装WAR文件时也是先将WAR文件解压到webapp目录下,然后用与安装目录同样的方式安装Context应用;
而安装xml文件的方法则web应用可以不在webapp目录下,只需要在xml文件中配置Context元素,并且指定Context元素的DocBase属性,这样在扫描到Context元素时就能创建Context实例并设置其DocBase属性(DocBase属性可以指向其他路径下的web应用),如下:
5、HostConfig类的实例并没有直接的代码去创建,而是通过xml文件配置,Digester对象扫描xml文件时生成HostConfig对象并添加到Host实例的监听器中:
二、部署web应用流程:
1、当StandardHost的start方法被调用时会发出START_EVENT事件,HostConfig作为StandardHost的监听事件也会收到这个事件,然后会调用HostConfig.start方法;
2、HostConfig.start方法中会调用deployApps发布web应用,deployApps会扫描webapp目录下的xml描述文件、WAR文件和web应用目录并分别发布;
3、在发布指定的应用时调用Host.install方法,Host.install又委托给StandardHostDeployer类的实例的install方法;
4、StandardHostDeployer.install方法发布web应用时,如果是xml描述应用,则使用Digester扫描xml,生成Context对象并设置属性;如果是WAR文件或者目录形式的web应用时,会根据web应用路径生成StandardContext实例;然后调用Host.addChild方法将生成的Context实例和Context名称属性添加到一个Hash表中,这样在Host实例中根据名称就能查找到对应的Context实例;