0%

tomcat之Container容器

tomcat之Container容器

之前分析tomcat的组件时说过,Container 用于封装Servlet,以及具体处理request请求,Container是一个接口,针对不同级别的容器分为四个子接口:Engine、Host、Context、Wrapper

四个子容器的装配关系如下:

Engine是最顶层的容器,每个Service最多只能有一个Engine,Engine中可以有多个Host,每个Host下可以有多个Context,每个Context下可以有多个Wrapper

容器装配关系
  • Engine 表示整个Servlet引擎,用来管理多个站点。在tomcat中,Engine为最高级别的容器对象,Engine不是直接处理请求的容器,是获得目标容器的入口,一个Service中最多只有一个Engine
  • Host 表示Servlet引擎(即Engine)中的虚拟机(即一个站点),与一个服务器的网络名有关,如域名等。客户端可以使用这个网络名连接服务器,这个名称必须要在DNS服务器上注册
  • Context 表示ServletContext即一个应用程序,在Servlet规范中,一个ServletContext即表示一个独立的Web应用,直接管理Servlet在容器中的包装类Wrapper
  • Wrapper 表示Web应用中定义的Servlet
catalina

配置

来通过配置理解一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义一个Server,8005端口监听SHUTDOWN关闭命令 -->
<Server port="8005" shutdown="SHUTDOWN">

<!-- 定义了一个名为Catalina的Service -->
<Service name="Catalina">

<!-- Service中定义了一个Connector,使用HTTP协议 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" relaxedPathChars="|{}[],%"
relaxedQueryChars="|{}[],%"/>

<!-- Service中定义了一个名为Catalina的Engine,默认的虚拟主机为localhost,如果接收到请求的域名在所有的Host的name和Alias中都找到不到时使用默认的Host -->
<Engine name="Catalina" defaultHost="localhost">

<!--Engine中定义了一个Host,name表示域名,appBase指定站点的位置,unpackWARs表示是否自动解压war文件 ,autoDeploy表示是否自动部署,如果为true,在运行过程中如果在webapps目录下新增应用将会自动部署并启动 -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">

</Host>
</Engine>
</Service>
</Server>

看到上述的Server.xml发现只是配置到站点了,没有应用Context的配置,那么Context如何配置呢

Context配置

Context有三种配置方式

  • 通过文件进行配置,前三种配置是应用单独的配置,后两个是Context共享的配置
    • conf/server.xml文件中使用Context标签进行配置
    • conf/{EngineName}/{HostName}目录下以应用名称名称的xml文件
    • 应用自己的/META-INF/context.xml
    • conf/context.xml,整个Tomcat共享
    • conf/{EngineName}/{HostName}/context.xml.default,整个站点共享
  • 将war包直接放在Host目录下,Tomcat会自动查找并添加到Host中
  • 将应用的文件夹放到Host目录下,Tomcat会自动查找并添加到Host中

Wrapper配置

Wrapper的配置就是应用中的web.xml中配置的Servlet,每个Servlet对应一个Wrapper