您当前的位置: 首页 >  tomcat

恐龙弟旺仔

暂无认证

  • 4浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Tomcat源码解析:Catalina源码解析

恐龙弟旺仔 发布时间:2018-12-06 10:55:33 ,浏览量:4

1.Catalina

    对于Tomcat来说,Catalina是其核心组件,所有基于JSP/Servlet的Java Web应用均需要依托Servlet容器运行并对外提供服务。

    4.0版本后,Tomcat完全重新设计了其Servlet容器的架构,新版本的Servlet容器被命名为Catalina。

    Catalina包含了前面讲到的所有容器组件。它通过松耦合的方式继承Coyote,以完成按照请求协议进行数据读写。同时还包括我们的启动入口、Shell程序等

 

    1)Tomcat分层示意图

    2)Digester

        Catalina使用Digester解析XML配置文件并创建应用服务器

        Digester是一款将XML转换为java对象的事件驱动型工具,是对SAX的高层次封装。通过流读取XML文件,当识别出XML节点后便执行特定的动作,或者创建java对象,或者执行对象的某个方法。

        Digester路径为:tomcat-util-scan.jar包下 org.apache.tomcat.util.digester包路径下

 

    3)Server

        以下是有关Server的结构

  2.tomcat8.0.52 有关于Catalina源码解析

    1)%TOMCAT_HOME%/bin/startup.bat

        作为tomcat的启动文件,可以看到,其直接调用了catalina.bat文件

set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=

    可以看到主类为Bootstrap,执行方法为start

 

    2)Bootstrap

    反射的绝佳用例

    /**
     * Start the Catalina daemon.
     */
    public void start()
        throws Exception {
        if( catalinaDaemon==null ) init();
        Method method = catalinaDaemon.getClass().getMethod("start", (Class [] )null);
        method.invoke(catalinaDaemon, (Object [])null);
    }

    其主要作用就是启动一个catalinaDaemon,在其init()方法中可以看到

        Class startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");
        Object startupInstance = startupClass.getConstructor().newInstance();
...
        catalinaDaemon = startupInstance;

    3)Catalina.start()

/**
     * Start a new server instance.
     */
    public void start() {

        if (getServer() == null) {
            load();
        }

        if (getServer() == null) {
            log.fatal("Cannot start server. Server instance is not configured.");
            return;
        }

        long t1 = System.nanoTime();

        // Start the new server
        try {
            getServer().start();
...
/**
     * Start a new server instance.
     */
    public void load() {

        if (loaded) {
            return;
        }
        loaded = true;

        long t1 = System.nanoTime();

        initDirs();

        // Before digester - it may be needed
        initNaming();

        // Create and execute our Digester
        Digester digester = createStartDigester();
...
    /**
     * Create and configure the Digester we will be using for startup.
     */
    protected Digester createStartDigester() {
        long t1=System.currentTimeMillis();
        // Initialize the digester
        Digester digester = new Digester();
        digester.setValidating(false);
        digester.setRulesValidation(true);
        HashMap            
关注
打赏
1655041699
查看更多评论
0.6362s