一个入口是Catalina布局Server实例时,如果Host元素存在Context子元素时,那么Context元素将会作为Host容器的子容器加到Host实例中,并在Host启动时,由生命周期管理接口的start()方法启动
此时Context的配置为
<Host name="localhost" appBase="webapps" unparkWARs="true" autoDeploy="true"> <!-- docBase是Web运用根目录的文件路径 path为Web运用根要求地址 --> <Context docBase="myApp" path="myApp" reloadable="true"/></Host>
这种配置须要每次支配新的Web运用或者删除旧运用时,都必须修正一下server.xml文件。
StandardHost启动加载过程为Host添加一个Value实现ErrorReportValue,该类紧张用于在做事器处理非常时输出错误页面。如果没有在web.xml中配置缺点处理页面,Tomcat返回的非常栈页面便是由ErrorReportValue天生的。调用StandardHost父类ContainerBase的startInternal()方法启动虚拟主机,处理步骤为如果配置了集群组件Cluster,则启动如果配置了安全组件Realm,则启动启动子节点(server.xml中创建的StandardContext实例)启动Host持有的Pipeline组件设置HOST状态为STARTING,触发START_EVENT生命周期韶光。HostConfig监听该事宜,扫描Web支配目录,对付支配描述文件、WAR包、目录会自动创建StandardContext实例,添加到Host并启动启动Host层级的后台任务处理:cluster后台任务处理、Realm后台任务处理、Pipeline中Value的后台任务处理HostConfig
另一个入口则是由HostConfig自动扫描支配目录
<!-- 默认的server.xml配置 --><!-- appBase为web运用支配的根本目录,所有须要支配的Web运用都会复制到此目录下,Tomcat通过HostConfig完成该目录下Web运用的自动支配 --><Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
生命周期事宜
HostConfig处理的生命周期事宜包括:STARTEVENT、PERIODICEVENT、STOP_EVENT
START_EVENT事宜在Host启动时触发,完成做事器启动过程中的Web运用支配(只有当Host的deployOnStartup属性为true时,做事器才会在启动过程中支配web运用,默认为true)
该事宜完成了Context描述文件支配、web目录支配、WAR包支配,对应于3种不同的支配办法
Context描述文件支配Tomcat支持通过一个独立的Context描述文件来配置Web运用,该配置文件的存储路径由Host的xmlBase属性指定。默认为$CATALINABASE/conf//,对付Tomcat默认的Host,$CATALINABASE/conf/Catalina/localhost
在该目录下创建文件,为myApp.xml
<Context docBase="test/myApp" path="/myApp" reloadable="false"> <WatchdResource>WEB-INF/web.xml</WatchdResource></Context>
将myApp的web运用复制到test目录下,Tomcat启动时便会自动支配该Web运用
web目录支配以目录的形式发布并支配到Web运用是Tomcat中最常见的支配办法,只需将包含Web运用所有资源文件、jar包、描述文件的目录复制到Host指定的appBase目录下即可完成支配
根据web运用中的配置文件来实例化Context(默认为META-INF目录下的context.xml),但是无法覆盖name、path、webappVersion、docBase这四个属性,这些由Web目录的路径及名称确定
WAR包支配与web目录支配类似
PERIODIC_EVENT事宜用于定时扫描Web运用的变更,并进行重新加载
StandardContext包含了详细的Web运用初始化及启动事情,该部分事情由组件Context完成
StandardContext的启动过程
发布正在启动的JMX关照,可以通过NotifycationListener来监听Web运用启动启动当前Context掩护的JNDI资源初始化当前Context利用的WebResourceRoot并启动pre资源:在context.xml中通过配置的资源Main资源:web运用目录、WAR包或者WAE包解压目录包含的文件,这些资源的查找顺序为WEB-INF/classes、WEB-INF/libJar资源:配置的资源Post资源:配置的资源创建web运用类加载器WebappLoader如果没有设置Cookie处理器,则创建默认的Rfc6265CokkieProcessor设置字符集映射CharsetMapper,该映射紧张用于根据Locale获取字符集编码初始化临时目录,默认为$CATALINA_BASE/work///web运用的依赖检测,紧张检测依赖扩展点完全性如果当前Context利用JNDI,则添加NamingContextListener启动web运用类加载器WebappLoader.start启动安全组件Realm发布CONFIGURESTARTEVENT事宜,ContextConfig监听该事宜以完成Servlet的创建启动Context子节点Wrapper启动Context掩护的Pipeline创建会话管理器将Context的web资源凑集添加到ServletContext属性,属性名为org.apache.catalina.resources创建实例管理器InstanceManager,用于创建工具实例,如Servlet、Filter等将Jar包扫描器JarScanner添加到ServletContext属性合并ServletContext初始化参数和Context组件中的ApplicationParameter。启动添加到当前Context的ServletContainerInitializer实例化运用监听器ApplicationListener,分为事宜监听器(ServletContextAttributeListener、ServletRequestAttributeListener、ServletRequestListener、HttpSessionIdListener、HttpSessionAttributeListener)以及生命周期监听器(HttpSessionListener、ServletContextListener)检测未覆盖的HTTP方法的安全约束启动会话管理器实例化FilterConfig、Filter,并调用Filter.init初始化对付loadOnStartUp>=0的Wrapper,调用Wrapper.load(),该方法卖力实例化Servlet,并调用Servlet.init进行初始化启动后台定时处理线程发布正在运行的JMX关照调用WebResourceRoot.gc()开释资源设置Context的状态,如果启动成功,设置为STARTING,否则设为FAILEDContextConfigContext创建时会默认添加一个生命周期监听器--ContextConfig,一共处理6类事宜,与Context启动有关系的3类:AFTERINITEVENT、BEFORESTARTEVENT、CONFIGURESTRATEVENT
AFTERINITEVENT事宜属于Context初始化阶段,紧张用于Context属性的配置事情
Context的创建分为三种办法
在实例化Server时,解析server.xml文件中的Context元素创建在HostConfig支配web运用时,解析web运用根目录下的META-INF/context.xml文件创建。如果不存在该文件,则自动创建一个Context工具,仅设置path、docBase等少数几个属性在Host支配web运用时,解析$CATALINA_BASE/conf//下的Context支配配置文件创建该事宜卖力将tomcat供应的默认配置也一并添加到Context实例
如果Context的override属性为false(表示利用的默认配置)如果存在conf/context.xml文件,那么解析该文件,更新当前Context实例属性如果存在conf///context.xml.default文件(Host级默认配置),那么解析该文件,更新当前Context实例属性如果Context的configFile属性不为空,那么解析该文件,更新当前Context实例属性Tomcat中Context属性优先级是 configFile ->conf///context.xml.default ->conf/context.xml
BEFORESTARTEVENT事宜该事宜在Context启动之前触发用于更新Context的docBase属性和解决web目录锁的问题
更新Context的docBase属性紧张是为了知足WAR支配的情形,当Web运用为一个WAR压缩包且须要解压支配时,docBase属性指向的是解压后的文件夹目录,而非WAR包的路径
处理过程(ContextConfig.fixDocBase)
根据Host的appBase以及Context的docBase打算docBase的绝对路径如果docBase为一个WAR文件,则须要解压支配如果docBase为一个有效目录,而且存在与该目录同名的WAR包,则解压支配,覆盖之前的文件如果docBase为一个不存在的目录,但是存在与该目录同名的WAR包,则解压支配CONFIGURESTARTEVENT事宜Context在启动子节点之前,触发CONFIGURESTARTEVENT事宜,解析web.xml,创建Wrapper(Servlet)、Filter、ServletContextListener等一系列Web容器干系的工具,完成Web容器的初始化
该事宜事情内容
根据配置创建Wrapper(Servlet)、Filter、ServletContextListener等,完成web容器的初始化如果StandardContext的ignoreAnnotations为false,则解析运用程序表明配置,添加干系JNDI资源引用基于解析完成的web容器,检测web运用支配描述文件中利用的安全角色名称,当创造利用了未定义的角色时,提示警告同时将未定义的角色添加到Context安全角色列表中当Context须要进行安全认证但是没有指定详细的Authenticator时,根据做事器配置自动创建默认实例web容器初始化解析默认配置,天生WebXml工具解析Web运用的web.xml文件扫描web运用所有的JAR包,如果包含META-INF/web-fragment.xml,则解析文件并创建WebXml工具(部分片段)将web-fragment.xml创建的WebXml工具按照Servlet规范进行排序,同时将排序结果对应的JAR文件名列表设置到ServletContext属性中,javax.servlet.context.orderedLibs查找ServletContainerInitializer实现,并创建实例,查找范围分为两部分web运用下的包:如果javax.servlet.context.orderedLibs不为空,仅搜索该属性中包含的包,否则搜索WEB-INF/lib下的所有原谅器包:搜索所有的包根据ServletContainerInitializer查询结果以及javax.servlet.annotation.HandlersTypes表明配置,初始化typeInitializerMap和initializerClassMap两个映射当主Web.xml的metadataComplete为false或者typeInitializerMap不为空时,处理表明当主Web.xml的metadataComplete为false,将所有的片段WebXml按照顺序排序合并至主WebXml将默认WebXml合并至主WebXml配置JspServlet利用主WebXml配置当前StandardContext将合并后的WebXml保存到ServletContext属性中查找JAR包META-INF/resources/下的静态资源,并添加到StandardContext将ServletContainerInitializer扫描结果添加到StandardContext,以便StandardContext启动时利用运用程序表明配置当StandardContext的ignoreAnnotations为false时,Tomcat支持读取如下接口的Java命名做事表明配置,添加干系的JNDI资源引用,以便在实例化干系接口时,进行JNDI资源依赖注入
支持读取的接口
web运用程序监听器javax.servlet.ServletContextAttributeListenerjavax.servlet.ServletRequestListenerjavax.servlet.ServletRequestAttributeListenerjavax.servlet.http.HttpSessionAttributeListenerjavax.servlet.http.HttpSessionListenerjavax.servlet.ServletContextListenerjavax.servlet.Filterjavax.servlet.Servlet支持读取的表明包括类表明、属性表明、方法表明
类:javax.annotation.Resource、javax.annotation.Resources属性和方法:javax.annotation.ResourceStandardWrapperStandardWrapper详细掩护了Servlet实例,StandardWrapper的处理分为两部分
当通过ContextConfig完成web容器初始化后,先调用StandardWrapper.start,此时StarndardWrapper组件状态将变为STARTED对付启动时加载的Servlet,调用StandardWrapper.load,完成Servlet的加载创建Servlet实例,如果添加了JNDI资源表明,将进行资源注入读取javax.servlet.annotation.MultipartConfig表明配置,以用于multipart/form-data要求处理,包括临时文件存储路径、上传文件最大字节数、要求最大字节数、文件大小阈值读取javax.servlet.annotation.ServletSecurity()表明配置,添加Servlet安全调用javax.servlet.Servlet.init()方法进行Servlet初始化Context的命名规则Context的name、path、version与文件名称干系
当未指定version时,name与path相同,如果path为空字符,根本文件名称为ROOT;否则,将path起始的/删除,别的/更换为#的根本文件
path为/foo/bar name为/foo/path 根本文件名称为foo#bar
如果指定了version,则path不变,name和根本文件名称将追加##和详细版本号
path为/foo/bar version为2 name为/foo/bar##2 根本文件名称为foo#bar##2