Digester利用リヨウガイド 作成者サクセイシャ: T.Shirokaze 2005/3/4
shirokaz99@yahoo.co.jp
1.前書マエガ
Jakarta Commons Digester http://jakarta.apache.org/commons/digester/
はXMLからJavaクラスへのみをオコナうライブラリである。
XMLとJavaクラスの変換ヘンカンは、データバインディングとして、JAXB, Caster, Relaxer
の3つが有名ユウメイであるが、どれも多機能タキノウで、1スキーマから生成セイセイされるクラスも10以上イジョウ
である。使ツカうクラスはカギられてはいるがオーバースペックであり、クラスのメンテナンスが心配シンパイである。
Digesterは、JAXBトウクラべて、
・XMLスキーマが不要フヨウ
専用センヨウ
という特徴トクチョウがあり。
近いのはJDK1.4に含まれているXMLDecoder/Encoderであるが、それよりも柔軟性ジュウナンセイがある。
単体タンタイテストのテストデータをJavaクラスにむのはDigesterがモット効率コウリツいとカンガえる。
digesterのライブラリ commons-digester.jar はstrutsにフクまれている。
使ツカトキ以下イカの3つのライブラリを使ツカうが、これらもstrutsにハイっているので、インストールは大抵タイテイ不要フヨウである。
commons-beanutils.jar
commons-logging.jar
commons-collections.jar
DigesterでXMLをJavaクラスにむのに必要ヒツヨウなのは、
データ転送テンソウサキJavaBeanクラス
データXMLファイル
ルールXMLファイル
みコード(クライアントとってもい)
の4つである。
詳細ショウサイがしりたい場合バアイは、4ショウマツ参考サンコウURLを参照サンショウ
2.BeanのList
まずむJavaBeanクラスを作成サクセイする。このJavaBeanのListとしてむために。
sample.util.db.SoftwareBean.java
package sample.util.db;
/**
 * PC情報フォルダ String型のsetは引数nullの場合、空文字""を返す。 idは大文字に正規化する。
 */
public class SoftwareBean {
    /* toStringの文字区切り */
    private final static String DLM = ",";
    private String id = "";
    private String maker = "";
    private String os = "";
    private int cpumhz;
    private int memmb;
    private int hdgb;
    private String http_server = "";
    private String db = "";
    private String virus_tool = "";
    private String java = "";
    private String visual_studio = "";
    private String etc = "";
    private String remarks = "";
    
    public String getDb() {
        return db;
    }
    
    public String getEtc() {
        return etc;
    }
    
    public String getHttp_server() {
        return http_server;
    }
    public String getId() {
        return id;
    }
    public String getJava() {
        return java;
    }
    public String getMaker() {
        return maker;
    }
    public String getOs() {
        return os;
    }
    public String getRemarks() {
        return remarks;
    }
    public String getVirus_tool() {
        return virus_tool;
    }
    public String getVisual_studio() {
        return visual_studio;
    }
    public void setDb(String string) {
        db = replace(string);
    }
    public void setEtc(String string) {
        etc = replace(string);
    }
    public void setHttp_server(String string) {
        http_server = replace(string);
    }
    public void setId(String string) {
        id = replace(string).toUpperCase();
    }
    public void setJava(String string) {
        java = replace(string);
    }
    public void setMaker(String string) {
        maker = replace(string);
    }
    public void setOs(String string) {
        os = replace(string);
    }
    public void setRemarks(String string) {
        remarks = replace(string);
    }
    public void setVirus_tool(String string) {
        virus_tool = replace(string);
    }
    public void setVisual_studio(String string) {
        visual_studio = replace(string);
    }
    public int getCpumhz() {
        return cpumhz;
    }
    public int getHdgb() {
        return hdgb;
    }
    public int getMemmb() {
        return memmb;
    }
    public void setCpumhz(int i) {
        cpumhz = i;
    }
    public void setHdgb(int i) {
        hdgb = i;
    }
    public void setMemmb(int i) {
        memmb = i;
    }
    public String toString() {
        return id + DLM + maker + DLM + cpumhz + DLM + memmb + DLM + hdgb + DLM + db + DLM + etc + DLM + http_server +
               DLM + java + DLM + virus_tool + DLM + visual_studio + DLM + remarks;
    }
    private String replace(String s) {
        if(s == null) {
            return "";
        } else {
            return s.trim();
        }
    }
    public int hashCode() {
        return toString().hashCode();
    }
    public boolean equals(SoftwareBean sb) {
        if(toString().equals(sb.toString())) return true;
        return false;
    }
}
データとルールのxmlファイルをeclipseプロジェクトのナカいてデプロイし,
サーブレットコンテナから相対参照する仕方が不明のため、
絶対ゼッタイパス c:\usr\local\digester フォルダのナカにデータとルールのXMLをいて、Javaコードに
c:\usr\local\digester\ListData.xml とハードコードしている。
eclipseプロジェクトのソトにXMLを場合バアイでも、XMLフォルダを後で動かすかも知れない場合は、
JavaVMのプロパティにXMLフォルダ位置をセットして、Javaコードはそれを参照サンショウするようにするとい。
むデータのXML c:\usr\local\digester\ListData.xml
(xmlファイルをeclipseプロジェクトのナカいて,サーブレットコンテナから相対ソウタイ参照サンショウする仕方シカタ現時点ゲンジテン不明フメイ
ため、絶対ゼッタイパス c:\usr\local\digester フォルダのナカにデータとルールのXMLをいて、Javaコードから
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
  <pcinfo id="PC2       " os="win2000" cpumhz="500" memmb="256" hdgb="16" http_server="" 
    db="" java="" visual_studio="" virus_tool="" etc="" maker="FujitsuDeskPower" remarks=" "/>
  <pcinfo id="PC3       " os="win2000" cpumhz="500" memmb="192" hdgb="12" http_server="" 
      db="" java="" visual_studio="あぱっち" virus_tool="" etc="漢字テスト" maker="FujitsuDeskPower" remarks=" "/>
</dataset>
むためのルールXML c:\usr\local\digester\ListRule.xml
<?xml version = "1.0" encoding = "Shift_JIS" ?>
<digester-rules>
  <object-create-rule pattern="dataset" classname="java.util.ArrayList" />
<pattern value="dataset/pcinfo">
<object-create-rule classname="sample.util.db.SoftwareBean" />
<set-properties-rule />
<set-next-rule methodname="add" />
</pattern>
</digester-rules>
最初サイショのobject-create-rule で datasetタグをつけるとArrayListオブジェクトを生成セイセイする。
ツギのobject-create-rule で datasetタグチュウのpcinfoタグをつけると、SoftwareBeanを生成セイセイ
<set-properties-rule />で属性ゾクセイをSoftwareBeanにスベてコピーする。
<set-next-rule methodname="add" /> でArrayListにSoftwareBeanをaddする。
みテストJavaクラス sample.util.digester.ListTest.java は以下イカである。
package sample.util.digester;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;
import sample.util.db.SoftwareBean;
import java.io.File;
import java.rmi.*;
import java.util.List;
/**
 * DOCUMENT ME!
 *
 * @author $author$
 * 
@version $Revision$
 */
public class ListTest implements java.rmi.Remote {
    public ListTest() {
    }
    public List getSoftwareBeanList() throws RemoteException {
        List list = null;
        try {
            Digester d = DigesterLoader.createDigester(new File("/usr/local/digester/ListRule.xml").toURL());
            list = (List)d.parse(new File("/usr/local/digester/ListData.xml"));
        } catch(Exception exc) {
            exc.printStackTrace();
        }
        return list;
    }
    
public static void main(String[] args) throws RemoteException {
ListTest listTest = new ListTest();
List list = listTest.getSoftwareBeanList();
for(int i = 0; i < list.size(); i++) {
SoftwareBean sb = (SoftwareBean)list.get(i);
System.out.println(sb);
}
}
}
RMIでモチいるためにRemoteExceptionなどがついている。
ListTest実行ジッコウ結果ケッカ
PC2,FujitsuDeskPower,500,256,16,,,,,,,
PC3,FujitsuDeskPower,500,192,12,,漢字テスト,,,,あぱっち,
JSPやActionでモチいる場合バアイむためのコードは、
  ListTest lt = new ListTest();
  List list = lt.getSoftwareBeanList();
の2ギョウい。
SoftwareBeanListをHTMLするコードをJSPにけば、以下イカのようなページになる。