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に書けば、以下のようなページになる。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|