首先看构造方法:
可看到与StandardEngine如出一辙,具体对象作用我们将等到处理客户端请求处理说明
在上文看到在StandardEngine的start方法里又会调用StandardHost的start方法,因此下面这个将主要说明一下该方法的内容
<一>start方法
所调用的init()方法如下:
这里有做判断是否将该StandardHost实例设置为上一StandardEngine的child数组内,若没有则调用该方法进行处理,并同时添加LifecycleListener,类型为HostConfig,事实上在Catalina解析XML的时候,已经有这两步的Rule相应的设置了,因此其实这里只做一下保险处理.另外还是一些注册对象对象.
调度完init方法后,依然调用了其父类的start方法,即ContainerBase.start(),这个方法在StandardEngine那篇已看过了,其实内容就是调用StandardHost对象上的Lifecycle监听者的各个相应方法以及各子对象的start方法,其中也有child对象组的start方法,该子对象是何类呢?这个需要看StandardContext类的实例化的方法调用相关的Rule设置内容便可知晓,其实对于哪个对象将会是哪个对象的父级或子级对象,可直接看server.xml文件即可,因为这些层级都是依照server.xml里元素的层级关系而来的,这里子对象类为StandardContext类
如StandardEngine一样,在调用super.start时,会触发相应的Lifecycle事件,因此会调用其监听器HostConfig的相应处理方法,方法内容如下:
当事件名为Lifecycle.PERIODIC_EVENT时,将调用check方法,这个事件是在ContainerBase.start()里的threadStart()启动的线程里触发的,但其实check里所做的内容与下边的Lifecycle.START_EVENT所做的事是相似的,我们可看一下START_EVENT对应的start方法的内容
如果该设置启动的时候部署,则会执行deployApps,而默认StandardHost是设置为true的,再看deployApps如下:
1.deployDescriptors
部署xml文件对应的context
这句代码将得到context配置文件的路径
通过查看server.xml可看到Engine.getName()="Catalina",host.getName="localhost",因此这里将返回
${catalina.base}/conf/Catalina/localhost/目录
deployDescriptors(configBase, configBase.list());如下:
取得configBase目录下的xml文件,计算其contextPath(部署后在浏览器上打路径时http://localhost:8080/后面的内容),然后调用deployDescriptor方法,如下:
实例化一个代表每一个部署的context的对象
DeployedApplication deployedApp = new DeployedApplication(contextPath);
对contextXml进行解析,生成一个context实例,为其设置LifecycleListener,将其加到Host的children Map里,这里调用的是ContainerBase.addChild,可看到在加入该MAP外,会调用child的start方法,这里先不进行细讲,下篇再讲StandardContext.start();查看相应context的xml里的docBase是否存在,存在则判断是tomcat外部文件系统的还是在${catalina.base}/webapps下的,判断是war包还是文件夹格式,分别加入deployedApp及deployed,如
deployedApp.redeployResources.put(warDocBase.getAbsolutePath(),new Long(warDocBase.lastModified()));
app.reloadResources.put(resource.getAbsolutePath(),new Long(resource.lastModified()));
deployed.put(contextPath, deployedApp);
2.deployWARs
部署webapps下war包对应的context,为何是webapps目录呢?是在appBase代码中确定的
File appBase = appBase();
deployWARs(appBase, appBase.list());
appBase方法如下:
而host.getAppBase()取的是StandardHost的appBase属性,默认为空,但在实例化StandardHost的时候便为其赋了值,具体什么值是根据server.xml里的<Host>配置的
3.deployDirectories
使用类似的过程部署webapps目录下的工程目录
<二>check方法
通过比对context的被关注的resources来判断是否有做过变更,如果是的话即将该context删除,这里的被关注的resources我们将在Context一文中进行说明
最后又调用deployApps对context重新部署