Digester学习笔记

程序中用到的文件

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>

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     //下面的两个方法的名字中set以后的部分,与</person>的属性名字对应 
12     //当从xml文件中识别出<person>的属性时,如果有要求(即调用过addSetProperties方法),Digester会依据这种对映关系自动调用相应的方法。
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     //对应name而言,因为其值来自name标签的内容,而非属性值
22     //需要调用addCallMethod指定识别<name>后调用此方法,自动调用,需调用addBeanPropertySetter()方法
23     
24      public void setName(String name) {
25           this.name = name;
26       }
27      //同name,此时还要一一指定addEmail的参数值的来源。
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 



主类:AddressBookDigester.java

               
 1 package digester.test;
 2 
 3 import org.apache.commons.digester.Digester;
 4     /**
 5      *    digester技术最普通的应用,就是用来动态创建一个由java对象构成的树结构,各对象的属性以及对象间的关系。
 6      *    是基于xml文档的内容来设置的。为实现这种应用,Digester提供了一个对象栈
 7      *    clear(),清空栈的内容;peek(),返回对栈顶对象的引用;pop(),将栈顶对象弹出并返回;push(),将一个新的对象压入栈顶。
 8      *  用栈的原因:
 9      *          当识别一个xml元素的开始,创建对象并压人栈顶。这个对象在处理该元素的子元素过程中一直在栈中,
10      *          当所有子元素处理完后,解析器遇到该元素的结束标记,弹出此对象,并进行相应的处理。
11      * 描述对象间的关系:
12      *             将栈顶对象作为一个参数,传递给该对象的下面的对象的一个方法,就可以简单的建立父子关系。
13      *             从而可以简单地建立起1:1的关系(第二栈顶对象与栈顶对象之间)和1:N的关系(第二栈顶对象不动,N次压栈顶弹栈顶对象)
14      *
15      */
16 public class AddressBookDigester {
17     public static void main(String[] args) throws Exception {
18         AddressBookDigester d=new AddressBookDigester();
19         // 创建一个Digester实例
20         //当遇到匹配元素的开始标记和结束标记时,begin()方法和end()方法将分别被调用。 
21         Digester digester= new Digester();
22         // 创建AddressBook实例,并将其压入栈顶。
23         AddressBook book = new AddressBook();
24         digester.push(book);
25         // 增加规则
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         //当遇到<person>时,创建类Person的一个实例,并将其压入栈顶
35         //当元素被处理结束时,对象被弹出。
36         digester.addObjectCreate("address-book/person", Person.class);
37         
38         // 将<person>标签的属性(attribute)与栈顶Person类对象的属性(property)设置方法根据各自的名字进行映射,
39         // (例如,将标签属性id与属性设置方法setId进行映射,将标签属性category与属性设置方法setCategory进行映射),
40         // 然后将属性的值作参数传递给执行相应的方法。
41 
42         // 如果某标签属性没法通过名字找到相应的属性设置方法,则此标签属性被忽略(如example.xml中第一个<person>的try属性)。
43 
44         digester.addSetProperties("address-book/person");
45 
46         //调用第二栈顶对象(AddressBook实例)的addPerson方法,以栈对象(Person实例)的对象为参数
47         //配置完毕的Bean插入父对象。 
48         
49         //弹出栈顶的对象,把它传递给紧接其下的另一个对象的指定名称的方法。
50         //通常用来把一个已经初始化的Bean插入到父对象。 
51 
52         digester.addSetNext("address-book/person""addPerson");
53 
54         // 当遇到<person>的子元素<name>时,调用栈顶对象(Person实例)的setName方法。
55 
56         // 此处addCallMethod方法的第一参数是规则,第二个参数是方法的名字,
57         // 第三个是参数的数量(为0时,表示只有一个参数,且参数的值是元素的内容
58         
59         //调用顶层Bean的指定名称的方法。
60         //被调用的方法可以有任意多个参数,参数的值通过后继的CallParamRule给出。 
61 
62         digester.addCallMethod("address-book/person/name""setName"0);
63 
64         // 当遇到<person>的子元素<email>时,调用栈顶对象(Person实例)的addEmail方法,
65         // addEmail方法有两个参数,取值分别来自<email>的属性type的值和<email>本身的内容。
66 
67         //此处addCallParam方法的第一参数是规则,第二个参数是指明被调用方法(addEmail)参数的序号,第三个是参数为字符串时指属性的名字)
68         //表示方法调用的参数。参数的值取自指定名称的XML元素的属性,或者是当前元素包含的原始字符数据。
69         //这个规则要求用一个整数指定它在参数列表中的位置。
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 

   以上的程序来源网络,我真理了一下。
附件:http://www.blogjava.net/Files/windfree/test.rar
posted on 2006-12-08 16:02 windfree 阅读(464) 评论(1)  编辑  收藏 所属分类: java

评论

# re: Digester学习笔记 2007-01-26 18:40 小竹  回复  更多评论   

blog不错...笔记很详细...学习ing

只有注册用户登录后才能发表评论。


网站导航: