乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      竹筍炒肉: Digester學(xué)習(xí)筆記(一)

       shaobin0604@163.com 2007-01-22

      Digester學(xué)習(xí)筆記(一)

        在windows下開發(fā)程序,用M$提供的接口處理.ini文件或管理注冊表的鍵值是非常方便的。在java平臺上開發(fā)程序,則習(xí)慣于以xml格式的文件來存放系統(tǒng)的配置信息,對這種文件的解析和處理,可以用sax或dom。有沒有更簡便的方法呢?有,就是用digester模塊。
        Digester是Jakarta 子項目Commons下的一個模塊,支持基于規(guī)則的對任意XML文檔的處理。它最初是Structs項目的一部分,后因其通用性而劃歸Commons.

      下載及編譯

      cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
      password: anoncvs
      cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/digester
      cd jakarta-commons/digester
      ant dist

        Digester的運行依賴下列包:
      1. 一個遵循Jaxp(1.1版本及以后)的XML解析器
      2. Jakarta commons beanutils包(1.5版本及以后)
      3. Jakarta commons collections包(2.1版本及以后)
      4. Jakarta commons logging包(1.0.2版本及以后)
       

      一個簡單的例子

        假定有兩個JavaBean如下,分別為Foo和Bar
      package mypackage;
      public class Foo {
        public void addBar(Bar bar);
        public Bar findBar(int id);
        public Iterator getBars();
        public String getName();
        public void setName(String name);
      }
      public mypackage;
      public class Bar {
        public int getId();
        public void setId(int id);
        public String getTitle();
        public void setTitle(String title);
      }

        用下面的xml文件進行配置
      <foo name="The Parent">
        <bar id="123" title="The First Child"/>
        <bar id="456" title="The Second Child"/>
      </foo>

        用下面幾行代碼即可完成配置文件解析工作:
      Digest解析代碼 注釋
      Digester digester = new Digester();
      digester.setValidating(false); 不進行XML與相應(yīng)的DTD的合法性驗證
      digester.addObjectCreate("foo", "mypackage.Foo"); 當(dāng)遇到<foo>時創(chuàng)建一個mypackage.Foo對象,并將其放在棧頂
      digester.addSetProperties("foo"); 根據(jù)<foo>元素的屬性(attribute),對剛創(chuàng)建的Foo對象的屬性(property)進行設(shè)置
      digester.addObjectCreate("foo/bar", "mypackage.Bar"); 當(dāng)遇到<foo>的子元素<bar>時創(chuàng)建一個mypackage.Bar對象,并將其放在棧頂。
      digester.addSetProperties("foo/bar"); 根據(jù)<bar>元素的屬性(attribute),對剛創(chuàng)建的Bar對象的屬性(property)進行設(shè)置
      digester.addSetNext("foo/bar", "addBar", "mypackage.Bar"); 當(dāng)再次遇到<foo>的子元素<bar>時創(chuàng)建一個mypackage.Bar對象,并將其放在棧頂,同時調(diào)用第二棧頂元素(Foo對象)的addBar方法。
      Foo foo = (Foo) digester.parse(); 分析結(jié)束后,返回根元素。

      基本情況

        熟悉用SAX來處理XML文檔的程序員,會發(fā)現(xiàn)Digester隱藏了遍歷XML元素這些細(xì)節(jié),而是提供了更高一層的、更友好的SAX事件接口,從而讓程序員的精力放在對數(shù)據(jù)的處理過程中。
        使用Digester,須按照以下步驟:
      1. 創(chuàng)建一個org.apache.commons.digester.Digester實例。一個解析請求完成后,這個Digester可以被后面復(fù)用。但也不要試圖在不同的線程中從共享一個Digester實例。
      2. 根據(jù)需要設(shè)置一些配置屬性(configuration properties),以控制下一步的解析操作。
      3. 將一個或幾個初始對象(initial object)壓入Digester對象棧,本步驟不是必須的。
      4. 注冊所有的元素匹配模板(elemet matching pattern)。當(dāng)一個模板被從輸入文檔中識別出來以后,與其相聯(lián)系的處理規(guī)則(processing rules)被激活。對一個特定的模板,可以定義任意多的規(guī)則,當(dāng)識別出該模板后,這些規(guī)則依序依次執(zhí)行。
      5. 調(diào)用digester.parse()方法,一個XML文檔的引用(用多種方式供選擇)要傳給這個方法。注意,需要捕捉并處理IOException或SAXEception或處理過程中拋出的異常。

      元素匹配模板

        Digester能自動遍歷目標(biāo)XML文檔的元素形成的層次結(jié)構(gòu),這個過程無需程序員參與。程序員的任務(wù)是決定,在解析的過程中,當(dāng)由嵌套的元素形成的一個特定序列被識別出時,如何處理它。用以描述這種序列的機制,就叫“元素匹配模板”。
        具體說來,元素和其子元素間,用”/”相隔,如果一些元素前沒有”/”則其必為根元素。如例:
      <a>         -- 匹配模板 "a"
        <b>       -- 匹配模板 "a/b"
          <c/>    -- 匹配模板 "a/b/c"
          <c/>    -- 匹配模板 "a/b/c"
        </b>
        <b>       -- 匹配模板 "a/b"
          <c/>    -- 匹配模板 "a/b/c"
          <c/>    -- 匹配模板 "a/b/c"
          <c/>    -- 匹配模板 "a/b/c"
        </b>
      </a>

        字符”*”表示任意級別,如”*/a”表示任意級別的<a>都可匹配(不包括根元素級的).熟悉XLST的朋友,對這種思路一定不陌生。
        從上面的描述,可知某個元素同時滿足多個匹配模板是非??赡艿?,在這種情況下,與各個模板相關(guān)聯(lián)的處理規(guī)則(processing rule)的執(zhí)行順序如下:對begin或body方法,按照各個rule的注冊順序的先后,對end方法則是注冊順序的反序。

      處理規(guī)則(processing rule)

        元素匹配模板用以識別什么時候采取行動,處理規(guī)則則用以定義行動的內(nèi)容。
        從形式上講,一個處理規(guī)則是一個java類,它擴展了org.apache.commons.digester.Rule類。每個處理規(guī)則,實現(xiàn)下列的一個或幾個事件處理方法(event method),當(dāng)相應(yīng)的模板匹配成功以后,在已定義的某個時刻,這些事件方法會被觸發(fā)。
      1. begin(),在一個匹配元素被識別出后的“開始”時刻被調(diào)用,這個元素的所有屬性放在一個數(shù)據(jù)結(jié)構(gòu)中被傳遞給begin()
      2. body(),當(dāng)元素的嵌套內(nèi)容(如子元素)被識別出時被調(diào)用。在解析的過程中,前后的空白被去掉了
      3. end(),匹配元素的“結(jié)束”時刻被調(diào)用。如果子元素也匹配相關(guān)的規(guī)則,則這些規(guī)則的方法需都執(zhí)行畢,才能達(dá)到該元素的“結(jié)束”時刻。
      4. finish(),解析結(jié)束時被調(diào)用,以提供給各個規(guī)則以清理臨時數(shù)據(jù)的機會。

        在設(shè)置digester時,通過調(diào)用addRule()方法,來注冊一個特定的元素匹配模板以及相應(yīng)的一個Rule類的實例。如上所述,Rule類中的事件處理方法,會在適當(dāng)?shù)臅r間被調(diào)用。這個機制,允許動態(tài)地生成Rule的實現(xiàn)。
        另外,digester也提供了一些處理常見情況的處理規(guī)則類。
      1. ObjectCreateRule,當(dāng)begin()方法被調(diào)用時,這個規(guī)則類實例化一個指定的java類,并將其壓入棧頂。這個被實例化的類的名字,默認(rèn)是這個規(guī)則類構(gòu)造函數(shù)得到的參數(shù),也可以通過指定正在處理的xml元素的屬性來傳遞一個新的類的名字。當(dāng)end()方法被調(diào)用 時,棧頂?shù)膶ο蟊粡棾?,Digester中對它的任何引用將被忽略。
      2. FactoryCreateRule,一個非常有用的ObjectCreateRule的變體。
      3. SetPropertiesRule,當(dāng)begin()方法被調(diào)用時,digester使用標(biāo)準(zhǔn)的Java Relection API來識別JavaBean的屬性設(shè)置方法(setter method),這些方法名稱中包含屬性(property)的名字,這些屬性與XML元素的屬性(attribute)匹配,于是這些方法被調(diào)用并將相應(yīng)的屬性值(attribute value)傳給它們。這些自然的映射可以被重寫。建議不要過度使用這項功能,在大多數(shù)情況下,使用標(biāo)準(zhǔn)的BeanInfo機制會更好。
      4. SetPropertyRule,當(dāng)begin()方法被調(diào)用時,digester調(diào)用棧頂對象的一個特定的屬性設(shè)置方法(property setter)并傳給它特定的值(property和值分別由兩個attribute命名)。這對XML需要遵循一個指定的DTD時比較有用,你可以設(shè)置一個特別的屬性(property),雖然在指定DTD沒有attribute與其相對應(yīng)。
      5. SetNextRule,當(dāng)end()方法被調(diào)用時,digester分析第二棧頂元素,尋找一個特定屬性(property)的設(shè)置方法(setter method),并接著調(diào)用這個方法,以棧頂?shù)脑刈鲄?shù)。這個規(guī)則通常用來在兩個對象間建立1對多的關(guān)系,所用的方法也常被叫做addChild什么的。
      6. SetTopRule,當(dāng)end()方法被調(diào)用時,digester分析棧頂元素,尋找一個特定屬性(property)的設(shè)置方法(setter method),并接著調(diào)用這個方法,以第二棧頂?shù)脑刈鲄?shù)。這個規(guī)則通常用來在兩個對象間建立1對多的關(guān)系,所用的方法也常被叫做setParent什么的。
      7. CallMethodRule,這個規(guī)則設(shè)置當(dāng)end()被調(diào)用時執(zhí)行的棧頂對象的自定義方法,通過對這個規(guī)則的設(shè)置,來指定方法的名字、參數(shù)的數(shù)量以及定義的參數(shù)類型的Java類的名字。實際的參數(shù)值,來自激活這個方法的元素的子元素。
      8. CallParamRule,這個規(guī)則用來指定CallMethodRule的參數(shù)的值的來源,它可以來自一個特定的屬性,或子元素的body的內(nèi)容.
      9. NodeCreateRule,一個特殊的規(guī)則,將對象樹的一部分轉(zhuǎn)換成一個DOM結(jié)點(Node),并壓入棧頂。

        對這些標(biāo)準(zhǔn)的規(guī)則類,可以創(chuàng)建它們的實例,并調(diào)用digester.addRule來注冊它們。由于經(jīng)常使用它們,所以digester定義了一些簡便的方法來注冊它們。如:
      Rule rule = new SetNextRule(digester, "addChild","com.mycompany.mypackage.MyChildClass");
      digester.addRule("a/b/c", rule);
      可以用下列代碼替換
      digester.addSetNext("a/b/c", "addChild", "com.mycompany.mypackage.MyChildClass");

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多