首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

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

2012-09-27 
Java Web容器之Tomcat6.0源码学习笔记好记性不如烂笔头,把学习过的知识记下来以后参考,文笔不好,只作笔记

Java Web容器之Tomcat6.0 源码学习笔记
好记性不如烂笔头,把学习过的知识记下来以后参考,文笔不好,只作笔记之用,后面继续补充。


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

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

// 属性域private Service services[] = new Service[0];// Start 部分代码摘要// Start our defined Servicessynchronized (services) {    for (int i = 0; i < services.length; i++) {        if (services[i] instanceof Lifecycle)            ((Lifecycle) services[i]).start();    }}


StandardService
根据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 firstif (container != null) {    synchronized (container) {        if (container instanceof Lifecycle) {            ((Lifecycle) container).start();        }    }}// Start our defined Connectors secondsynchronized (connectors) {    for (int i = 0; i < connectors.length; i++) {        if (connectors[i] instanceof Lifecycle)            ((Lifecycle) connectors[i]).start();    }}

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

StandardEngine
负责启动其子容器StandardHost。

StandardHost
负责创建和启动其子容器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);


StandardContext
负责创建和启动其子容器StandardWrapper,StandardContext代表一个Web应用,其启动时(ContextConfig监听)会根据web.xml文件生成相应的配置如listener或其子容器StandardWrapper,我们熟悉的一些配置也是在这时启动,如listener
// Configure and call application event listenersif (ok) {    if (!listenerStart()) {        log.error( "Error listenerStart");        ok = false;    }}


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


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


StandardWrapper
容器链的终点,代表一个Servlet配置,用于处理请求。
public void addChild(Container child) {        throw new IllegalStateException            (sm.getString("standardWrapper.notChild"));}

热点排行