小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Commons-Digester簡(jiǎn)介

 iversion 2007-08-16

Digester本來(lái)僅僅是Jakarta Struts中的一個(gè)工具,用于處理struts-config.xml配置文件。顯然,將XML文件轉(zhuǎn)換成相應(yīng)的Java對(duì)象是一項(xiàng)很通用的功能,這個(gè)工具理應(yīng)具有更廣泛的用途,所以很快它就在Jakarta Commons項(xiàng)目(用于提供可重用的Java組件庫(kù))中有了一席之地。

簡(jiǎn)言之,Digester由"事件"驅(qū)動(dòng),通過(guò)調(diào)用預(yù)定義的規(guī)則操作對(duì)象棧,將XML文件轉(zhuǎn)換為Java對(duì)象。工作原理如下:

Digester底層采用SAX解析XML文件,所以很自然的,對(duì)象轉(zhuǎn)換由"事件"驅(qū)動(dòng),即在識(shí)別出特定XML元素時(shí)(實(shí)際被細(xì)分為begin、body、end、finish四個(gè)時(shí)點(diǎn)),將執(zhí)行特定的動(dòng)作,比如創(chuàng)建特定的Java對(duì)象,或調(diào)用特定對(duì)象的方法等。此處的XML元素根據(jù)匹配模式(matching pattern)識(shí)別,而相關(guān)操作由規(guī)則(rule)定義。在轉(zhuǎn)換過(guò)程中,Digester維持了一個(gè)對(duì)象棧,可以看作對(duì)象轉(zhuǎn)換的工作臺(tái),用來(lái)存放轉(zhuǎn)換中生成的、或是為轉(zhuǎn)換臨時(shí)創(chuàng)建的Java對(duì)象。對(duì)輸入XML文件作了一趟完整的掃描后,對(duì)象棧的棧頂元素即為目標(biāo)對(duì)象。由于Digester屏蔽了SAX解析的細(xì)節(jié),使用者僅需關(guān)注轉(zhuǎn)換操作本身,大大簡(jiǎn)化了轉(zhuǎn)換操作。

對(duì)使用者而言,Digester的核心在于匹配模式與規(guī)則(matching pattern + rule)。

匹配規(guī)則示例如下:
  <a>         -- Matches pattern "a"
    <b>       -- Matches pattern "a/b"
      <c/>    -- Matches pattern "a/b/c"
      <c/>    -- Matches pattern "a/b/c"
    </b>
    <b>       -- Matches pattern "a/b"
      <c/>    -- Matches pattern "a/b/c"
      <c/>    -- Matches pattern "a/b/c"
      <c/>    -- Matches pattern "a/b/c"
    </b>
  </a>

Digester提供了一些編程中經(jīng)常用到的規(guī)則(rule),以下五類九個(gè)rule較為常用:

A:對(duì)象創(chuàng)建
1.ObjectCreateRule  當(dāng)begin()方法被調(diào)用時(shí), 此rule創(chuàng)建相應(yīng)Java對(duì)象, 并將其push到Digester的對(duì)象棧上。當(dāng)end()方法被調(diào)用時(shí), 棧頂對(duì)象將被pop, Digester內(nèi)所有對(duì)該對(duì)象的引用都將失效。
2.FactoryCreateRule    創(chuàng)建Java對(duì)象的另一種選擇。當(dāng)待創(chuàng)建的Java對(duì)象沒(méi)有無(wú)參構(gòu)造函數(shù),或需要在創(chuàng)建時(shí)需要進(jìn)行額外的設(shè)置時(shí),需要用此rule。

B:屬性設(shè)置
3.SetPropertiesRule    當(dāng)begin()方法被調(diào)用時(shí), Digester使用標(biāo)準(zhǔn)的Java反射API,將棧頂對(duì)象的屬性設(shè)置為XML元素的同名屬性值。
4.SetPropertyRule    當(dāng)begin()方法被調(diào)用時(shí), Digester調(diào)用棧頂對(duì)象某指定屬性的設(shè)置方法,設(shè)置其值。

C:父子關(guān)系管理
5.SetNextRule    當(dāng)end()方法被調(diào)用時(shí), Digester將棧頂元素設(shè)置進(jìn)次棧頂元素中(調(diào)用相應(yīng)的設(shè)置方法)。
6.SetTopRule    當(dāng)end()方法被調(diào)用時(shí), Digester將次棧頂元素設(shè)置進(jìn)棧頂元素中(調(diào)用相應(yīng)的設(shè)置方法)。

D:任意方法調(diào)用
7.CallMethodRule    當(dāng)end()方法被調(diào)用時(shí), Digester將調(diào)用棧頂元素指定名稱的方法。除了方法名外,此rule還需要配置參數(shù)數(shù)目,參數(shù)類型。參數(shù)值一般通過(guò)CallParamRule得到。
8.CallParamRule    此rule內(nèi)嵌于CallParamRule中,按順序(相對(duì)于0)定義了CallParamRule中參數(shù)值的來(lái)源,可選的來(lái)源包括當(dāng)前XML元素的屬性或內(nèi)容。

E:其它
9.NodeCreateRule    將XML文件樹(shù)的一部分轉(zhuǎn)換為DOM節(jié)點(diǎn),并push到Digester的對(duì)象棧上。

在基本使用中,使用者通過(guò)調(diào)用Digester類的相關(guān)方法,來(lái)創(chuàng)建匹配模式與規(guī)則的映射序列。比如,調(diào)用addSetProperties(String pattern),向Digester中加入SetPropertiesRule。

基本步驟如下:
1.創(chuàng)建Digester對(duì)象實(shí)例。
2.設(shè)置該Digester對(duì)象的配置屬性(可選)。
3.將需要的初始對(duì)象push到該Digester對(duì)象的對(duì)象棧上(可選)。
4.需要注冊(cè)所有的XML元素匹配模式與處理規(guī)則之間的映射關(guān)系。
5.用digester.parse()解析的XML文檔對(duì)象,得到目標(biāo)對(duì)象。

下面是一個(gè)簡(jiǎn)單示例:
1.foo.xml  數(shù)據(jù)源文件
2.Foo.java  目標(biāo)Java對(duì)象
3.Bar.java  目標(biāo)Java對(duì)象
4.Entry.java  調(diào)用Digester的入口類

【foo.xml】
<?xml version="1.0" encoding="GBK"?>
<foo name="The Parent">
    <bar id="123" title="The First Child"/>
    <bar id="456" title="The Second Child"/>
</foo>

【Foo.java】
package org.easev.digester;

import java.util.HashMap;
import java.util.Iterator;

public class Foo {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    private HashMap bars = new HashMap();

    public void addBar(Bar bar) {
        bars.put(String.valueOf(bar.getId()), bar);
    }

    public Bar findBar(int id) {
        return (Bar) bars.get(String.valueOf(id));
    }

    public Iterator getBars() {
        return bars.keySet().iterator();
    }
}

【Bar.java】
package org.easev.digester;

public class Bar {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    private String title;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

【Entry.java】
package org.easev.digester;

import java.io.File;
import java.util.Iterator;

import org.apache.commons.digester.Digester;

public class Entry {

    public static void main(String[] args) throws Exception {
        //相對(duì)路徑定義與包名相關(guān)
        File input = new File("org/easev/digester/foo.xml");
        Digester digester = new Digester();
        digester.setValidating(false);

        //完整類名定義,包名改變時(shí)需做相應(yīng)變化
        digester.addObjectCreate("foo", "org.easev.digester.Foo");
        digester.addSetProperties("foo");
        digester.addObjectCreate("foo/bar", "org.easev.digester.Bar");
        digester.addSetProperties("foo/bar");
        digester.addSetNext("foo/bar", "addBar", "org.easev.digester.Bar");

        Foo foo = (Foo) digester.parse(input);

        //測(cè)試裝載是否成功
        Iterator iter = foo.getBars();
        while (iter.hasNext()) {
            System.out.println((String) iter.next());
        }
    }

}

匹配模式?jīng)]有什么文章好做,那么下面要討論的就必然是規(guī)則了。在基本的使用方式下,Digester雖然使用XML文件定義Java對(duì)象的狀態(tài),提高了系統(tǒng)的靈活性,但是匹配模式與規(guī)則的映射序列(裝載邏輯)仍然通過(guò)硬編碼來(lái)定義,這種方式不易修改與重用。所以Digester還提供了一種高級(jí)的使用方式,用一個(gè)XML文件定義Java對(duì)象的狀態(tài)(數(shù)據(jù)源文件),用另一個(gè)XML文件定義裝載數(shù)據(jù)源文件的裝載邏輯。

這樣,對(duì)象的裝載過(guò)程分成了兩步:
1.裝載邏輯的"裝載",其結(jié)果表現(xiàn)為定義了rule的Digester;
2.根據(jù)上一步得到的Digester,裝載目標(biāo)對(duì)象。

套用上面的一個(gè)例子,增加了rule.xml,并改寫(xiě)了Entry.java

【rule.xml】
<?xml version=‘1.0‘?>
<!DOCTYPE digester-rules
  PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN"
    "file:///../digester/dtds/digester-rules.dtd">

<digester-rules>
  <pattern value="foo">
    <object-create-rule classname="org.easev.digester.Foo"/>
    <set-properties-rule/>
    <pattern value="bar">
      <object-create-rule classname="org.easev.digester.Bar"/>
      <set-properties-rule/>
      <set-next-rule methodname="addBar"/>
    </pattern>
  </pattern>
</digester-rules>

【Entry.java】
package org.easev.digester;

import java.io.File;
import java.util.Iterator;

import org.apache.commons.digester.Digester;

public class Entry {

    public static void main(String[] args) throws Exception {
        //相對(duì)路徑定義與包名相關(guān)
        File data = new File("org/easev/digester/foo.xml");
        File rule = new File("org/easev/digester/rule.xml");
        Digester digester = DigesterLoader.createDigester(rule.toURL());
        Foo foo = (Foo) digester.parse(data);
       
        //測(cè)試裝載是否成功
        Iterator iter = foo.getBars();
        while (iter.hasNext()) {
            System.out.println((String) iter.next());
        }
    }

}

我們可以看到,使用Digester的代碼變得相當(dāng)簡(jiǎn)潔,而要付出的代價(jià)就是為裝載邏輯寫(xiě)一個(gè)配置文件。

除了Digester之外,當(dāng)然還有其它的方法來(lái)實(shí)現(xiàn)Java對(duì)象的綁定與裝載:
1.java.util.Properties,簡(jiǎn)單的配置屬性(比如數(shù)據(jù)庫(kù)連接信息),可以寫(xiě)在properties文件中,調(diào)用Properties對(duì)象的load(InputStream)方法將配置中的健值對(duì)加載到Properties對(duì)象中。這種方式一般僅適用于簡(jiǎn)單的配置信息的加載。
2.JAXB,Java Architecture for XML Binding,在Java Web Services Developer Pack V 1.1中提供了一個(gè)參考實(shí)現(xiàn)。使用這種方式時(shí),除了提供數(shù)據(jù)源XML文件之外,還必須提供相應(yīng)的Schema文件。加載前,首先用Binding Compiler將Schema轉(zhuǎn)換得到目標(biāo)Java類的接口與實(shí)現(xiàn),然后再調(diào)用Unmarshaller或Marshaller將數(shù)據(jù)源XML文件信息加載到Java對(duì)象中,或?qū)⒃O(shè)置的Java對(duì)象數(shù)據(jù)導(dǎo)出為XML文件。
3.XPath
4.JaxMe

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多