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

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

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

    posts - 27,  comments - 37,  trackbacks - 0
    在windows下開發程序,用M$提供的接口處理.ini文件或管理注冊表的鍵值是非常方便的。在java平臺上開發程序,則習慣于以xml格式 的文件來存放系統的配置信息,對這種文件的解析和處理,可以用sax或dom。有沒有更簡便的方法呢?有,就是用digester模塊。
    Digester是Jakarta 子項目Commons下的一個模塊,支持基于規則的對任意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與相應的DTD的合法性驗證
    digester.addObjectCreate("foo", "mypackage.Foo"); 當遇到<foo>時創建一個mypackage.Foo對象,并將其放在棧頂
    digester.addSetProperties("foo"); 根據<foo>元素的屬性(attribute),對剛創建的Foo對象的屬性(property)進行設置
    digester.addObjectCreate("foo/bar", "mypackage.Bar"); 當遇到<foo>的子元素<bar>時創建一個mypackage.Bar對象,并將其放在棧頂。
    digester.addSetProperties("foo/bar"); 根據<bar>元素的屬性(attribute),對剛創建的Bar對象的屬性(property)進行設置
    digester.addSetNext("foo/bar", "addBar", "mypackage.Bar"); 當再次遇到<foo>的子元素<bar>時創建一個mypackage.Bar對象,并將其放在棧頂,同時調用第二棧頂元素(Foo對象)的addBar方法。
    Foo foo = (Foo) digester.parse(); 分析結束后,返回根元素。

    基本情況

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

    元素匹配模板

    Digester能自動遍歷目標XML文檔的元素形成的層次結構,這個過程無需程序員參與。程序員的任務是決定,在解析的過程中,當由嵌套的元素形成的一個特定序列被識別出時,如何處理它。用以描述這種序列的機制,就叫“元素匹配模板”。
    具體說來,元素和其子元素間,用”/”相隔,如果一些元素前沒有”/”則其必為根元素。如例:
    <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的朋友,對這種思路一定不陌生。
    從上面的描述,可知某個元素同時滿足多個匹配模板是非常可能的,在這種情況下,與各個模板相關聯的處理規則(processing rule)的執行順序如下:對begin或body方法,按照各個rule的注冊順序的先后,對end方法則是注冊順序的反序。

    處理規則(processing rule)

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

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

    對這些標準的規則類,可以創建它們的實例,并調用digester.addRule來注冊它們。由于經常使用它們,所以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");


    原文章鏈接: 竹筍炒肉



     小時候家的對面有一座山,山的上面就是藍天,所以總是幻想著有一天站到山頂用手摸一下藍天……
    posted on 2007-11-04 16:34 丫丫 閱讀(251) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2007年11月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    常用鏈接

    留言簿(1)

    隨筆分類(25)

    隨筆檔案(27)

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久国产乱子精品免费女| 免费的黄网站男人的天堂 | 亚洲av无码国产精品色午夜字幕 | 一级毛片完整版免费播放一区| 日韩免费视频一区| 亚洲精品无码国产片| 国产精品久久香蕉免费播放| 青草久久精品亚洲综合专区| 国产美女无遮挡免费网站| 风间由美在线亚洲一区| 亚洲裸男gv网站| 国产精品免费看久久久香蕉| 亚洲日韩精品A∨片无码| 国产成人免费AV在线播放 | 国产自产拍精品视频免费看| 国产精品久久亚洲一区二区| 免费在线黄色网址| xxxxx做受大片在线观看免费| 亚洲精品国产精品乱码不99| 久久美女网站免费| 亚洲六月丁香六月婷婷色伊人 | 精品国产亚洲一区二区三区在线观看 | 国产成人无码免费看视频软件| 亚洲中文字幕一区精品自拍| 成在线人永久免费视频播放| caoporn国产精品免费| 亚洲首页在线观看| 在线观看免费为成年视频| 国产免费黄色无码视频| 666精品国产精品亚洲| 性xxxx视频播放免费| 一区二区三区免费看| 亚洲精品自在线拍| 日本免费的一级v一片| 成在线人视频免费视频| 亚洲国产成人精品电影| 亚洲国产精品碰碰| 在线日本高清免费不卡| 国产99久久亚洲综合精品| 亚洲视频在线播放| 免费人成无码大片在线观看|