對應.

欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

MoudleConfig初始化的實現

系統 2322 0
上回說到Struts的ActionServlet,其中有一步是 initModuleConfig方法,就是用于初始化MoudleConfig實例,它是整個org.apache.struts.config包的核心,在Struts應用運行時用來存放整個Struts應用的配置信息.如果有多個子應用,每個子應用都會有一個ModuleConfig對象.ModuleConfig和Struts配置文件的根元素<struts-config>對應.<struts-config>根元素中包含<form-bean>,<action>和<forward>等一系列子元素,因此MouduleConfig中包含了和每個子元素對應的配置類實例.

同時Struts中的MessageResource、PlugIn、數據源等,都是通過ModuleConfig來實現的,所以在ActionServlet初始化上面的那些模塊之前,就先要初始化ModuleConfig,然后由ModuleConfig來負責其初始化。

struts中讀取模塊配置MoudleConfig采用了這樣的工廠方法
一個接口:ModuleConfig.java
一個抽象類:ModuleConfigFactory.java
一個ModuleConfig的實現類:ModuleConfigImpl.java
一個ModuleConfigFactory的子類:DefaultModuleConfigFactory.java

具體介紹
一.initModuleConfigFactory()
在ActionServlet初始化ModuleConfig的時候,先要初始化配置工廠,
Java代碼 復制代碼
  1. initModuleConfigFactory();??
      initModuleConfigFactory();
    


那么這個工廠到底初始化了什么?
現看源代碼:
Java代碼 復制代碼
  1. protected ? void ?initModuleConfigFactory(){ ??
  2. ????????String?configFactory?=?getServletConfig().getInitParameter( "configFactory" ); ??
  3. ???????? if ?(configFactory?!=? null )?{ ??
  4. ????????????ModuleConfigFactory.setFactoryClass(configFactory); ??
  5. ????????} ??
  6. }??
      protected void initModuleConfigFactory(){
        String configFactory = getServletConfig().getInitParameter("configFactory");
        if (configFactory != null) {
            ModuleConfigFactory.setFactoryClass(configFactory);
        }
}
    

很明顯,現從配置參數取得其配置,如果用戶沒有作配置,那么就使用默認配置,如果用戶作了配置,那么就使用用戶的配置。
如果用戶作了配置的話,那么就執行設置成用戶的工廠。如何設置的呢?
Java代碼 復制代碼
  1. public ? static ? void ?setFactoryClass(String?factoryClass)?{ ??
  2. ????ModuleConfigFactory.factoryClass?=?factoryClass; ??
  3. ????ModuleConfigFactory.clazz?=? null ; ??
  4. }??
          public static void setFactoryClass(String factoryClass) {
        ModuleConfigFactory.factoryClass = factoryClass;
        ModuleConfigFactory.clazz = null;
    }
    

直接給ModuleConfigFactory.factoryClass賦值,因為此變量是一個靜態的變量:
???
Java代碼 復制代碼
  1. protected ? static ?String?factoryClass?= ??
  2. ???????? "org.apache.struts.config.impl.DefaultModuleConfigFactory" ;??
      protected static String factoryClass =
        "org.apache.struts.config.impl.DefaultModuleConfigFactory";
    

由此定義決定了可以使用此賦值方法。正是因為此變量是一個靜態的變量,所以在下面的得工廠生成對象的時候就可以創建一個用戶自己的對象。

二.initModuleConfig()
之后由配置工廠再實例化一個ModuleConfig的對象。
Java代碼 復制代碼
  1. ModuleConfig?moduleConfig?=?initModuleConfig( "" ,?config);??
      ModuleConfig moduleConfig = initModuleConfig("", config);
    


看一下initModuleConfig方法是如何初始化ModuleConfig的,看下面的源代碼:
Java代碼 復制代碼
  1. protected ?ModuleConfig?initModuleConfig(String?prefix,?String?paths) ??
  2. ????? throws ?ServletException?{ ??
  3. ? //這個地方,我們可以看到,此時就由ModuleConfigFactory直接創建了一個工廠對象,而此時我們用的配置就是上面我們初始化后的配置。如果用戶自己做了配置,那么此時初始化的工廠就是用戶指定后的工廠。如果沒有的話,那么就初始化的時默認的工廠。 ??
  4. DefaultModuleConfigFactory的一個實例 ??
  5. ????????ModuleConfigFactory?factoryObject?=?ModuleConfigFactory.createFactory(); ??
  6. ?????ModuleConfig?config?=?factoryObject.createModuleConfig(prefix); ??
  7. ????? //?Configure?the?Digester?instance?we?will?use ??
  8. ?????Digester?digester?=?initConfigDigester(); ??
  9. ??
  10. ????? //?Process?each?specified?resource?path ??
  11. ????? while ?(paths.length()?>? 0 )?{ ??
  12. ?????????digester.push(config); ??
  13. ?????????String?path?=? null ; ??
  14. ????????? int ?comma?=?paths.indexOf( ',' ); ??
  15. ????????? if ?(comma?>=? 0 )?{ ??
  16. ?????????????path?=?paths.substring( 0 ,?comma).trim(); ??
  17. ?????????????paths?=?paths.substring(comma?+? 1 ); ??
  18. ?????????}? else ?{ ??
  19. ?????????????path?=?paths.trim(); ??
  20. ?????????????paths?=? "" ; ??
  21. ?????????} ??
  22. ??
  23. ????????? if ?(path.length()?<? 1 )?{ ??
  24. ????????????? break ; ??
  25. ?????????} ??
  26. ??
  27. ????????? this .parseModuleConfigFile(digester,?path); ??
  28. ?????} ??
  29. ??
  30. ?????getServletContext().setAttribute( ??
  31. ?????????Globals.MODULE_KEY?+?config.getPrefix(), ??
  32. ?????????config); ??
  33. ??
  34. ????? //?Force?creation?and?registration?of?DynaActionFormClass?instances ??
  35. ????? //?for?all?dynamic?form?beans?we?wil?be?using ??
  36. ?????FormBeanConfig?fbs[]?=?config.findFormBeanConfigs(); ??
  37. ????? for ?( int ?i?=? 0 ;?i?<?fbs.length;?i++)?{ ??
  38. ????????? if ?(fbs[i].getDynamic())?{ ??
  39. ?????????????fbs[i].getDynaActionFormClass(); ??
  40. ?????????} ??
  41. ?????} ??
  42. ??
  43. ????? return ?config; ??
  44. ?}??
         protected ModuleConfig initModuleConfig(String prefix, String paths)
        throws ServletException {
    //這個地方,我們可以看到,此時就由ModuleConfigFactory直接創建了一個工廠對象,而此時我們用的配置就是上面我們初始化后的配置。如果用戶自己做了配置,那么此時初始化的工廠就是用戶指定后的工廠。如果沒有的話,那么就初始化的時默認的工廠。
也就是DefaultModuleConfigFactory的一個實例
           ModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();
        ModuleConfig config = factoryObject.createModuleConfig(prefix);
        // Configure the Digester instance we will use
        Digester digester = initConfigDigester();

        // Process each specified resource path
        while (paths.length() > 0) {
            digester.push(config);
            String path = null;
            int comma = paths.indexOf(',');
            if (comma >= 0) {
                path = paths.substring(0, comma).trim();
                paths = paths.substring(comma + 1);
            } else {
                path = paths.trim();
                paths = "";
            }

            if (path.length() < 1) {
                break;
            }

            this.parseModuleConfigFile(digester, path);
        }

        getServletContext().setAttribute(
            Globals.MODULE_KEY + config.getPrefix(),
            config);

        // Force creation and registration of DynaActionFormClass instances
        // for all dynamic form beans we wil be using
        FormBeanConfig fbs[] = config.findFormBeanConfigs();
        for (int i = 0; i < fbs.length; i++) {
            if (fbs[i].getDynamic()) {
                fbs[i].getDynaActionFormClass();
            }
        }

        return config;
    }

    


三.createModuleConfig()方法
那么初始化配置模塊createModuleConfig方法到底做了什么呢?
其實是生成了一個ModuleConfig的對象。這個對象是由其工廠產生的,由什么樣的工廠就會生成什么樣的產品。所以如果是用戶配置過的工廠,那么就會生成其對應的配置模塊的實現。
默認的情況:
Java代碼 復制代碼
  1. public ? class ?DefaultModuleConfigFactory? extends ?ModuleConfigFactory? implements ?Serializable{ ??
  2. ???? //?---------------------------------------------------------?Public?Methods ??
  3. ??
  4. ???? /** ?
  5. ?????*?Create?and?return?a?newly?instansiated?{@link?ModuleConfig}. ?
  6. ?????*?This?method?must?be?implemented?by?concrete?subclasses. ?
  7. ?????* ?
  8. ?????*?@param?prefix?Module?prefix?for?Configuration ?
  9. ?????*/ ??
  10. ???? public ?ModuleConfig?createModuleConfig(String?prefix)?{ ??
  11. ??
  12. ???????? return ? new ?ModuleConfigImpl(prefix); ??
  13. ??
  14. ????} ??
  15. }??
      public class DefaultModuleConfigFactory extends ModuleConfigFactory implements Serializable{
    // --------------------------------------------------------- Public Methods

    /**
     * Create and return a newly instansiated {@link ModuleConfig}.
     * This method must be implemented by concrete subclasses.
     *
     * @param prefix Module prefix for Configuration
     */
    public ModuleConfig createModuleConfig(String prefix) {

        return new ModuleConfigImpl(prefix);

    }
}
    

它的createModuleConfig(String prefix)方法會生成一個ModuleConfigImpl類。

四.ModuleConfigImpl類
??? ModuleConfigImpl類相當于一個JavaBean,用來存放一個web模塊運行時所需要的配置信息。當 然,一個web模塊可以擁有多個ModuleConfig,但是缺省的是prefix長度為0的ModuleConifg。它 的每個屬性幾乎都是由HashMap組成的,它通過一個configured布爾值來描述當前的ModuleConfig是否已經被初始化完畢,在每存放一個屬性的時候都會監測這個值。如果初始化完畢而還要改變里面的屬性值,則會報出IllegalStateException("Configuration is frozen")異常,
現在對它的屬性簡單說明如下:
?????
Java代碼 復制代碼
  1. //?這個HashMap用來存儲ActionConfig對象。 ??
  2. protected ?HashMap?actionConfigs: ??
  3. //HashMap用來存儲DataSourceConfig對象。 ??
  4. protected ?HashMap?dataSources ??
  5. //這個HashMap用來存儲ExceptionConfig對象。 ??
  6. protected ?HashMap?exceptions ??
  7. //這個HashMap用來存儲FormBeanConfig對象。 ??
  8. ? protected ?HashMap?formBeans ??
  9. //這個HashMap用來存儲ForwardConfig對象。 ??
  10. ? protected ?HashMap?forwards ??
  11. //這個HashMap用來存儲MessageResourcesConfig對象。 ??
  12. ?? protected ?HashMap?messageResources ??
  13. //這個HashMap用來存儲PlugInConfig對象。 ??
  14. ??? protected ?ArrayList?plugIns ??
  15. //ControllerConfig類 ??
  16. ?? protected ?ControllerConfig?controllerConfig ??
  17. //標志這個ModuleConfig是(true)否(false)配置完成。 ??
  18. ???? protected ? boolean ?configured ??
  19. //用來標志和區分ModuleConfig類,同時在使用上面的config類初始化相應的資源以后,也是通過這個prefix來區分所屬的不同的web模塊。 ??
  20. ?? protected ?String?prefix ??
  21. //ActionMapping類名,缺省為org.apache.struts.action.ActionMapping。[ ??
  22. ?? protected ?String?actionMappingClass?=? "org.apache.struts.action.ActionMapping" ??
      // 這個HashMap用來存儲ActionConfig對象。
protected HashMap actionConfigs:
//HashMap用來存儲DataSourceConfig對象。
protected HashMap dataSources
//這個HashMap用來存儲ExceptionConfig對象。
protected HashMap exceptions
//這個HashMap用來存儲FormBeanConfig對象。
 protected HashMap formBeans
//這個HashMap用來存儲ForwardConfig對象。
 protected HashMap forwards
//這個HashMap用來存儲MessageResourcesConfig對象。
  protected HashMap messageResources
//這個HashMap用來存儲PlugInConfig對象。
   protected ArrayList plugIns
//ControllerConfig類
  protected ControllerConfig controllerConfig
//標志這個ModuleConfig是(true)否(false)配置完成。
    protected boolean configured
//用來標志和區分ModuleConfig類,同時在使用上面的config類初始化相應的資源以后,也是通過這個prefix來區分所屬的不同的web模塊。
  protected String prefix
//ActionMapping類名,缺省為org.apache.struts.action.ActionMapping。[
  protected String actionMappingClass = "org.apache.struts.action.ActionMapping"
    


ModuleConfigImpl類的ModuleConfigImpl方法如下
Java代碼 復制代碼
  1. public ?ModuleConfigImpl(String?prefix)?{ ??
  2. ?????? super (); ??
  3. ?????? this .prefix?=?prefix; ??
  4. ?????? this .actionConfigs?=? new ?HashMap(); ??
  5. ?????? this .actionConfigList?=? new ?ArrayList(); ??
  6. ?????? this .actionFormBeanClass?=? "org.apache.struts.action.ActionFormBean" ; ??
  7. ?????? this .actionMappingClass?=? "org.apache.struts.action.ActionMapping" ; ??
  8. ?????? this .actionForwardClass?=? "org.apache.struts.action.ActionForward" ; ??
  9. ?????? this .configured?=? false ; ??
  10. ?????? this .controllerConfig?=? null ; ??
  11. ?????? this .dataSources?=? new ?HashMap(); ??
  12. ?????? this .exceptions?=? new ?HashMap(); ??
  13. ?????? this .formBeans?=? new ?HashMap(); ??
  14. ?????? this .forwards?=? new ?HashMap(); ??
  15. ?????? this .messageResources?=? new ?HashMap(); ??
  16. ?????? this .plugIns?=? new ?ArrayList(); ??
  17. ??}??
        public ModuleConfigImpl(String prefix) {
        super();
        this.prefix = prefix;
        this.actionConfigs = new HashMap();
        this.actionConfigList = new ArrayList();
        this.actionFormBeanClass = "org.apache.struts.action.ActionFormBean";
        this.actionMappingClass = "org.apache.struts.action.ActionMapping";
        this.actionForwardClass = "org.apache.struts.action.ActionForward";
        this.configured = false;
        this.controllerConfig = null;
        this.dataSources = new HashMap();
        this.exceptions = new HashMap();
        this.formBeans = new HashMap();
        this.forwards = new HashMap();
        this.messageResources = new HashMap();
        this.plugIns = new ArrayList();
    }
    

通過其默認工廠的實現,我們可以看到,其實例化了一個ModuleConfigImpl的對象,這是ModuleConfig的一種實現,也是當前struts的默認的實現。

這是初始化過程開始逐漸明朗.
調用過程factoryObject.createModuleConfig(prefix)--->DefaultModuleConfigFactory 的createModuleConfig(prefix)---->new ModuleConfigImpl(prefix), 但好像還有一個問題,ModuleConfigImpl類的ModuleConfigImpl方法里對其屬性都是new的,沒賦值啊?后來仔細看了半天,發現在initModuleConfig方法里還有幾行代碼
Java代碼 復制代碼
  1. ....... ??
  2. ?Digester?digester?=?initConfigDigester(); ??
  3. ....... ??
  4. igester.push(config); ??
  5. ?....... ??
  6. ? this .parseModuleConfigFile(digester,?path); ??
  7. .....??
        .......
   Digester digester = initConfigDigester();
  .......
 digester.push(config);
   .......
   this.parseModuleConfigFile(digester, path);
  .....

    

應該是digster攜帶config實例在parseModuleConfigFile方法里初始化好了.

五.UserModuleConfigFactory
如果是用戶配置了實現工廠的話,可能的實現就是:
Java代碼 復制代碼
  1. public ? class ?UserModuleConfigFactory? extends ?ModuleConfigFactory? implements ?Serializable{ ??
  2. ??????? public ?ModuleConfig?createModuleConfig(String?prefix)?{ ??
  3. ???????? return ? new ?ModuleConfigUserImpl(prefix); ??
  4. ????} ??
  5. }??
      public class UserModuleConfigFactory extends ModuleConfigFactory implements Serializable{
       public ModuleConfig createModuleConfig(String prefix) {
        return new ModuleConfigUserImpl(prefix);
    }
}
    

??? 當然,如果要啟用你的工廠的話,那么還要在你的配置文件中添加如下部分,在web.xml中修改如下部分:
Java代碼 復制代碼
  1. <servlet> ??
  2. ????<servlet-name>action</servlet-name> ??
  3. ????<servlet- class >org.apache.struts.action.ActionServlet</servlet- class > ??
  4. ????<init-param> ??
  5. ??????<param-name>config</param-name> ??
  6. ??????<param-value>/WEB-INF/struts-config.xml</param-value> ??
  7. ????</init-param> ??
  8. ????<init-param> ??
  9. ??????<param-name>debug</param-name> ??
  10. ??????<param-value> 3 </param-value> ??
  11. ????</init-param> ??
  12. ????<init-param> ??
  13. ??????<param-name>detail</param-name> ??
  14. ??????<param-value> 3 </param-value> ??
  15. </init-param> ??
  16. ??
  17. ????<init-param> ??
  18. ??????<param-name>configFactory</param-name> ??
  19. ??????<param-value>org.aa.struts.?UserModuleConfigFactory?</param-value> ??
  20. </init-param> ??
  21. ??
  22. ????<load-on-startup> 0 </load-on-startup> ??
  23. ??</servlet>??
      <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
</init-param>

    <init-param>
      <param-name>configFactory</param-name>
      <param-value>org.aa.struts. UserModuleConfigFactory </param-value>
</init-param>

    <load-on-startup>0</load-on-startup>
  </servlet>

    

這樣的話,你的工廠就可以生效了,也可以生成你自己的配置模塊的實例了。

到此,配置模塊MoudelConfig的初始化也已經完成.

MoudleConfig初始化的實現


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产成人不卡 | 亚洲日本色| 国产91亚洲精品 | 日本天天色 | 成人精品视频在线观看 | 91成人亚洲| 亚洲第一黄色网址 | 精品一区二区三区在线观看 | 久久99国产亚洲精品观看 | 日日爽 | 999热在线精品观看全部 | 91tm视频| 成人av免费观看 | 日本人videos18videosrrty | 国产精品久久婷婷六月丁香 | 一个色综合亚洲伊人久久 | 开心伊人 | 最新国产网址 | 亚洲午夜精品国产电影在线观看 | 黑人精品欧美一区二区蜜桃 | 奇米奇米777 | 成人v| 中文字幕在亚洲第一在线 | 久久九九久精品国产 | 精品无码国产一区二区日本 | 二区视频| 精品久 | 国产美女一区二区三区 | 老司机精品视频个人在观看 | 日韩 欧美 国产 亚洲 中文 | a级毛片免费高清视频 | 香蕉视频在线观看免费国产婷婷 | 激情av免费看 | 青草视频在线免费观看 | 欧美精品一级 | 精品伊人久久久99热这里只 | 国产成人在线播放视频 | 久久中文字幕一区二区三区 | 超碰国产在线 | 96福利视频| 日韩 第一页 |