`

Tomcat Context组件

阅读更多
Tomcat Context组件
Context代表一个Web应用,它运行在某个指定的虚拟主机(Host)上;每个Web应用都是一个WAR文件,或是一个包含WAR解压后的文件的目录;

Connector组件接收到http请求后,通过将请求URI的最长可能前缀与每个Context的path进行匹配,然后选择相应的Web应用来处理这个http请求。
之后,Context会根据web application deployment descriptor文件中定义的servlet映射,会选择一个正确的Servlet来处理请求。
Servlet映射必须定义在该Web应用目录层次结构中的/WEB-INF/web.xml中。

一、几个重要的概念
1、context frgament file
Context片断文件,即描述Context配置的xml文件;它有三个层级:
a) Engine Scoped:适用于Engine下的所有Web应用程序,位于$CATALINA_BASE/conf/context.xml;
b) Host Scoped:适用于指定的Host组件下的应用程序,位于$CATALINA_BASE/[Engine]/[Host]/context.xml.default;
c) Web Application Scoped:代表一个独立的应用程序,它可以位于$CATALINA_BASE/[Engine]/[Host]/[ContextPath].xml或应用程序中的META-INF/context.xml;

对于应用程序中内嵌的context.xml文件,有两个局限性:
1) 当server.xml文件中的Host节点指定deployXML属性为false时,则会忽略Web应用程序内嵌的context.xml;
2) 内嵌的context.xml不能指定context path;
2、appBase、docBase&context path
a) appBase:Host组件中需要部署的应用的目录,如webapps;也可以指定绝对路径,将Web应用程序放在tomcat之外;
b) docBase:应用程序资源所有的路径;应用程序的资源包括HTML、CSS、JS、jar、class文件等,其中静态资源直接放在该docBase或其子目录下,jar文件放在WEB-INF/lib目录下,class文件则放在WEB-INF/classes目录下;
c) context path:唯一代表一个应用;

二、如何配置Context?
配置context有多种方式,如下:
1、将应用文件夹或war文件直接copy到tomcat的webapps目录下,这样tomcat启动的时候会将webapps目录下的文件夹或war文件的内容当成应用部署。这种方式最简单且无须书写任何配置文件。
2、在tomcat的server.xml配置文件中的Host节点下增加Context子节点,如:

1
<Context path="/test" docBase="D:\private\tomcat\test.war" />
其中,path即context path;docBase指向应用所在的文件夹或war文件,可以是绝对路径,也可以是相对路径(相对该Context所在的Host的appBase属性值);
3、在tomcat的conf/[Engine]/[Host]目录下新建xml文件,文件名为context path,内容如下:

1
2
3
4
5
6
<Context docBase="D:\private\tomcat\test.war"
privileged="true" antiResourceLocking="false" antiJARLocking="false">
<!-- Link to the user database we will get roles from -->
<ResourceLink name="users" global="UserDatabase"
type="org.apache.catalina.UserDatabase"/>
</Context>
其中,docBase与第二种方式中的含义一样;

当Host的autoDeploy属性值为true时,以上三种配置Context的方式中,只有第1、3两种方式配置署的应用不需要重启tomcat即可完成部署;第二种方式需要重启tomcat;另外,第1种方式不能指定特定的context path;

三、启动Context
在《Tomcat Host组件》这篇文档中提到,应用的部署是由HostConfig完成的;Host组件在初始化过程中会扫描三种不同类型的应用:context.xml描述文件、war包、文件夹;对于直接通过修改server.xml文件来配置的应用(上一节中的第2种场景),则是在启动tomcat解析server.xml文件时根据Context子节点来构造相应的应用;

不管是哪种方式配置Context(context.xml描述文件、war包、文件夹、配置server.xml的Context节点),最终都是构造出一个StandardContext实例,并将其作为子容器添加到Host组件中;与Host组件类似,在构造StandardContext实例时,会为每个StandardContext对象构造一个ContextConfig实例,该ContextConfig实例实现了LifecycleListener接口,它会监听StandardContext实例的各个生命周期事件,并针对不同的事件做出不同的响应;

当StandardContext实例以子容器被添加到Host组件中时,会触发StandardContext实例的start()方法,至此Context工作由此展开:
1、Context初始化和启动
Context初始化时,主要会触发init事件,并通过ContextConfig来完成初始化工作;
Context启动时主要完成如下事情:
a) 触发before_start事件来处理文件锁的问题(见下一小节before_start事件);
b) 根据docBase是war包还是文件夹,初始化应用程序资源的访问对象;
c) 初始化context特定的classloader:WebappLoader;
d) 计算work directory并初始化ServletContext:tomcat会为每个Context生成一个work directory,位于$CATALINA_BASE/work/[Engine]/[Host]目录下,work directory目录名根据context path而来(将“/”转换为“_”);work directory目录用于存放由jsp生成的servlet的class文件;
e) 启动内嵌组件,如Loader等;
f) 触发start事件来解析web应用描述符文件:如Servlet配置、Filter配置、Listener配置、session-timeout、welcome-file以及servlet参数等;
g) 启动Listerer;
h) 根据backgroundProcessorDelay决定是否需要开启后台线程:该后台线程可以用于管理session超时、监听类的变化来决定是否需要重启Context;当Context的reloadable属性为true时,如果应用程序的资源发生变化时,会通过backgroundProcess()来完成应用的重启;
i) 根据Servlet配置的loadOnStartup参数及大小顺序决定是否需要初始化Servlet及其初始化顺序;
2、ContextConfig事件处理
a) init事件
ContextConfig在处理init事件时,主要工作是:
1) 实例化了两个Digester类,分别为webDigester和contextDigester;webDigester用于解析web.xml配置文件,contextDigester用于解析前面提到的三个层级的context fragment file;在解析context fragment file时,主要的工作是解析内嵌元素,如Listener, Loader, Manager, Parameter, Resources, Valve以及WatchedResource,并将它们设置到该Context对应的属性上;;
2) 调整docBase属性值(即应用程序资源所在的位置):

在配置Context时如果没有指定docBase,则根据context path计算得出(“/”会替换成“#”,空会替换成ROOT),并转化为绝对路径;
根据Host中配置的unpackWARs属性,决定是否将配置在tomcat之外的war包解压到appBase下,并以context path为目录名(“/”会替换成“#”);此时docBase指向解压后的文件夹;如果的unpackWARs为false,则不会自动解压,此时docBase不变;
用流程图来表述如下:

b) before_start事件
在该过程中,主要是针对反文件锁做了一定的处理;在windows下,当ClassLoader加载类时,会打开相应的jar包,此时该jar包会被锁定,是不能被删除的;在tomcat中,当Context的antiResourceLocking设置为true时,如果删掉应用程序的war包时,对应的文件夹也会被删除,这是怎么做到的呢?
很简单,把应用程序的资源拷贝到一个临时的目录,然后将docBase指向该临时目录,这样锁定的都是副本;
c) start事件
当start事件发生时,ContextConfig会针对该Context完成如下工作:
1) 解析应用程序描述符:
a) $CATALINA_BASE/conf/web.xml:作用于所有的Web应用程序;
b) $CATALINA_BASE/conf/[Engine]/[Host]]/web.xml.default:作用于指定Host下的所有Web应用程序;
c) WEB-INF/web.xml:仅作用于当前Web应用程序;
2) 新版本中增加了对Listener、Filter、Servlet注解的支持;
3) 对web.xml里设置的一些roles进行一些简单的校验,,然后全部放到context持有的字符串数组securityRoles中;(这块没有仔细研究过,熟悉的同学可以解释一下);
4) 根据web.xml里配置的login-config等权限安全访问来确定是否为本context配置一个用于确定访问权限的Valve;如果需要,则通过addValve添加到pipeline中;
d) destroy事件
在Context需要reload时,会触发destory事件,此时则会将该Context的work directory目录删除;
e) stop事件
此时会清除所有与Context相关的配置,如子容器、从web.xml读取的配置信息(如Listener、Filter、Servlet等);

四、Context对请求的处理
Context在初始化时,会创建StandardContextValve的实例并加入pipeline中;Host组件在接收到请求后,会调用以下方法将请求转交给Context来处理:

1
context.getPipeline().getFirst().invoke(request, response);
也就是会调用StandardContextValve的invoke方法,其具体流程如下:
1、先检查所请求的资源是否是保护资源,如果是,则直接返回客户端“资源不存在”(404);
2、如果应用在reload,则sleep 1s;此处是通过忙等待实现;同时用新的WebappLoader替换当前的ClassLoader;
3、如果找不到该请求对应的Wrapper(Servlet),则同样返回404;
4、触发ServletRequestListener的requestInitialized()方法;
5、将请求交由wrapper进行处理;

1
wrapper.getPipeline().getFirst().invoke(request, response);
6、wrapper处理完后,再触发发ServletRequestListener的requestDestroyed()方法;
分享到:
评论

相关推荐

    Tomcat-Host-Context配置

    描述了Tomcat的Host的Context组件的相关配置及对应Tomcat的启动和访问问题

    Tomcat 结构概述

    Tomcat 服务器的整体架构是由一系列可配置的组件构成的,其核心组件是 Catalina Servlet 容器,它是所有其他 Tomcat 组件的顶层容器。Tomcat 的组件可以在(conf/server.xml 文件中进行配置,每个 Tomcat 组件在 ...

    tomcat 安装 详细安装java tomcat组件

    在`&lt;Context&gt;`标签内添加`reloadable="true"`,这将使Tomcat在重启时自动重新加载应用,方便开发。修改后的代码如下: ```xml &lt;Context reloadable="true"&gt; ``` - **tomcat-users.xml**:再找到`tomcat-users....

    tomcat engine,host,context的管道处理——pipeline

    在Tomcat的架构中,Engine、Host和Context是核心组件,它们共同构成了一个灵活且可扩展的服务模型。本文将深入探讨这些组件以及与之相关的Pipeline概念。 首先,我们来看“Engine”(引擎)。Engine是Tomcat容器的...

    tomcat(可用于部署redis集群)

    描述中提到"该tomcat已经集成好各个jar,只需要解压后即可运行",这意味着Tomcat服务器包含了运行Redis集群所需的全部依赖库,可能包括Jedis(一个Java客户端用于操作Redis)或其他相关的连接池组件。通常,部署...

    tomcat工作原理-组件

    **Tomcat工作原理详解——组件解析** Tomcat作为Apache软件基金会的开源项目,是Java Servlet、JavaServer Pages(JSP)和Java Expression Language(EL)的实现,是Web应用程序服务器的首选之一。深入理解Tomcat的...

    how tomcat works (tomcat是怎么工作的 英文版)

    Context组件实际上是一个Web应用,它负责处理请求,并最终将请求传给具体的Servlet进行处理。 另外,本书还会介绍Tomcat的配置文件,如server.xml、web.xml等,这些文件在运行Tomcat时发挥重要作用。server.xml是...

    tomcat服务器8.0 apache-tomcat-8.0.9.zip

    4. **Context组件**:Context组件是Tomcat用来管理Web应用程序的单元。每个Context对应一个Web应用,负责加载该应用的配置、Servlet和JSP文件。 5. **生命周期管理**:Tomcat通过一系列的生命周期阶段来管理和启动...

    tomcat组件启动时序图.vsdx

    对于tomcat的启动流程分析,从主流程Bootstrap -&gt; Catalina -&gt; Server -&gt; service -&gt; engine,connector;和分流程1.engine-&gt;host-&gt;context-&gt;wrapper ;2.connector -&gt; ProtocolHandler-&gt;Endpoint;之中的方法调用进行...

    Tomcat 接口文档 API

    2. **Context**: 在Tomcat中,Context代表一个Web应用程序,对应于WAR文件或WEB-INF目录。每个Context都有自己的配置,包括Servlet、Filter、Listener等。开发者可以通过ContextConfigListener来监听Web应用的初始化...

    Tomcat Tomcat Tomcat Tomcat

    6. **配置文件**:Tomcat的配置主要通过几个核心配置文件完成,如server.xml、context.xml、web.xml等。这些文件定义了服务器的行为、端口设置、应用上下文以及其他的服务器配置。 7. **安全管理**:Tomcat支持基本...

    tomcat 架构 分析

    了解Tomcat的架构,从Connector和Container这两个核心组件开始,理解它们的协同工作方式,以及Tomcat如何通过模块化的设计来管理服务组件的生命周期,对于深入使用和定制Tomcat是非常重要的。同时,观察和学习Tomcat...

    Tomcat 9.0_Tomcat91.rar

    4. Context组件:代表Web应用,处理特定的URL路径。 5. Lifecycle组件:控制Tomcat各个组件的生命周期,确保正确启动和关闭。 四、Tomcat性能优化 1. 线程池配置:合理设置最大线程数、最小线程数和线程空闲时间,...

    tomcat及其配置文件

    Tomcat的核心配置文件之一是`server.xml`,这个文件位于Tomcat的`conf`目录下,它是Tomcat服务器的全局配置文件,定义了服务器的端口号、数据源、连接器、虚拟主机、Context等关键组件的设置。例如,你可以在这里...

    tomcat7源码下载

    3. common:这个模块包含了Tomcat中可被所有其他模块共享的组件和服务,如Logging、Naming和JMX支持。 4. jasper:Jasper是Tomcat的JSP编译器,负责将JSP页面转换为Servlet Java代码。 5. shared:共享库,提供...

    tomcat6的源码

    3. **生命周期管理**:每个Tomcat组件都有自己的生命周期,包括初始化、启动、停止和销毁。源码中,这些生命周期方法的实现有助于理解Tomcat的内部工作流程。 4. **部署与加载**:Tomcat可以自动或手动部署Web应用...

    how tomcat work 中文版

    下面将深入讲解这些组件以及Tomcat的工作流程。 **Catalina(Servlet容器):** Catalina是Tomcat的核心,负责管理和执行Servlet。Servlet是一种Java类,用于扩展服务器的功能。当客户端(如浏览器)发送请求到...

    tomcat-redis-session-manager的jar包-包含Tomcat7和Tomcat8

    在配置Tomcat-Redis-Session-Manager时,开发者需要在Tomcat的`context.xml`文件中添加相关的manager配置,指定使用Redis作为session存储。这通常涉及设置`Manager`元素的`className`属性为`org.apache.catalina....

    Tomcat:apache-tomcat-6.0.18

    3. **Connector组件**:Tomcat通过Connector组件与外部世界进行通信。这些组件负责接收和处理HTTP请求,并将结果返回给客户端。 4. **Context容器**:每个Web应用程序都在一个独立的Context容器中运行,管理应用程序...

Global site tag (gtag.js) - Google Analytics