tomcat解析(十二)StandardHost

首先看构造方法:
      

可看到与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重新部署

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值