亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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配置文件的解析會在之后補充。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一综合天堂另类专| 欧美黄色性视频| 亚洲欧美在线x视频| 国产欧美精品va在线观看| 亚洲欧洲在线观看| 岛国av一区二区在线在线观看| 欧美黑人巨大精品一区二区| 亚洲香蕉伊综合在人在线视看| 欧美大片在线免费观看| www高清在线视频日韩欧美| 97久久国产精品| 日韩在线视频观看| 欧美在线亚洲一区| 欧美性视频网站| 国产中文日韩欧美| 日韩av中文字幕在线免费观看| 日韩美女毛茸茸| 欧美中文字幕第一页| 亚洲成avwww人| 亚洲精品久久久久国产| 精品久久久久久亚洲精品| 国产精品揄拍500视频| 成人激情视频免费在线| 久久99青青精品免费观看| 国产精品嫩草影院一区二区| 欧美激情视频播放| 国产精品一区二区电影| 国产精品久久久久久久久男| 欧美激情精品久久久久久黑人| 日韩69视频在线观看| 色诱女教师一区二区三区| 97超级碰碰碰久久久| 久久久久中文字幕2018| 欧美一级视频一区二区| 亚洲国产欧美一区二区三区久久| 午夜精品蜜臀一区二区三区免费| 丝袜亚洲另类欧美重口| 成人黄色中文字幕| 日韩av电影免费观看高清| 日韩视频中文字幕| 国产精品久久久久久五月尺| 久久精品国产亚洲精品| 亚洲欧美中文在线视频| 日韩中文第一页| 久久久av电影| 亚洲第一精品电影| 欧美日韩免费看| 久久五月情影视| 精品性高朝久久久久久久| 欧美猛少妇色xxxxx| 91理论片午午论夜理片久久| 欧美视频免费在线| 亚洲2020天天堂在线观看| 亚洲最新中文字幕| 亚洲综合成人婷婷小说| 91精品国产综合久久香蕉922| 国产精品私拍pans大尺度在线| 欧美片一区二区三区| 欧美日韩亚洲一区二区| 亚洲人成电影在线观看天堂色| 国产精品一区久久久| 日韩国产欧美区| 亚洲精品影视在线观看| 欧美日韩一区二区免费在线观看| 国产亚洲欧美视频| 国产日韩在线看片| 久精品免费视频| 日韩欧美在线观看| 中文字幕久久久av一区| 国产成人亚洲精品| 日韩最新中文字幕电影免费看| 日本午夜在线亚洲.国产| 久久夜色撩人精品| 国产欧美日韩高清| 日韩av免费网站| 国产精品入口福利| 亚洲国产天堂久久综合| 国产99视频在线观看| 日韩国产欧美精品一区二区三区| 欧美日韩中文字幕日韩欧美| 国模精品系列视频| 日韩在线观看免费高清完整版| 日韩av一卡二卡| 97色在线观看免费视频| 欧美高清videos高潮hd| 久久成人精品电影| 日韩成人高清在线| 亚洲无线码在线一区观看| 亚洲成人精品久久久| 亚洲欧美日韩在线高清直播| 国产精品自产拍在线观看| 美女久久久久久久久久久| 国产成人一区二区三区电影| 91av在线播放视频| 日韩av在线电影网| 国产精品99久久久久久www| 秋霞av国产精品一区| 毛片精品免费在线观看| 91免费看片在线| 国产欧美中文字幕| 91精品国产91久久久久| 91视频国产精品| 国产在线日韩在线| 亚洲最大的av网站| 欧美日韩激情视频8区| 日韩成人激情视频| 91国产视频在线| 成人网在线观看| 亚洲精品久久在线| 久久不射热爱视频精品| 日韩av在线免费播放| 国产精品88a∨| 欧美亚洲视频在线看网址| 国产精品视频导航| 日韩大陆毛片av| 欧美性少妇18aaaa视频| 亚洲欧美一区二区激情| 国产69久久精品成人看| 亚洲影视九九影院在线观看| 久久av在线播放| 欧美性精品220| 日韩福利视频在线观看| 亚洲一区二区三区四区视频| 日本亚洲精品在线观看| 亚洲一区二区三区视频播放| 欧洲精品在线视频| 日韩美女在线观看一区| 久久久亚洲福利精品午夜| 在线观看久久av| 欧美视频裸体精品| 91视频免费在线| 亚洲综合色av| 久久久久久久久久国产精品| 欧美交受高潮1| 国产成人一区二区三区电影| 一夜七次郎国产精品亚洲| 91精品国产高清自在线| 中文字幕精品—区二区| 成人h猎奇视频网站| 亚洲视频综合网| 久久亚洲一区二区三区四区五区高| 欧美日韩一区二区免费视频| 亚洲www视频| 欧洲美女7788成人免费视频| 国产精品海角社区在线观看| 91精品国产高清久久久久久| 国产一区二区三区精品久久久| 亚洲视频在线观看免费| 色偷偷9999www| 亚洲福利视频二区| 97视频在线观看免费高清完整版在线观看| 国产午夜精品一区理论片飘花| 最近2019年手机中文字幕| 欧美高清视频在线| 亚洲网站在线看| 国产精品扒开腿做| 欧美老女人性视频| 福利微拍一区二区| 在线看欧美日韩| 欧美日韩成人网| 亚洲最大福利视频网站| 欧美日韩福利视频| 精品欧美aⅴ在线网站| 色多多国产成人永久免费网站|