一、从范例开始
在开始分析之前,我们先使用Tomcat组件来组装一个完整的WebContainer。
1)准备好目录结构
准备好如下目录结构
BaseDir(C:/tomcattest/)
--conf
--webapps
--conf
--webapps
- 从{tomcat目录}/conf目录下的拷贝web.xml到如上的conf目录(可选,支持JSP和welcome file)
- 拷贝tomcat的examle应用到如上的webapps目录作为范例
2)范例(注意如下的代码说明部分)
package ray.tomcat.test;
import org.apache.catalina.connector.Connector;
import org.apache.catalina.core.StandardEngine;
import org.apache.catalina.core.StandardHost;
import org.apache.catalina.core.StandardService;
import org.apache.catalina.startup.HostConfig;
public class TomcatMainV5
{
public static void main(String[] args) throws Exception
{
// 设置基目录,使用这种方式貌似不够幽雅
System.setProperty("catalina.base", "C:/tomcattest/");
// Connector
Connector connector = new Connector("HTTP/1.1");
connector.setPort(8080);
// 请求处理器(Engine+Host)
// Host
StandardHost standardHost = new StandardHost();
standardHost.setName("localhost");
standardHost.setAppBase("webapps");
// HostConfig负责解析Context配置,并将Context加入到Host中,
standardHost.addLifecycleListener(new HostConfig());
// Engine
StandardEngine standardEngine = new StandardEngine();
standardEngine.setName("Catalina");
//此处可以看到Host是Engine的Child
standardEngine.addChild(standardHost);
standardEngine.setDefaultHost("localhost");
// Connector+请求处理器 组装成webserver
StandardService standardService = new StandardService();
standardService.setName("Catalina");
//设置接收请求Connector,可支持多个Connector
standardService.addConnector(connector);
//设置请求处理器
standardService.setContainer(standardEngine);
// 开始初始化
standardService.start();
while (true)
{
Thread.sleep(60000);
System.out.println("still active");
}
}
}
3)访问http://localhost:8080/examples,可以看到examples应用生效了
二、总体结构预览
从如上的范例,我们大概可以对Tomcat的主要组成有了基本的了解,包括其他一些在如上无法反映出来的组件,Tomcat由如下组件组成
1)请求连接接收和分发组件
- Connector(org.apache.catalina.connector.Connector):包括我们在上一篇 中了解的各种Protocol
2)请求处理组件
- Engine(org.apache.catalina.Engine):Engine是请求处理的入口,一个Engine会包含多个Host,我们看看Tomcat中关于Engine的定义
An Engine is a Container that represents the entire Catalina servlet engine.
- Host(org.apache.catalina.Host):Host代表了一个虚拟主机(virtual host),一个Host会包含多个Context,我们看看Tomcat关于Host的定义
A Host is a Container that represents a virtual host in the Catalina servlet engine.
- Context:Context代表了一个独立的应用,一个Context会包含多个请求处理器(Wrapper),我们看看Tomcat关于Context的定义
A Context is a Container that represents a servlet context, and therefore an individual web application, in the Catalina servlet engine.
- Wrapper:Wraper代表了一个Servlet,我们看看Tomcat关于Wrapper的定义
A Wrapper is a Container that represents an individual servlet definition from the deployment descriptor of the web application.
3)组合组件
- Service:Service通过管理多个Connector和请求处理引擎,处理各Connector进入的请求,并由同一个请求处理引擎进行处理
三、结束语
本篇通过一个范例对Tomcat的主体结构做一个预览,具体的细节我们在后面的篇章《生命期控制结构》、《请求处理结构》中更详细地分析。