kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評論 :: 0 Trackbacks
          http://www.infomall.cn/cgi-bin/mallgate/20040310/http://hedong.3322.org/archives/000337.html
          總覺得,Digester不僅僅能作配置文件解析,而且可以作得更多。

          配置屬性

            Digester用來解析應(yīng)用系統(tǒng)的配置文件,其本身也有很可配置的屬性。
          屬性 描述
          classLoader 指定類裝載器(class loader)。ObjectCreateRule 和 FactoryCreateRule兩個規(guī)則中,需要動態(tài)加載一些類(如那些盛放XML解析出來的數(shù)據(jù)的javaBean等),裝載器可以在次指定。如果不指定,對這此類的加載將會利用線程上下文中的加載器(當useContextClassLoader值為真時)或利用加載Digester的那個加載器。
          errorHandler 指定 SAX ErrorHandler,以在出現(xiàn)此類錯誤時調(diào)用。默認情況下,任何解析錯誤都會被記入日志,Digest會繼續(xù)進行解析。
          namespaceAware 一個布爾值,為真時對XML文件的解析時會考慮元素的域名空間(如不同的域名空間的同名元素會視為不同的元素)
          ruleNamespaceURI 指定后續(xù)加入的規(guī)則所屬的命名空間,如果此值為null,則加入的規(guī)則不與任何命名空間相聯(lián)系。
          rules 設(shè)定規(guī)則模板與XML元素的匹配處理程序。由于這個匹配程序是插件式的,所以匹配工作的完成可以用用戶定義的匹配程序未完成。默認情況下,使用Digester提供的匹配器。
          useContextClassLoader 一個布爾值,為真時FactoryCreateRule 和 ObjectCreateRule 兩個規(guī)則中對類的裝載將會采用當前線程上下文中指定的加載器。默認情況下,對類的動態(tài)加載會利用加載Digester的那個裝載器。
          validating 一個布爾值,為真時解析器會根據(jù)DTD內(nèi)容對XML文檔進行合法性檢查,默認值是假,解析器只是檢查XML是否格式良好(well formed).

            除了上述屬性外,還可以注冊一個本地DTD,以供DOCTYPE聲明引用。這樣的注冊告訴XML解析器,當遇到DOCTYPE聲明時,應(yīng)使用剛注冊的DTD的內(nèi)容,而不是DOCTYPE聲明中的標識符(identifier)。
            例如,Struect框架控制器中,使用下述的注冊,告訴Structs使用一個本地的DTD中的相關(guān)內(nèi)容來處理Structs配置文件,這樣可以適用于那些沒有連接到互聯(lián)網(wǎng)的應(yīng)用環(huán)境,而在連到互聯(lián)網(wǎng)的環(huán)境中可以加快運行速度(因為它避免了通過網(wǎng)絡(luò)去取相關(guān)的資源)。
          URL url = new URL("/org/apache/struts/resources/struts-config_1_0.dtd");
          digester.register("-//Apache Software Foundation//DTD Struts Configuration 1.0//EN",url.toString());

          規(guī)則集打包


            通常情況下,一個規(guī)則被創(chuàng)建后,接著便注冊,然后等在event時被調(diào)用,這些規(guī)則集很難為其它應(yīng)用程序直接復(fù)用。一個解決方法是將所有規(guī)則都放在一個類中,此由這些規(guī)則可以很簡單地被裝載然后被注冊使用。RuleSet接口就是為些而設(shè)計,一般是通過擴展RuleSetBase類來開發(fā)規(guī)則集類。如例:
          public class MyRuleSet extends RuleSetBase {
            public MyRuleSet() {
              this("");
            }
            public MyRuleSet(String prefix) {
              super();
              this.prefix = prefix;
              this.namespaceURI = "http://www.mycompany.com/MyNamespace";
            }
            protected String prefix = null;
            public void addRuleInstances(Digester digester) {
              digester.addObjectCreate(prefix + "foo/bar",
                "com.mycompany.MyFoo");
              digester.addSetProperties(prefix + "foo/bar");
            }
          }
          可以這樣使用這個規(guī)則集
          Digester digester = new Digester();
          ... 一些配置Digester ...
          digester.addRuleSet(new MyRuleSet("baz/"));

          帶命名空間的XML解析


            這種情況下,使用Digester的步驟為:
          1. 在Digester初始化部分,指明要考慮命名空間。
            digester.setNamespaceAware(true);

          2. 指明一些規(guī)則的命名空間,如
            digester.setRuleNamespaceURI("http://www.mycompany.com/MyNamespace");

          3. 接下來定義一些與此命名空間有關(guān)的規(guī)則,此時可以省卻前綴,如
            digester.addObjectCreate("foo/bar", "com.mycompany.MyFoo");
            digester.addSetProperties("foo/bar");

          4. 對其它命名空間,重復(fù)前面的2步

            另外,在指明要digester考慮命名空間之后,在定義匹配模板時,可以將命名空間別名加“:”作為元素名稱的一部分使用。這與無命名空間時是一致的。

          開發(fā)定制的匹配處理過程


            通過實現(xiàn) org.apache.commons.digester.Rules接口或擴展org.apache.commons.digester.RulesBase類來達到定制匹配過程的目的。
            Digester提供ExtendedBaseRules來擴展了匹配模板的定義,引入了特殊通配字符?和*以及!,提供RegexRules來支持以正則式的語法定義匹配模板,提供WithDefaultsRulesWrapper來支持默認規(guī)則(即其它規(guī)則都不匹配時的處理規(guī)則)。

          一些認識


            通過看說明材料,尤其在學(xué)習(xí)Digester包中的Catalog例子以后,有一些認識:
            1、由于xml對屬性名字的定義要求,與Java中對方法名字的定義要求不一致,導(dǎo)致出現(xiàn)不能自動映射的情況,如year-made標簽屬性,就不可能有方法setYear-made;
            2、對于根元素,與其子元素建立聯(lián)系,有幾種辦法:一種是先生成根元素實例,壓入棧,然后解析,將調(diào)用方法規(guī)則建立聯(lián)系;另一種是解析的過程中第一個創(chuàng)建它,然后用getRoot的方法得到。
            3、如果某對象類構(gòu)造都要參數(shù),則此時需要擴展AbstractObjectCreationFactory類為這種對象建立一個Factory,在這個Factory中取得初始化參數(shù)值然后再創(chuàng)建一個對象實例。
            4、設(shè)有某個標簽,要想自動用該標簽子元素的內(nèi)容填充該標簽對應(yīng)的對象的屬性,則需要用digester.setRules(new ExtendedBaseRules()),然后addRules(),然后再調(diào)用addBeanPropertySetter("bala/lala/?");進行規(guī)則定義,注意此模板中有通配符。
            5、如果對象的屬性是整型,則Digester自動將xml文件中字符串值轉(zhuǎn)換為整型。
            6、在指明要digester考慮命名空間之后,如果不會引起歧義,完全可以忽略命名空間的存在,除非你要針對特定的命名空間進行特定的處理。
          posted on 2005-04-14 18:07 笨笨 閱讀(595) 評論(0)  編輯  收藏 所屬分類: J2EEHibernateAndSpringALLStruts
          主站蜘蛛池模板: 保靖县| 望奎县| 东莞市| 河池市| 宜春市| 黄大仙区| 永城市| 渝中区| 化隆| 綦江县| 普安县| 广德县| 五大连池市| 沈丘县| 神池县| 鹤庆县| 仙桃市| 嘉定区| 文化| 龙里县| 肥东县| 惠水县| 旌德县| 盐亭县| 香河县| 郓城县| 河池市| 申扎县| 清水河县| 滁州市| 巨野县| 吉首市| 德格县| 宁陕县| 子长县| 随州市| 洞头县| 无极县| 永寿县| 蒙城县| 利辛县|