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

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

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

    zhyiwww
    用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
    posts - 536,comments - 394,trackbacks - 0

    Struts 源碼的切片學(xué)習(xí)(五)

    -- 再談資源模塊的初始化


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

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

    Date ????????? :????? 2007-2-1

    轉(zhuǎn)載請注明出處 m.tkk7.com/zhyiwww

    (copyright by @ zhangyi)

    ?

    ?我以前已經(jīng)說過了, Struts 的資源配置是, ActionServlet. 通過
    ?

    ->init() 方法初始化

    -> 配置模塊(初始化系統(tǒng)的配置)

    -> 通過配置模塊取得資源的配置

    -> 資源模塊的初始化。

    ?
    這是一個宏觀的過程。整體的思路是這樣的。那么,我們現(xiàn)在的疑問是:

    資源模塊初始化的時候要先取得配置,那么配置從何而來 ?

    ?

    ModuleConfig config

    MessageResourcesConfig mrcs[] = config.findMessageResourcesConfigs();

    通過這個語句,我們可以知道,其配置參數(shù)要通過 ModuleConfig 而來。

    ?

    那么我們就要看一下, MessageResourcesConfig 參數(shù)的數(shù)組是如何初始化的呢?

    findMessageResourcesConfigs ()方法里面僅僅是完成了 ModuleConfig 中的一個一個 HashMap 實(shí)例的轉(zhuǎn)換,變成了一個數(shù)組。

    那么我們還要知道, 到底這個 HashMap 是怎么樣初始化的,在什么時候初始化的 ?

    其實(shí)這個我們已經(jīng)找到了 ModuleConfig 的一個實(shí)現(xiàn)上來了,也就 ModuleConfigImpl

    到這個地方就終止了。因?yàn)樵?/span> ModuleConfigImpl 里面就沒有關(guān)于初始化里面的屬性的部分。那么到底在什么地方,什么時候,系統(tǒng)給與其初始化了呢?

    這說明,在調(diào)用之前,系統(tǒng)一定已經(jīng)給與了初始化了。所以,我們在看 ActionServlet 的初始化模塊配置的部分。

    看一下其配置模塊部分是如何進(jìn)行初始化的。

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

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

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

    現(xiàn)在我們就找到了這兩個語句。

    上面的就是初始化工廠的,下面語句就是我們漏掉的部分,也就是在這里面,偷偷的進(jìn)行了系統(tǒng)的配置部分的初始化,也正是在這個部分,完成了所有的配置文件的解析和實(shí)例化。其利用的就是 Digester.

    這一句,執(zhí)行結(jié)果的表面就是返回了一個 ModuleConfig 的實(shí)例 , 其實(shí)是 ModuleConfigImpl 的一個實(shí)例。

    那么,我們就去看一下,里面究竟做了些什么?

    ??????? 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);

    ?

    上面的一段代碼,看上去也沒有什么特別的,但是,在后面卻是做了不少的工作。

    ?

    其實(shí),從上到下,我們可以這樣理解:

    ü??????? 先實(shí)例化一個解析器

    ü??????? 然后把配置文件放入棧里面,等待解析

    ü??????? 解析配置文件

    ?

    其實(shí),也確實(shí)沒有什么特別的地方,但是在初始化解析器的時候,我們要告訴他,到底要怎么樣去解析,解析成什么對象的實(shí)例。這個部分其實(shí)才是核心的部分。

    那么,到底他是怎么樣去初始化解析器的呢?

    我們看一下 initConfigDigester ()是如何實(shí)現(xiàn)的。

    ??????? // Create a new Digester instance with standard capabilities

    ??????? configDigester = new Digester();

    ??????? configDigester.setNamespaceAware(true);

    ??????? configDigester.setValidating(this.isValidating());

    ??????? configDigester.setUseContextClassLoader(true);

    ??????? configDigester.addRuleSet(new ConfigRuleSet());

    ?

    ??????? for (int i = 0; i < registrations.length; i += 2) {

    ??????????? URL url = this.getClass().getResource(registrations[i+1]);

    ??????????? if (url != null) {

    ??????????????? configDigester.register(registrations[i], url.toString());

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

    ??????? }

    ?

    ??????? this.addRuleSets();

    ?

    這一段代碼就實(shí)現(xiàn)了上面的初始化和實(shí)例化的功能,當(dāng)然是解析配置文件 xml 文件后的結(jié)果。

    這個地方我們可以看到,

    ? configDigester.addRuleSet(new ConfigRuleSet());

    定義了解析的規(guī)則,

    其實(shí)這個規(guī)則是由 ConfigRuleSet 制定的。

    ConfigRuleSet 里面,告訴了解析把每一個標(biāo)簽元素解析成什么樣的對象。

    ?

    ??????? digester.addObjectCreate

    ??????????? ("struts-config/data-sources/data-source",

    ???????????? "org.apache.struts.config.DataSourceConfig",

    ???????????? "className");

    ??????? digester.addSetProperties

    ??????????? ("struts-config/data-sources/data-source");

    ??????? digester.addSetNext

    ??????????? ("struts-config/data-sources/data-source",

    ???????????? "addDataSourceConfig",

    ???????????? "org.apache.struts.config.DataSourceConfig");

    ??? …………………………………

    ????????????? 還有很多,但是都是實(shí)現(xiàn)一樣的功能和目的。

    這樣我們就知道了,通過這個過程之后,我們就把配置文件 struts-config.xml 或者你自己的配置的文件中的配置解析到了對象中。

    具體到消息資源模塊的部分就是:

    ?? digester.addObjectCreate

    ??????????? ( "struts-config/message-resources" ,

    ???????????? "org.apache.struts.config.MessageResourcesConfig" ,

    ???????????? "className" );

    ??????? digester.addSetProperties

    ??????????? ( "struts-config/message-resources" );

    ??????? digester.addSetNext

    ??????????? ( "struts-config/message-resources" ,

    ???????????? "addMessageResourcesConfig" ,

    ???????????? "org.apache.struts.config.MessageResourcesConfig" );

    ?

    ? ??????digester.addSetProperty

    ??????????? ( "struts-config/message-resources/set-property" ,

    ???????????? "property" , "value" );

    這一段代碼告訴我們把消息資源的配置的部分放到了 org.apache.struts.config.MessageResourcesConfig 對象的對應(yīng)屬性里面了。

    所以,我們才可以從上面的部分直接去的其配置數(shù)組。

    至于后面的消息資源模塊的初始化的其他細(xì)節(jié),在此不在詳細(xì)說明了。



    |----------------------------------------------------------------------------------------|
                               版權(quán)聲明  版權(quán)所有 @zhyiwww
                引用請注明來源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2007-02-01 17:32 zhyiwww 閱讀(1777) 評論(0)  編輯  收藏 所屬分類: j2ee
    主站蜘蛛池模板: 无码人妻精品中文字幕免费东京热| 亚洲av永久无码精品天堂久久| 亚洲国产精品一区二区第四页| 四虎成人免费大片在线| 免费观看AV片在线播放| 性xxxxx免费视频播放| 免费精品国产自产拍在| 免费精品国偷自产在线在线| 中字幕视频在线永久在线观看免费| 亚洲高清免费在线观看| 无码国产精品一区二区免费式直播| 免费国产作爱视频网站| 性感美女视频在线观看免费精品| 成人免费淫片在线费观看| 免费黄色一级毛片| 婷婷综合缴情亚洲狠狠尤物| 奇米影视亚洲春色| 亚洲成AV人片在线播放无码| 久久精品国产亚洲精品2020| 亚洲乱码日产精品BD在线观看| 一本色道久久88—综合亚洲精品 | 亚洲国产人成精品| 亚洲中文字幕不卡无码| 国产精一品亚洲二区在线播放| 亚洲美女视频免费| 亚洲偷自精品三十六区| WWW国产亚洲精品久久麻豆| 免费无码一区二区| 久久午夜免费鲁丝片| 亚洲精品动漫免费二区| 免费女人18毛片a级毛片视频| 国产成人亚洲综合无码| 亚洲AV无码成人精品区天堂 | 国产精品亚洲成在人线| 亚洲成人午夜电影| 亚洲AV无码精品国产成人| 国产精品成人免费观看| 91九色老熟女免费资源站| 麻豆精品国产免费观看| 国产午夜亚洲精品午夜鲁丝片| 日产亚洲一区二区三区|