<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0

    Struts 源碼的切片學習(一) -Struts 初始化

    ?

    ?

    Author ???? :????? zhyiwww

    E-Mail ????? :????? zhyiwww@163.com

    Date ????????? :????? 2007-1-10

    轉載請注明出處 m.tkk7.com/zhyiwww

    (copyright by @ zhangyi)

    ?

    ?

    如果你的 Web 系統使用了 Struts 系統,那么此系統在啟動的時候就會對此框架進行初始化。作為一個可以擴展的系統來說,它就會考慮其擴展性,和用戶自定義后的配置的初始化。在 web.xml 文件中,也就是 web 的配置文件中,我們可以知道,在系統啟動的時候,就會初始化此 Servlet, 其實, Struts 的初始化也就是在此實現的。

    那么在那里實現框架的初始化呢?

    Servlet 在啟動的時候就會執行一個叫 init() 的方法,當然是自動執行。所以, Struts 的初始化實現就是在這里實現的。

    那么,

    Struts 的初始化到底初始化了那些東西呢?

    要知道這個問題,我們就要大致的知道, Struts 系統的幾個模塊:

    [1]? Struts 框架內部資源模塊

    [2]? 用戶擴展的配置模塊

    [3]? 資源文件配置模塊

    [4]? 數據源配置模塊

    [5]? PlugIn 配置模塊

    這幾個部分在 init() 的里面是按照順序初始化的。

    ?

    在初始化的過程中, struts 并不是簡單的 來順序初始化,而是使用一定的模式和思想,包括功能的封裝。

    其中內部資源文件和用戶的擴展的初始化是獨立完成的。而其他的三個模塊并不是這樣的。 這三個模塊的初始化是由一個模塊來統一管理的,這個模塊就叫配置模塊。在Struts里面就是ModuleConfig.

    所以如果要初始化上面的三個模塊就先要初始化配置模塊。

    現在你可能要問, 配置模塊如何初始化?

    配置模塊的初始化也不是直接 new ModuleConfig() 就可以了,他的實現也是通過工廠模式來實現的。

    所以,要先初始化一個配置工廠才能實現此實例化。

    配置模塊的工廠是 ModuleConfigFactory, 這是一個抽象類。其 createFactory() 方法可以實現一個工廠的實例。

    在這還有一個挺特別的地方,在工廠初始化的時候,定義了工廠類的名字 :

    ??? protected static String factoryClass =

    ??????? "org.apache.struts.config.impl.DefaultModuleConfigFactory";

    ,所以就可以自己去實現實例化,這樣就有了很大的擴展性,為什么呢?因為我們可以根據需要去修改它,那么他就去實現了我們自己的類的實例。

    其實這也就是 struts 的配置工廠可以自己實現的原因。

    補充說明一點:

    前面提到的擴展初始化就是指的此擴展。至于其他的擴展,我們以后再說。

    ? 現在,我們已經得到了一個配置的工廠實例了,那么通過此工廠我們可以生產出來一個配置了。

    也就是我們得到一個 ModuleConfig 的實例了。

    ModuleConfig config = factoryObject.createModuleConfig(prefix);

    這個方法就可以實現了。

    不過,你應該知道上面的工廠是一個抽象方法,而其抽象類不時別的方法,正是此方法, 那么此方法到底是誰具體實現了呢?

    我們上面說了,其實工廠實例化化的時候,其實創建了一個

    org.apache.struts.config.impl.DefaultModuleConfigFactory

    的對象, 這個類實現了此方法?如何實現的呢?

    ??? public ModuleConfig createModuleConfig(String prefix) {

    ??????? return new ModuleConfigImpl(prefix);

    }

    他實例化了一個 ModuleConfigImpl ,此類正是接口 ModuleConfig 的實現類。

    ?

    到此也許你也明白一些其中的邏輯,我覺得這是一個很好的實現。現在我才明白,為什么我們要去定義和使用接口。

    你想,在你初始化工廠之前,你并不知道要使用哪一個ModuleConfig的實現類。但是你一旦確定了使用哪一個配置工廠,不管是默認的,還是你自己的實現,那么你就只能生成對應的實例。正是,那種工廠生產那種產品。正如生產手機的工廠不能生產電視一樣。

    如果你自己定義了工廠的實現的話,那么你就會去實例化一個你自定義的ModuleConfig 的實現類。

    這一部分,其實是我對工廠模式的一點理解。

    ?

    好了,至此,我們得到了一個 ModuleConfig 的實例。

    下面,就在此基礎上,去初始化其他的模塊,就是下面的代碼:

    ?? ?????????initModuleConfigFactory();

    ??????????? // Initialize modules as needed

    ??????????? ModuleConfig moduleConfig = initModuleConfig("", config);

    ??????????? initModuleMessageResources(moduleConfig);

    ??????????? initModuleDataSources(moduleConfig);

    ?? ?????????initModulePlugIns(moduleConfig);

    ?

    至于詳細的如何配置和實現,我們以后再說。

    這些配置完成之后, Struts 就要去讀取你的在 web.xml 的自定義的 struts 配置文件參數,然后通過循環來取得此文件,逐個解析。

    主要是多個 struts-config.xml 的配置文件。

    都要去解析,這其實也是 struts 的靈活擴展之一。

    代碼如下:

    Enumeration names = getServletConfig().getInitParameterNames();

    ??????????? while (names.hasMoreElements()) {

    ??????????????? String name = (String) names.nextElement();

    ??????????????? if (!name.startsWith("config/")) {

    ??????????????????? continue;

    ??????????????? }

    ??????????????? String prefix = name.substring(6);

    ??????????????? moduleConfig = initModuleConfig

    ??????????????????? (prefix, getServletConfig().getInitParameter(name));

    ??????????????? initModuleMessageResources(moduleConfig);

    ??????????????? initModuleDataSources(moduleConfig);

    ??????????????? initModulePlugIns(moduleConfig);

    ??????????????? moduleConfig.freeze();

    ??????????? }

    ?

    取得一個配置文件后,執行的過程和我們上面的初始化的過程是一樣的,因為任何一個配置文件都可能有這些相同模塊的配置。所以要逐個的初始化。

    從宏觀上來說, strtuts 的初始化就這些,但是,在詳細的實現過程中,還有很多的細節,留待我們慢慢的去研究、理解、深入。

    ?

    ?

    ?

    ?

    ?

    ?



    |----------------------------------------------------------------------------------------|
                               版權聲明  版權所有 @zhyiwww
                引用請注明來源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2007-01-23 17:40 zhyiwww 閱讀(2136) 評論(2)  編輯  收藏 所屬分類: j2ee

    FeedBack:
    # re: Struts源碼的切片學習(一)-Struts初始化[未登錄]
    2008-03-25 10:56 | yuyu
    hao hao hao !  回復  更多評論
      
    # http://chennai-java.blogspot.com/
    主站蜘蛛池模板: 国产福利电影一区二区三区,亚洲国模精品一区 | 中文字幕乱码亚洲精品一区 | 免费看无码特级毛片| 亚洲国产主播精品极品网红 | 成人av片无码免费天天看| 久久影视综合亚洲| 国产精品免费久久久久电影网| 亚洲国产主播精品极品网红| 久久九九久精品国产免费直播| 伊人久久大香线蕉亚洲 | 在线观看的免费网站| 国产成人精品日本亚洲11| 青青草免费在线视频| 亚洲精品女同中文字幕| 国产一卡二卡≡卡四卡免费乱码| 国产亚洲男人的天堂在线观看 | 亚洲第一成人影院| AAAAA级少妇高潮大片免费看| 亚洲国产无套无码av电影| 免费视频精品一区二区三区| 理论亚洲区美一区二区三区 | 日韩成人免费在线| 全部一级一级毛片免费看| 亚洲精品国产美女久久久| 182tv免费视视频线路一二三| 亚洲人配人种jizz| 免费人成年激情视频在线观看| 黄 色一级 成 人网站免费| 亚洲精品线在线观看| 女人被弄到高潮的免费视频| 免费一级毛片在线播放视频免费观看永久| 不卡精品国产_亚洲人成在线| 91热久久免费精品99| 亚洲变态另类一区二区三区| 日韩精品亚洲aⅴ在线影院| 69式互添免费视频| 午夜成人无码福利免费视频| 亚洲美女大bbbbbbbbb| 免费真实播放国产乱子伦| 99爱在线精品视频免费观看9| 亚洲乱码国产乱码精华|