Digester學(xué)習(xí)筆記
程序中用到的文件Example.xml (程序解析的xml文件)
???????????????
??????????????????
?1?<?xml?version="1.0"?encoding="UTF-8"?>
?2?
?3?<address-book>
?4?????<person?id="1"?category="acquaintance"?try="would?be?ignored">
?5?
?6?????<name>Gonzo</name>
?7?
?8?????<email?type="business">gonzo@muppets.com</email>
?9?
10?????<gender?result="the?whole?tag?would?be?ignored">male</gender>
11?
12???</person>
13?
14???<person?id="2"?category="rolemodel">
15?
16?????<name>Kermit</name>
17?
18?????<email?type="business">kermit@muppets.com</email>
19?
20?????<email?type="home">kermie@acme.com</email>
21?
22???</person>
23?
24?</address-book>
?2?
?3?<address-book>
?4?????<person?id="1"?category="acquaintance"?try="would?be?ignored">
?5?
?6?????<name>Gonzo</name>
?7?
?8?????<email?type="business">gonzo@muppets.com</email>
?9?
10?????<gender?result="the?whole?tag?would?be?ignored">male</gender>
11?
12???</person>
13?
14???<person?id="2"?category="rolemodel">
15?
16?????<name>Kermit</name>
17?
18?????<email?type="business">kermit@muppets.com</email>
19?
20?????<email?type="home">kermie@acme.com</email>
21?
22???</person>
23?
24?</address-book>
Person.java :
????????????
?1?package?digester.test;
?2?
?3?import?java.util.HashMap;
?4?import?java.util.Iterator;
?5?
?6?public?class?Person?{
?7?????private?int?id;
?8?????private?String??category;
?9?????private?String?name;
10?????private?HashMap<String,?String>?emails?=?new?HashMap<String,?String>();
11?????//下面的兩個(gè)方法的名字中set以后的部分,與</person>的屬性名字對(duì)應(yīng)?
12?????//當(dāng)從xml文件中識(shí)別出<person>的屬性時(shí),如果有要求(即調(diào)用過(guò)addSetProperties方法),Digester會(huì)依據(jù)這種對(duì)映關(guān)系自動(dòng)調(diào)用相應(yīng)的方法。
13?????
14?????public?void?setId(int?id){
15?????????this.id=id;????????
16?????}
17?????public?void?setCategory(String?category)?{
18???????????this.category?=?category;
19???????}
20?????
21?????//對(duì)應(yīng)name而言,因?yàn)槠渲祦?lái)自name標(biāo)簽的內(nèi)容,而非屬性值
22?????//需要調(diào)用addCallMethod指定識(shí)別<name>后調(diào)用此方法,自動(dòng)調(diào)用,需調(diào)用addBeanPropertySetter()方法
23?????
24??????public?void?setName(String?name)?{
25???????????this.name?=?name;
26???????}
27??????//同name,此時(shí)還要一一指定addEmail的參數(shù)值的來(lái)源。
28??????public?void?addEmail(String?type,?String?address)?{
29???????????emails.put(type,?address);
30???????}
31??????public?void?print()?{
32?
33???????????System.out.println("Person?#"?+?id);
34?
35???????????System.out.println("category="?+?category);
36?
37???????????System.out.println("name="?+?name);
38?
39???????????for(Iterator?i?=?emails.keySet().iterator();?i.hasNext();?)?{
40?
41???????????????String?type?=?(String)?i.next();
42?
43???????????????String?address?=?(String)?emails.get(type);
44?
45???????????????System.out.println("??email?(type?"?+?type?+?")?:?"?+?address);
46?
47???????????}
48?
49???????}
50?
51?}
52?
?2?
?3?import?java.util.HashMap;
?4?import?java.util.Iterator;
?5?
?6?public?class?Person?{
?7?????private?int?id;
?8?????private?String??category;
?9?????private?String?name;
10?????private?HashMap<String,?String>?emails?=?new?HashMap<String,?String>();
11?????//下面的兩個(gè)方法的名字中set以后的部分,與</person>的屬性名字對(duì)應(yīng)?
12?????//當(dāng)從xml文件中識(shí)別出<person>的屬性時(shí),如果有要求(即調(diào)用過(guò)addSetProperties方法),Digester會(huì)依據(jù)這種對(duì)映關(guān)系自動(dòng)調(diào)用相應(yīng)的方法。
13?????
14?????public?void?setId(int?id){
15?????????this.id=id;????????
16?????}
17?????public?void?setCategory(String?category)?{
18???????????this.category?=?category;
19???????}
20?????
21?????//對(duì)應(yīng)name而言,因?yàn)槠渲祦?lái)自name標(biāo)簽的內(nèi)容,而非屬性值
22?????//需要調(diào)用addCallMethod指定識(shí)別<name>后調(diào)用此方法,自動(dòng)調(diào)用,需調(diào)用addBeanPropertySetter()方法
23?????
24??????public?void?setName(String?name)?{
25???????????this.name?=?name;
26???????}
27??????//同name,此時(shí)還要一一指定addEmail的參數(shù)值的來(lái)源。
28??????public?void?addEmail(String?type,?String?address)?{
29???????????emails.put(type,?address);
30???????}
31??????public?void?print()?{
32?
33???????????System.out.println("Person?#"?+?id);
34?
35???????????System.out.println("category="?+?category);
36?
37???????????System.out.println("name="?+?name);
38?
39???????????for(Iterator?i?=?emails.keySet().iterator();?i.hasNext();?)?{
40?
41???????????????String?type?=?(String)?i.next();
42?
43???????????????String?address?=?(String)?emails.get(type);
44?
45???????????????System.out.println("??email?(type?"?+?type?+?")?:?"?+?address);
46?
47???????????}
48?
49???????}
50?
51?}
52?
AddressBook.java
?????????
?1?package?digester.test;
?2?
?3?import?java.util.Iterator;
?4?import?java.util.LinkedList;
?5?
?6?public?class?AddressBook?{
?7??????LinkedList?people?=?new?LinkedList();
?8?
?9?????????public?void?addPerson(Person?p)?{
10?????????????people.addLast(p);
11?????????}
12?????????public?void?print()?{
13?????????????System.out.println("Address?book?has?"?+?people.size()?+?"?entries");?
14?????????????for(Iterator?i?=?people.iterator();?i.hasNext();?)?{
15?????????????????Person?p?=?(Person)?i.next();
16?????????????????p.print();
17?????????????}
18?
19?????????}
20?????????public?void?digest()?{
21?????????????//?TODO?Auto-generated?method?stub
22?????????????
23?????????}
24?
25?
26?}
27?
?2?
?3?import?java.util.Iterator;
?4?import?java.util.LinkedList;
?5?
?6?public?class?AddressBook?{
?7??????LinkedList?people?=?new?LinkedList();
?8?
?9?????????public?void?addPerson(Person?p)?{
10?????????????people.addLast(p);
11?????????}
12?????????public?void?print()?{
13?????????????System.out.println("Address?book?has?"?+?people.size()?+?"?entries");?
14?????????????for(Iterator?i?=?people.iterator();?i.hasNext();?)?{
15?????????????????Person?p?=?(Person)?i.next();
16?????????????????p.print();
17?????????????}
18?
19?????????}
20?????????public?void?digest()?{
21?????????????//?TODO?Auto-generated?method?stub
22?????????????
23?????????}
24?
25?
26?}
27?
主類(lèi):AddressBookDigester.java
???????????????
?1?package?digester.test;
?2?
?3?import?org.apache.commons.digester.Digester;
?4?????/**
?5??????*????digester技術(shù)最普通的應(yīng)用,就是用來(lái)動(dòng)態(tài)創(chuàng)建一個(gè)由java對(duì)象構(gòu)成的樹(shù)結(jié)構(gòu),各對(duì)象的屬性以及對(duì)象間的關(guān)系。
?6??????*????是基于xml文檔的內(nèi)容來(lái)設(shè)置的。為實(shí)現(xiàn)這種應(yīng)用,Digester提供了一個(gè)對(duì)象棧
?7??????*????clear(),清空棧的內(nèi)容;peek(),返回對(duì)棧頂對(duì)象的引用;pop(),將棧頂對(duì)象彈出并返回;push(),將一個(gè)新的對(duì)象壓入棧頂。
?8??????*??用棧的原因:
?9??????*??????????當(dāng)識(shí)別一個(gè)xml元素的開(kāi)始,創(chuàng)建對(duì)象并壓人棧頂。這個(gè)對(duì)象在處理該元素的子元素過(guò)程中一直在棧中,
10??????*??????????當(dāng)所有子元素處理完后,解析器遇到該元素的結(jié)束標(biāo)記,彈出此對(duì)象,并進(jìn)行相應(yīng)的處理。
11??????*?描述對(duì)象間的關(guān)系:
12??????*?????????????將棧頂對(duì)象作為一個(gè)參數(shù),傳遞給該對(duì)象的下面的對(duì)象的一個(gè)方法,就可以簡(jiǎn)單的建立父子關(guān)系。
13??????*?????????????從而可以簡(jiǎn)單地建立起1:1的關(guān)系(第二棧頂對(duì)象與棧頂對(duì)象之間)和1:N的關(guān)系(第二棧頂對(duì)象不動(dòng),N次壓棧頂彈棧頂對(duì)象)
14??????*
15??????*/
16?public?class?AddressBookDigester?{
17?????public?static?void?main(String[]?args)?throws?Exception?{
18?????????AddressBookDigester?d=new?AddressBookDigester();
19?????????//?創(chuàng)建一個(gè)Digester實(shí)例
20?????????//當(dāng)遇到匹配元素的開(kāi)始標(biāo)記和結(jié)束標(biāo)記時(shí),begin()方法和end()方法將分別被調(diào)用。?
21?????????Digester?digester=?new?Digester();
22?????????//?創(chuàng)建AddressBook實(shí)例,并將其壓入棧頂。
23?????????AddressBook?book?=?new?AddressBook();
24?????????digester.push(book);
25?????????//?增加規(guī)則
26?????????addRules(digester);
27?????????java.io.File?srcfile?=?new?java.io.File("../struts/src/Example.xml");
28?????????digester.parse(srcfile);
29?????????book.print();
30?????}
31?
32?????private?static?void?addRules(Digester?digester)?{
33?????????
34?????????//當(dāng)遇到<person>時(shí),創(chuàng)建類(lèi)Person的一個(gè)實(shí)例,并將其壓入棧頂
35?????????//當(dāng)元素被處理結(jié)束時(shí),對(duì)象被彈出。
36?????????digester.addObjectCreate("address-book/person",?Person.class);
37?????????
38?????????//?將<person>標(biāo)簽的屬性(attribute)與棧頂Person類(lèi)對(duì)象的屬性(property)設(shè)置方法根據(jù)各自的名字進(jìn)行映射,
39?????????//?(例如,將標(biāo)簽屬性id與屬性設(shè)置方法setId進(jìn)行映射,將標(biāo)簽屬性category與屬性設(shè)置方法setCategory進(jìn)行映射),
40?????????//?然后將屬性的值作參數(shù)傳遞給執(zhí)行相應(yīng)的方法。
41?
42?????????//?如果某標(biāo)簽屬性沒(méi)法通過(guò)名字找到相應(yīng)的屬性設(shè)置方法,則此標(biāo)簽屬性被忽略(如example.xml中第一個(gè)<person>的try屬性)。
43?
44?????????digester.addSetProperties("address-book/person");
45?
46?????????//調(diào)用第二棧頂對(duì)象(AddressBook實(shí)例)的addPerson方法,以棧對(duì)象(Person實(shí)例)的對(duì)象為參數(shù)
47?????????//配置完畢的Bean插入父對(duì)象。?
48?????????
49?????????//彈出棧頂?shù)膶?duì)象,把它傳遞給緊接其下的另一個(gè)對(duì)象的指定名稱(chēng)的方法。
50?????????//通常用來(lái)把一個(gè)已經(jīng)初始化的Bean插入到父對(duì)象。?
51?
52?????????digester.addSetNext("address-book/person",?"addPerson");
53?
54?????????//?當(dāng)遇到<person>的子元素<name>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的setName方法。
55?
56?????????//?此處addCallMethod方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是方法的名字,
57?????????//?第三個(gè)是參數(shù)的數(shù)量(為0時(shí),表示只有一個(gè)參數(shù),且參數(shù)的值是元素的內(nèi)容
58?????????
59?????????//調(diào)用頂層Bean的指定名稱(chēng)的方法。
60?????????//被調(diào)用的方法可以有任意多個(gè)參數(shù),參數(shù)的值通過(guò)后繼的CallParamRule給出。?
61?
62?????????digester.addCallMethod("address-book/person/name",?"setName",?0);
63?
64?????????//?當(dāng)遇到<person>的子元素<email>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的addEmail方法,
65?????????//?addEmail方法有兩個(gè)參數(shù),取值分別來(lái)自<email>的屬性type的值和<email>本身的內(nèi)容。
66?
67?????????//此處addCallParam方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是指明被調(diào)用方法(addEmail)參數(shù)的序號(hào),第三個(gè)是參數(shù)為字符串時(shí)指屬性的名字)
68?????????//表示方法調(diào)用的參數(shù)。參數(shù)的值取自指定名稱(chēng)的XML元素的屬性,或者是當(dāng)前元素包含的原始字符數(shù)據(jù)。
69?????????//這個(gè)規(guī)則要求用一個(gè)整數(shù)指定它在參數(shù)列表中的位置。
70?????????
71?????????digester.addCallMethod("address-book/person/email",?"addEmail",?2);
72?????????digester.addCallParam("address-book/person/email",?0,?"type");
73?????????digester.addCallParam("address-book/person/email",?1);
74?????????
75?????}
76?
77?????
78?}
79?
?2?
?3?import?org.apache.commons.digester.Digester;
?4?????/**
?5??????*????digester技術(shù)最普通的應(yīng)用,就是用來(lái)動(dòng)態(tài)創(chuàng)建一個(gè)由java對(duì)象構(gòu)成的樹(shù)結(jié)構(gòu),各對(duì)象的屬性以及對(duì)象間的關(guān)系。
?6??????*????是基于xml文檔的內(nèi)容來(lái)設(shè)置的。為實(shí)現(xiàn)這種應(yīng)用,Digester提供了一個(gè)對(duì)象棧
?7??????*????clear(),清空棧的內(nèi)容;peek(),返回對(duì)棧頂對(duì)象的引用;pop(),將棧頂對(duì)象彈出并返回;push(),將一個(gè)新的對(duì)象壓入棧頂。
?8??????*??用棧的原因:
?9??????*??????????當(dāng)識(shí)別一個(gè)xml元素的開(kāi)始,創(chuàng)建對(duì)象并壓人棧頂。這個(gè)對(duì)象在處理該元素的子元素過(guò)程中一直在棧中,
10??????*??????????當(dāng)所有子元素處理完后,解析器遇到該元素的結(jié)束標(biāo)記,彈出此對(duì)象,并進(jìn)行相應(yīng)的處理。
11??????*?描述對(duì)象間的關(guān)系:
12??????*?????????????將棧頂對(duì)象作為一個(gè)參數(shù),傳遞給該對(duì)象的下面的對(duì)象的一個(gè)方法,就可以簡(jiǎn)單的建立父子關(guān)系。
13??????*?????????????從而可以簡(jiǎn)單地建立起1:1的關(guān)系(第二棧頂對(duì)象與棧頂對(duì)象之間)和1:N的關(guān)系(第二棧頂對(duì)象不動(dòng),N次壓棧頂彈棧頂對(duì)象)
14??????*
15??????*/
16?public?class?AddressBookDigester?{
17?????public?static?void?main(String[]?args)?throws?Exception?{
18?????????AddressBookDigester?d=new?AddressBookDigester();
19?????????//?創(chuàng)建一個(gè)Digester實(shí)例
20?????????//當(dāng)遇到匹配元素的開(kāi)始標(biāo)記和結(jié)束標(biāo)記時(shí),begin()方法和end()方法將分別被調(diào)用。?
21?????????Digester?digester=?new?Digester();
22?????????//?創(chuàng)建AddressBook實(shí)例,并將其壓入棧頂。
23?????????AddressBook?book?=?new?AddressBook();
24?????????digester.push(book);
25?????????//?增加規(guī)則
26?????????addRules(digester);
27?????????java.io.File?srcfile?=?new?java.io.File("../struts/src/Example.xml");
28?????????digester.parse(srcfile);
29?????????book.print();
30?????}
31?
32?????private?static?void?addRules(Digester?digester)?{
33?????????
34?????????//當(dāng)遇到<person>時(shí),創(chuàng)建類(lèi)Person的一個(gè)實(shí)例,并將其壓入棧頂
35?????????//當(dāng)元素被處理結(jié)束時(shí),對(duì)象被彈出。
36?????????digester.addObjectCreate("address-book/person",?Person.class);
37?????????
38?????????//?將<person>標(biāo)簽的屬性(attribute)與棧頂Person類(lèi)對(duì)象的屬性(property)設(shè)置方法根據(jù)各自的名字進(jìn)行映射,
39?????????//?(例如,將標(biāo)簽屬性id與屬性設(shè)置方法setId進(jìn)行映射,將標(biāo)簽屬性category與屬性設(shè)置方法setCategory進(jìn)行映射),
40?????????//?然后將屬性的值作參數(shù)傳遞給執(zhí)行相應(yīng)的方法。
41?
42?????????//?如果某標(biāo)簽屬性沒(méi)法通過(guò)名字找到相應(yīng)的屬性設(shè)置方法,則此標(biāo)簽屬性被忽略(如example.xml中第一個(gè)<person>的try屬性)。
43?
44?????????digester.addSetProperties("address-book/person");
45?
46?????????//調(diào)用第二棧頂對(duì)象(AddressBook實(shí)例)的addPerson方法,以棧對(duì)象(Person實(shí)例)的對(duì)象為參數(shù)
47?????????//配置完畢的Bean插入父對(duì)象。?
48?????????
49?????????//彈出棧頂?shù)膶?duì)象,把它傳遞給緊接其下的另一個(gè)對(duì)象的指定名稱(chēng)的方法。
50?????????//通常用來(lái)把一個(gè)已經(jīng)初始化的Bean插入到父對(duì)象。?
51?
52?????????digester.addSetNext("address-book/person",?"addPerson");
53?
54?????????//?當(dāng)遇到<person>的子元素<name>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的setName方法。
55?
56?????????//?此處addCallMethod方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是方法的名字,
57?????????//?第三個(gè)是參數(shù)的數(shù)量(為0時(shí),表示只有一個(gè)參數(shù),且參數(shù)的值是元素的內(nèi)容
58?????????
59?????????//調(diào)用頂層Bean的指定名稱(chēng)的方法。
60?????????//被調(diào)用的方法可以有任意多個(gè)參數(shù),參數(shù)的值通過(guò)后繼的CallParamRule給出。?
61?
62?????????digester.addCallMethod("address-book/person/name",?"setName",?0);
63?
64?????????//?當(dāng)遇到<person>的子元素<email>時(shí),調(diào)用棧頂對(duì)象(Person實(shí)例)的addEmail方法,
65?????????//?addEmail方法有兩個(gè)參數(shù),取值分別來(lái)自<email>的屬性type的值和<email>本身的內(nèi)容。
66?
67?????????//此處addCallParam方法的第一參數(shù)是規(guī)則,第二個(gè)參數(shù)是指明被調(diào)用方法(addEmail)參數(shù)的序號(hào),第三個(gè)是參數(shù)為字符串時(shí)指屬性的名字)
68?????????//表示方法調(diào)用的參數(shù)。參數(shù)的值取自指定名稱(chēng)的XML元素的屬性,或者是當(dāng)前元素包含的原始字符數(shù)據(jù)。
69?????????//這個(gè)規(guī)則要求用一個(gè)整數(shù)指定它在參數(shù)列表中的位置。
70?????????
71?????????digester.addCallMethod("address-book/person/email",?"addEmail",?2);
72?????????digester.addCallParam("address-book/person/email",?0,?"type");
73?????????digester.addCallParam("address-book/person/email",?1);
74?????????
75?????}
76?
77?????
78?}
79?
???以上的程序來(lái)源網(wǎng)絡(luò),我真理了一下。
附件:http://www.aygfsteel.com/Files/windfree/test.rar
# re: Digester學(xué)習(xí)筆記 2007-01-26 18:40 小竹 回復(fù) 更多評(píng)論
blog不錯(cuò)...筆記很詳細(xì)...學(xué)習(xí)ing