亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

WEB應用是怎么被部署的

發布時間:2021-11-18 17:12:40 來源:億速云 閱讀:218 作者:柒染 欄目:大數據

WEB應用是怎么被部署的,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一個WEB應用,無論是解壓后的目錄,還是一個壓縮的WAR文件,都支持部署到應用服務器中。

一個WEB應用安裝到應用服務器的過程,我們稱為部署

部署應用的形式又分多種:

  • 靜態的:即應用服務器啟動時就存在在Server中的應用。

  • 動態的:即應用服務器運行時動態的把應用添加應用服務器中,支持應用的請求。

            動態部署的實現在Tomcat中可以通過其自動部署特性來完成。

            也可以通過Tomcat的Manager應用來實現遠程部署。

我們今天先來看一下Tomcat的自動部署實現原理。

整個HostConfig中涉及到多種類型的部署

自動部署的時候,我們常規操作是直接把一個標準WAR應用放到

%Tomcat_HOME%/webapps

目錄下,而后臺線程會定時掃描,發現有需要部署的應用,就會啟動部署流程進行應用部署。對于后臺線程,感興趣的朋友可以看前面的文章: 對于過期的session,Tomcat做了什么?
后臺線程發現了我們的應用后,會調用到 HostConfig類中的 deployWar方法。

由于Tomcat支持以context.xml這種提供xml配置格式的應用部署等,所以方法內有大量判斷各類部署情況的邏輯。

最終,一個Web應用會對應到一個StandardContext對象上,一個Web應用又會被部署到一個虛擬主機上。
最核心的邏輯是下面這幾行:

Class<?> clazz = Class.forName(host.getConfigClass());
            LifecycleListener listener =
                (LifecycleListener) clazz.newInstance();
            context.addLifecycleListener(listener);

            context.setName(cn.getName());
            context.setPath(cn.getPath());
            context.setWebappVersion(cn.getVersion());
            context.setDocBase(cn.getBaseName() + ".war");
            host.addChild(context);

在設置完Context的屬性后,將其添加到虛擬主機上? host.addChild(context)
在·addChild·的邏輯中,主要是把這個應用啟動起來

        // Start child
        if ((getState().isAvailable() ||
                LifecycleState.STARTING_PREP.equals(getState())) &&
                startChildren) {
            try {
                child.start();
            } catch (LifecycleException e) {
                log.error("ContainerBase.addChild: start: ", e);
                throw new IllegalStateException
                    ("ContainerBase.addChild: start: " + e);
            }
        }

此處,啟動內會處理許多事情,像Webapp的ClassLoader設置是否使用雙親委托,web.xmldefault web.xmlmerge,以及解析應用中是否包含web-fragement.xml,將多項配置合并后,這項工作是在ContextConfig類內完成的。
解析完web.xml后,會生成一個Webxml對象,需要根據具體的應用配置信息,初始化我們的組件了,例如Filter,Listener等,
例如下面的邏輯

private void configureContext(WebXml webxml) {
        for (FilterDef filter : webxml.getFilters().values()) {
            if (filter.getAsyncSupported() == null) {
                filter.setAsyncSupported("false");
            }
            context.addFilterDef(filter);
        }
        for (FilterMap filterMap : webxml.getFilterMappings()) {
            context.addFilterMap(filterMap);
        }
        context.setJspConfigDescriptor(webxml.getJspConfigDescriptor());
        for (String listener : webxml.getListeners()) {
            context.addApplicationListener(listener);
        }
for (ServletDef servlet : webxml.getServlets().values()) {
            Wrapper wrapper = context.createWrapper();

    wrapper.setOverridable(servlet.isOverridable());
   context.addChild(wrapper);
}

}

整個解析出的Servlet組件,又會被做為Context的子組件添加到應用中。
在解析完Servlet等組件后,會再根據配置設置Session的超時時間,SessionCookie的名稱等。對這一部分,可以看前面的文章:深入Tomcat源碼分析Session到底是個啥!
一切都OK后,設置應用的配置狀態

// Make our application available if no problems were encountered
        if (ok) {
            context.setConfigured(true);
        } else {
            log.error(sm.getString("contextConfig.unavailable"));
            context.setConfigured(false);
        }

再然后,就是對于filterlistener等組件的啟動了。這些組件的啟動是根據前一個組件是否啟動成功,再決定是否繼續

if (!getConfigured()) {
                log.error( "Error getConfigured");
                ok = false;
            }

            // Configure and call application event listeners
            if (ok) {
                if (!listenerStart()) {
                    log.error( "Error listenerStart");
                    ok = false;
                }

根據Servlet規范進行的容器實現,都是先進行listener的啟動,再進行filter啟動。可能某天面試時會有人問到,或者涉及到應用組件加載問題時,記的在這里看到過。

在組件等全部啟動完畢后,整個應用部署就完成了。

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

web
AI

思茅市| 芦山县| 买车| 都匀市| 裕民县| 察哈| 和田县| 揭西县| 昌乐县| 汶川县| 罗田县| 新竹市| 镇平县| 子洲县| 玉山县| 白河县| 奉贤区| 扶沟县| 南江县| 泸西县| 乃东县| 昂仁县| 常德市| 韶关市| 广安市| 广州市| 昌图县| 正镶白旗| 盘锦市| 扎兰屯市| 隆德县| 策勒县| 洪江市| 新巴尔虎左旗| 建德市| 盐山县| 呼图壁县| 宾阳县| 比如县| 江源县| 江陵县|