欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

WEB應(yīng)用是怎么被部署的

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

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供閩清網(wǎng)站建設(shè)、閩清做網(wǎng)站、閩清網(wǎng)站設(shè)計(jì)、閩清網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、閩清企業(yè)網(wǎng)站模板建站服務(wù),10多年閩清做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一個(gè)WEB應(yīng)用,無論是解壓后的目錄,還是一個(gè)壓縮的WAR文件,都支持部署到應(yīng)用服務(wù)器中。

一個(gè)WEB應(yīng)用安裝到應(yīng)用服務(wù)器的過程,我們稱為部署

部署應(yīng)用的形式又分多種:

  • 靜態(tài)的:即應(yīng)用服務(wù)器啟動時(shí)就存在在Server中的應(yīng)用。

  • 動態(tài)的:即應(yīng)用服務(wù)器運(yùn)行時(shí)動態(tài)的把應(yīng)用添加應(yīng)用服務(wù)器中,支持應(yīng)用的請求。

            動態(tài)部署的實(shí)現(xiàn)在Tomcat中可以通過其自動部署特性來完成。

            也可以通過Tomcat的Manager應(yīng)用來實(shí)現(xiàn)遠(yuǎn)程部署。

我們今天先來看一下Tomcat的自動部署實(shí)現(xiàn)原理。

整個(gè)HostConfig中涉及到多種類型的部署

自動部署的時(shí)候,我們常規(guī)操作是直接把一個(gè)標(biāo)準(zhǔn)WAR應(yīng)用放到

%Tomcat_HOME%/webapps

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

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

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

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);

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

        // 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);
            }
        }

此處,啟動內(nèi)會處理許多事情,像Webapp的ClassLoader設(shè)置是否使用雙親委托,web.xmldefaultweb.xmlmerge,以及解析應(yīng)用中是否包含web-fragement.xml,將多項(xiàng)配置合并后,這項(xiàng)工作是在ContextConfig類內(nèi)完成的。
解析完web.xml后,會生成一個(gè)Webxml對象,需要根據(jù)具體的應(yīng)用配置信息,初始化我們的組件了,例如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);
}

}

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

// 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等組件的啟動了。這些組件的啟動是根據(jù)前一個(gè)組件是否啟動成功,再決定是否繼續(xù)

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

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

根據(jù)Servlet規(guī)范進(jìn)行的容器實(shí)現(xiàn),都是先進(jìn)行l(wèi)istener的啟動,再進(jìn)行filter啟動??赡苣程烀嬖嚂r(shí)會有人問到,或者涉及到應(yīng)用組件加載問題時(shí),記的在這里看到過。

在組件等全部啟動完畢后,整個(gè)應(yīng)用部署就完成了。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

分享名稱:WEB應(yīng)用是怎么被部署的
文章URL:http://aaarwkj.com/article2/isjioc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、網(wǎng)站策劃網(wǎng)站設(shè)計(jì)公司、域名注冊、網(wǎng)站改版、定制網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
日本中文字幕在线一区| 日韩亚洲欧美精品另类| 性生活自制视频网站麻豆| 理论三级麻豆国产在线| 背德人妻中文字幕无修| 国产午夜在线影院一区二区| 欧美成人精品欧美一级乱| 国产亚洲一区激情小说| 精品国产熟女成人av| 午夜视频在线观看免费高清国产| 日韩免费精品一区二区| 欧美香蕉高清视频免费| 日本欧美国产污黄在线观看 | 亚洲欧美一区日韩尤物| 国产在线精品成人欧美| 国产一区二区精品不卡| 日本一区二区三区福利视频| 亚洲性视频日韩性视频| 国产性做爰片免费网站| 亚洲日本欧洲二区精品| 中文字幕成人乱码亚洲| 日本成熟亚洲中文字幕的| 国产成人精品久久久亚洲| 青青草网站在线观看视频| 国产成人短视频在线播放| 黄片免费视频大全在线观看| 日本精品在线不卡视频| 熟女肥臀一区二区三区| 国产精品黄色自拍合集| 国产高清不卡午夜福利| 亚洲精品区免费观看av| 日韩人妻中文字幕专区| 日韩在线视频不卡播放| 欧美日韩在线亚洲二区综二| 亚洲午夜精品日韩乱码| av国产一区二区在线| 亚洲天堂av成人在线观看| 男人天堂av东京热伊人| 韩国午夜福利视频网站| 日韩欧美精品在线不卡| 91国内外精品自在线播放|