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重新部署

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章