一路跋山涉水,这是最后一章了。



关于tomcat的启动,有两个类,一个是Catalina类,一个是Bootstrap类。

理论上,两个类可以和到一起,但是为了支持多种运行模式,又把他们分开了。

为了让用户更方便的启动tomcat,还有批处理文件startup.bat(终于见到最顶层的模块了!!)

Catalina

先说Catalina

它里面有一个Server组件(不懂的看第14章)。同时在它的start方法中包含一个Digester对象(不懂的看第15章)用来解析conf/下的Server.xml(这个xml装配起Catalina类里面的那个Server组件)。

同时Catalina本身也有main方法,在运行main方法的时候需要加上启动参数。可选start,stop,debug等等

我们看看process方法

    public void process(String args[]) {

        setCatalinaHome();     //设定Home与Base的值为user.dir
        setCatalinaBase();

    if (arguments(args))   //省略try catch
             execute();        //检查args的格式
    }
    protected void execute() throws Exception {
        if (starting)
            start();
        else if (stopping)
            stop();
    }

我们主要看如何启动。

   

  protected void start() { //省略了大量非核心代码 及try catch
    ...
        // Create and execute our Digester
        Digester digester = createStartDigester();  //这个要是不懂看15章
        File file = configFile();                   //指定文件为conf/server.xml
            InputSource is =new InputSource("file://" + file.getAbsolutePath());
            FileInputStream fis = new FileInputStream(file);
            is.setByteStream(fis);
            digester.push(this);        //把catalina自己放了进去
                    //catalina里有server组件
            digester.parse(is);
            fis.close();

    ...
        // Start the new server
        if (server instanceof Lifecycle) {
                server.initialize();
                // Wait for the server to be told to shut down
                server.await();  //上面的英文再给大家解释一下吧
                         //除非收到SHUTDOWM的指令 就一直阻塞在这里
                 //这要是不懂 回去看第二三章
        }
    ...
        // Shut down the server
        if (server instanceof Lifecycle) {
                ((Lifecycle) server).stop();
        }
    }

这里有一个问题

server.initialize();

server从哪里来的?

别急看createStartDigester方法。

 

 protected Digester createStartDigester() {

        // Initialize the digester
        Digester digester = new Digester();
        if (debug)
            digester.setDebug(999);
        digester.setValidating(false);

        // Configure the actions we will be using
        digester.addObjectCreate("Server",
                                 "org.apache.catalina.core.StandardServer",
                                 "className");
        digester.addSetProperties("Server");
    //解释一下下面
    //在解析server.xml时 如果碰到Server这个模式
    //就调用栈底元素的方法名为setServer参数为org.apache.catalina.Server的方法
    //把Server自己(就是上面addObjectCreate产生的那个)注入栈底的那个元素
    //那么栈底是什么呢?
    //digester.push(this); 看看这行代码还有Catalian的setServer方法
        digester.addSetNext("Server",
                            "setServer",
                            "org.apache.catalina.Server");

    .....
    return digester
}

Bootstrap类

现在说说Bootstrap

Bootstrap的main方法会实例化一个Catalina对象,并调用它的process方法。

在main方法中,首先会创建三个类加载器。

为什么?就是为了不让应用程序中的类使用WEB-INF/Class和WEB-INF/lib之外的类。

具体怎么做的看第八章。

  public static void main(String args[]) {// 省略非核心代码及try catch
        // Construct the class loaders we will need
        ClassLoader commonLoader = null;
        ClassLoader catalinaLoader = null;
        ClassLoader sharedLoader = null;
      ...

            // Load our startup class and call its process() method
            // Instantiate a startup class instance
            if (debug >= 1)
                log("Loading startup class");
            Class startupClass =
                catalinaLoader.loadClass
                ("org.apache.catalina.startup.Catalina");
            Object startupInstance = startupClass.newInstance(); //加载Catalina类

            // Call the process() method
            if (debug >= 1)
                log("Calling startup class process() method");
            methodName = "process";
            paramTypes = new Class[1];
            paramTypes[0] = args.getClass();
            paramValues = new Object[1];
            paramValues[0] = args;
            method =
                startupInstance.getClass().getMethod(methodName, paramTypes);
            method.invoke(startupInstance, paramValues);  //调用Catalina的process方法
    }

关于startup.bat的知识,我们下一节再谈... 哎还有一节呀

How tomcat works 读书笔记十七 启动tomcat 上的更多相关文章

  1. How tomcat works 读书笔记十七 启动tomcat 下

    在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释 ...

  2. How Tomcat Works 读书笔记 八 载入器 上

    Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...

  3. How tomcat works 读书笔记十二 StandardContext 上

    在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个in ...

  4. how tomcat works 读书笔记(二)----------一个简单的servlet容器

    app1 (建议读者在看本章之前,先看how tomcat works 读书笔记(一)----------一个简单的web服务器 http://blog.csdn.net/dlf123321/arti ...

  5. how tomcat works 读书笔记四 tomcat的默认连接器

    事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...

  6. how tomcat works 读书笔记(一)----------一个简单的webserver

    http协议 若是两个人能正常的说话交流,那么他们间必然有一套统一的语言规则<在网络上server与client能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertex ...

  7. how tomcat works 读书笔记(一)----------一个简单的web服务器

    http协议 若是两个人能正常的说话交流,那么他们间必定有一套统一的语言规则<在网络上服务器与客户端能交流也依赖与一套规则,它就是我们说的http规则(超文本传输协议Hypertext tran ...

  8. how tomcat works读书笔记 七 日志记录器

    大家可以松一口气了,这个组件比较简单,这一节和前面几节想比,也简单的多. Logger接口 Tomcat中的日志记录器都必须实现org.apache.catalina.Logger接口. packag ...

  9. How tomcat works 读书笔记十五 Digester库 下

    在这一节里我们说说ContextConfig这个类. 这个类在很早的时候我们就已经使用了(之前那个叫SimpleContextConfig),但是在之前它干的事情都很简单,就是吧context里的co ...

随机推荐

  1. springMVC源码分析--拦截器HandlerExecutionChain(三)

    上一篇博客springMVC源码分析--HandlerInterceptor拦截器调用过程(二)中我们介绍了HandlerInterceptor的执行调用地方,最终HandlerInterceptor ...

  2. 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

    新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene- ...

  3. 浅谈SSH框架

    在学习或者接触一个新的概念的时候,我们应该在脑海中发挥我们的搜索引擎,牵一发动全身的去想,这个知识跟我之前接触过的有哪些相同或者不同的地方,从这个角度去看那些新的知识和概念,经过旧知识和新知识的对比我 ...

  4. Swift中集合类型indexOf(Element)提示错误的解决办法

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 初学Swift,会遇到一些潜在的小问题,比如我们在某个集合对象 ...

  5. 基于V4L2摄像头采集图片程序设计

    #ifndef __COMMON_H #define __COMMON_H //该头文件定义的是摄像头在屏幕上显示的宽度和高度 #include<stdio.h> #include< ...

  6. 通过邮件找回密码功能的Java实现

    1.有个需求就是,忘记密码后通过邮箱找回.现在的系统在注册的时候都会强制输入邮箱,其一目的就是 通过邮件绑定找回,可以进行密码找回.通过java发送邮件的功能我就不说了,重点讲找回密码. 2.参考别人 ...

  7. golang函数可变参数传递性能问题

    几天前纠结了一个蛋疼的问题,在go里面函数式支持可变参数的,譬如...T,go会创建一个slice,用来存放传入的可变参数,那么,如果创建一个slice,例如a,然后以a...这种方式传入,go会不会 ...

  8. Android support library支持包常用控件介绍(二)

    谷歌官方推出Material Design 设计理念已经有段时间了,为支持更方便的实现 Material Design设计效果,官方给出了Android support design library ...

  9. Uva - 12504 - Updating a Dictionary

    全是字符串相关处理,截取长度等相关操作的练习 AC代码: #include <iostream> #include <cstdio> #include <cstdlib& ...

  10. 网站开发进阶(三十五)JSP页面中的pageEncoding和contentType两种属性

    JSP页面中的pageEncoding和contentType两种属性 本文介绍了在JSP页面中经常用的两种属性,分别是pageEncoding和contentType,希望对你有帮助,一起来看. 关 ...