麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

Tomcat源碼分析——server.xml文件的加載

2019-11-14 15:29:27
字體:
來源:轉載
供稿:網友

前言

  作為java程序員,對于tomcat的server.xml想必都不陌生。本文基于Tomcat7.0的Java源碼,對server.xml文件是如何加載的進行分析。

源碼分析

  Bootstrap的load方法是加載tomcat的server.xml的入口,load方法實際通過反射調用了Catalina的load方法,見代碼清單1。

代碼清單1

/** * Load daemon. */PRivate void load(String[] arguments)    throws Exception {    // Call the load() method    String methodName = "load";    Object param[];    Class<?> paramTypes[];    if (arguments==null || arguments.length==0) {        paramTypes = null;        param = null;    } else {        paramTypes = new Class[1];        paramTypes[0] = arguments.getClass();        param = new Object[1];        param[0] = arguments;    }    Method method =         catalinaDaemon.getClass().getMethod(methodName, paramTypes);    if (log.isDebugEnabled())        log.debug("Calling startup class " + method);    method.invoke(catalinaDaemon, param);}

Catalina的load方法的實現見代碼清單2。

代碼清單2

/** * Start a new server instance. */public void load() {    long t1 = System.nanoTime();    initDirs();    // Before digester - it may be needed    initNaming();    // Create and execute our Digester    Digester digester = createStartDigester();    InputSource inputSource = null;    InputStream inputStream = null;    File file = null;    try {        file = configFile();        inputStream = new FileInputStream(file);        inputSource = new InputSource("file://" + file.getAbsolutePath());    } catch (Exception e) {        // Ignore    }    if (inputStream == null) {        try {            inputStream = getClass().getClassLoader()                .getResourceAsStream(getConfigFile());            inputSource = new InputSource                (getClass().getClassLoader()                 .getResource(getConfigFile()).toString());        } catch (Exception e) {            // Ignore        }    }    // This should be included in catalina.jar    // Alternative: don't bother with xml, just create it manually.    if( inputStream==null ) {        try {            inputStream = getClass().getClassLoader()            .getResourceAsStream("server-embed.xml");            inputSource = new InputSource            (getClass().getClassLoader()                    .getResource("server-embed.xml").toString());        } catch (Exception e) {            // Ignore        }    }    if ((inputStream == null) && (file != null)) {        log.warn("Can't load server.xml from " + file.getAbsolutePath());        if (file.exists() && !file.canRead()) {            log.warn("Permissions incorrect, read permission is not allowed on the file.");        }        return;    }    try {        inputSource.setByteStream(inputStream);        digester.push(this);        digester.parse(inputSource);        inputStream.close();    } catch (Exception e) {        log.warn("Catalina.start using "                           + getConfigFile() + ": " , e);        return;    }    // Stream redirection    initStreams();    // Start the new server    try {        getServer().init();    } catch (LifecycleException e) {        if (Boolean.getBoolean("org.apache.catalina.startup.EXIT_ON_INIT_FAILURE"))            throw new java.lang.Error(e);        else               log.error("Catalina.start", e);    }    long t2 = System.nanoTime();    if(log.isInfoEnabled())        log.info("Initialization processed in " + ((t2 - t1) / 1000000) + " ms");}

這里對代明清單2進行分析,其執行步驟如下:
1) initDirs方法用于對catalina.home和catalina.base的一些檢查工作。
2) initNaming方法給系統設置java.naming.factory.url.pkgs和java.naming.factory.initial。在創建JNDI上下文時,使用Context.INITIAL_CONTEXT_FACTORY("java.naming.factory.initial")屬性,來指定創建JNDI上下文的工廠類;Context.URL_PKG_PREFIXES("java.naming.factory.url.pkgs")用在查詢url中包括scheme方法id時創建對應的JNDI上下文,例如查詢"java:/jdbc/test1"等類似查詢上,即以冒號":"標識的shceme。Context.URL_PKG_PREFIXES屬性值有多個java 包(package)路徑,其中以冒號":"分隔各個包路徑,這些包路徑中包括JNDI相關實現類。當在JNDI上下文中查找"java:"這類包括scheme方案ID的url時,InitialContext類將優先查找Context.URL_PKG_PREFIXES屬性指定的包路徑中是否存在 scheme+"."+scheme + "URLContextFactory"工廠類(需要實現ObjectFactory接口),如果存在此工廠類,則調用此工廠類的getObjectInstance方法獲得此scheme方案ID對應的jndi上下文,再在此上下文中繼續查找對應的url。
3) createStartDigester方法創建并配置將要用來啟動的Digester實例,并且設置一系列Rule,具體映射到server.xml。
4) 使用FileInputStream獲取conf/server.xml配置文件輸入流。
5) 將FileInputStream封裝為InputSource,并且調用Digester的parse方法進行解析。
6) initStreams對輸出流、錯誤流重定向。
7) 初始化server,具體實現本文不做分析。

總結

  從上面的分析可以看到,tomcat加載server.xml配置文件的方式,非常傳統,正是使用FileInputStream進行加載的。有關server.xml配置文件的解析會在之后補充。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 万圣街在线观看免费完整版 | 一级网站| 青青操国产 | 久久99精品久久久久久国产越南 | 精品久久久久久久久久久下田 | 中国毛片在线观看 | 免费a级黄色片 | 一区在线免费视频 | 成人性视频欧美一区二区三区 | 中文字幕涩涩久久乱小说 | 91九色视频在线播放 | jizzyouxxxx| 青青操精品| 久久我不卡 | 羞羞的视频免费观看 | 激情亚洲一区二区 | 国产毛毛片一区二区三区四区 | 人人舔人人舔 | 国产一级大片 | av电影在线观看网站 | 国产一级片91 | 一级免费在线视频 | 草草久久久 | 久久久久免费精品国产小说色大师 | 成人毛片免费在线 | 久久精品毛片 | 久久精品免费国产 | 欧美成人亚洲 | 成人福利在线 | 成人在线观看地址 | 久草在线视频精品 | 爽爽视频免费看 | 深夜福利视频免费观看 | 男女亲热网站 | 男女羞羞视频在线免费观看 | 日本在线一区二区 | 国产精品久久久久久久久久久久久久久 | 国产精品午夜一区 | 久久精品久 | 91成人免费看片 | 午夜视频亚洲 |