WEB应用是怎么被部署的

技术WEB应用是怎么被部署的WEB应用是怎么被部署的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一个WEB应用,无论是解压后的目录,还是一

对于许多新手来说,WEB应用程序是如何部署的并不十分清楚。为了帮助大家解决这个问题,下面小编就详细讲解一下。需要的人可以从中学习,希望你能有所收获。

一个WEB应用程序,无论是解压缩的目录还是压缩的WAR文件,都可以部署到应用服务器。

安装的网络应用程序到应用服务器的过程,我们称之为部署.

应用程序部署有多种形式:

静态:即应用程序服务器启动时服务器中存在的应用程序。

动态:也就是说,当应用服务器运行时,它动态地向应用服务器添加应用,以支持应用请求。

通过Tomcat的自动部署特性,可以在Tomcat中实现动态部署。

远程部署也可以通过Tomcat的Manager应用程序来实现。

今天我们先来看看Tomcat的自动部署原理。

整个主机配置中涉及许多类型的部署。

当自动部署时,我们的常规操作是直接将标准WAR应用程序放入

%Tomcat_HOME%/webapps

目录,后台线程会定期扫描,如果有需要部署的应用,会启动部署流程进行应用部署。对于背景线程,感兴趣的朋友可以阅读之前的文章:

Tomcat对过期的会话做了什么?

当后台线程发现我们的应用程序时,它将调用

在主机配置类中

DeployWar方法。

Tomcat支持带有context.xml的应用程序部署,提供xml配置格式等。所以方法中有很多逻辑来判断各种部署情况。

最终,一个Web应用会对应到一个StandardContext对象上,一个Web应用又会被部署到一个虚拟主机上。

核心逻辑是以下几行:

上课?clazz=class . for name(host . getconfigclass());

LifecycleListenerlistener=

(LifecycleListener)clazz . new instance();

context.addLifecycleListener(侦听器);

context . setname(cn . getname());

context . SetPath(cn . GetPath());

context . setwebappversion(cn . getversion());

context . setdocbase(cn . GetBasename()'。战争’);

host.addChild(上下文);设置上下文的属性后,将其添加到虚拟主机上的host.addchild(上下文)中。

在addChild的逻辑中,主要是启动这个应用程序。

//开始

 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启动。可能某天面试时会有人问到,或者涉及到应用组件加载问题时,记的在这里看到过。

在组件等全部启动完毕后,整个应用部署就完成了。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/102824.html

(0)

相关推荐

  • Bytom侧链Vapor源代码分析节点的解块过程是怎样的?

    技术Bytom侧链Vapor源码分析节点出块过程是怎样的Bytom侧链Vapor源码分析节点出块过程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。小

    攻略 2021年12月18日
  • 没有配置环境变量django可以用吗(创建django时如何选择编译器)

    技术启动uwsgi报错提示找不到django的模块怎么办小编给大家分享一下启动uwsgi报错提示找不到django的模块怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获

    攻略 2021年12月18日
  • taskeng.exe是什么进程

    技术taskeng.exe是什么进程这篇文章主要介绍“taskeng.exe是什么进程”,在日常操作中,相信很多人在taskeng.exe是什么进程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

    2021年10月25日
  • 具里面是两横还是三横,具有人说的具是据还是具

    技术具里面是两横还是三横,具有人说的具是据还是具具字的上半部分是『鼎』具里面是两横还是三横,《說文解字》中注:共置也。从廾,从貝省。古以貝爲貨。字的本意是双手捧着鼎器,准备饭食或酒席,有准备、备办的意思。
    『鼎』字的上面

    生活 2021年10月27日
  • 如何通过串口控制树莓派

    技术如何通过串口控制树莓派这篇文章给大家分享的是有关如何通过串口控制树莓派的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。通过串口控制树莓派需求在没有网络,没用键盘,没有显示器的情况下,控制树莓

    攻略 2021年11月20日
  • 深圳前海新区,深圳什么地方经济最发达

    技术深圳前海新区,深圳什么地方经济最发达目前(未算前海)有两个街道算是最发达的 粤海街道约占南山区1/2、全市1/10GDP, 坂田街道约占龙岗区1/2、全市近1/10深圳前海新区, 以上两个街道比上海黄埔区还要小很多,

    生活 2021年10月29日