Java Web容器之Tomcat6.0 源码学习笔记

好记性不如烂笔头,把学习过的知识记下来以后参考,文笔不好,只作笔记之用,后面继续补充。


Tomcat 根据[b]server.xml[/b]文件中的配置将Web服务器划分为以下几个组件:

[b][size=large]StandardServer[/size][/b]
StandardServer对象,实现Server接口,服务器启用后内存中只有一个StandardServer对象,可包含多个Service组件,由StandardServer负责启用其包含的Service组件

// 属性域
private Service services[] = new Service[0];

// Start 部分代码摘要
// Start our defined Services
synchronized (services) {
for (int i = 0; i < services.length; i++) {
if (services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();
}
}


[b][size=large]StandardService[/size][/b]
根据server.xml文件配置可存在多个StandardService对象,默认只有一个。一个StandardService包含多个Connector(连接器负责监听客户端请求),包含一个Container(容器的父接口,所有容器都实现它)这里指向StandardEngine容器,StandardService启动时,先启动Container(StandardEngine),接着启动Connector。

protected Container container = null;

protected Connector connectors[] = new Connector[0];

// Start our defined Container first
if (container != null) {
synchronized (container) {
if (container instanceof Lifecycle) {
((Lifecycle) container).start();
}
}
}


// Start our defined Connectors second
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++) {
if (connectors[i] instanceof Lifecycle)
((Lifecycle) connectors[i]).start();
}
}

其中容器的启动是先于连接器,也就是说只有当服务器启动完准备好了,才开始接受客户端请求。

[b][size=large]StandardEngine[/size][/b]
负责启动其子容器StandardHost。

[b][size=large]StandardHost[/size][/b]
负责创建和启动其子容器StandardContext,启动时根据配置文件(HostConfig监听中处理),或部署目录,war包生成相应StandardContext对象,接着调用相应的启动方法
HostConfig中我们关心的代码

/**
* Deploy applications for any directories or WAR files that are found
* in our "application root" directory.
*/
protected void deployApps() {

File appBase = appBase();
File configBase = configBase();
// Deploy XML descriptors from configBase
deployDescriptors(configBase, configBase.list());
// Deploy WARs, and loop if additional descriptors are found
deployWARs(appBase, appBase.list());
// Deploy expanded folders
deployDirectories(appBase, appBase.list());

}



context.setPath(contextPath);
context.setDocBase(file);
host.addChild(context);


[b][size=large]StandardContext[/size][/b]
负责创建和启动其子容器StandardWrapper,StandardContext代表一个Web应用,其启动时(ContextConfig监听)会根据web.xml文件生成相应的配置如listener或其子容器StandardWrapper,我们熟悉的一些配置也是在这时启动,如listener

// Configure and call application event listeners
if (ok) {
if (!listenerStart()) {
log.error( "Error listenerStart");
ok = false;
}
}



// Configure and call application filters
if (ok) {
if (!filterStart()) {
log.error( "Error filterStart");
ok = false;
}
}



// Load and initialize all "load on startup" servlets
if (ok) {
loadOnStartup(findChildren());
}


[b][size=large]StandardWrapper[/size][/b]
容器链的终点,代表一个Servlet配置,用于处理请求。
public void addChild(Container child) {

throw new IllegalStateException
(sm.getString("standardWrapper.notChild"));

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值