测试(演示使用方法):
测试用例
package
com.ddm.readbook;
import
org.apache.commons.digester.
*
;
import
java.util.Iterator;
public
class
TestCase
{
public
static
void
main(String[] args)
{
//
建立一个Digester对象
Digester digester
=
new
Digester();
//
从reader标签开始解析,并新建一个Reader对象做为根对象
digester.addObjectCreate(
"
reader
"
,Reader.
class
);
//
根据reader标签属性值配置对象的属性,此类的属性必须具有setter
digester.addSetProperties(
"
reader
"
);
//
-----第1层元素开始
digester.addObjectCreate(
"
reader/book
"
,Book.
class
);
//
digester.addSetProperties("reader/book");
//
可以用以下三条语句代替
digester.addCallMethod(
"
reader/book
"
,
"
setInfo
"
,
2
);
digester.addCallParam(
"
reader/book
"
,
0
,
"
title
"
);
digester.addCallParam(
"
reader/book
"
,
1
,
"
author
"
);
//
-----第2层元素开始
digester.addObjectCreate(
"
reader/book/chapter
"
,Chapter.
class
);
digester.addBeanPropertySetter(
"
reader/book/chapter/no
"
);
//
digester.addBeanPropertySetter("reader/book/chapter/caption");
//
同样可以替代
digester.addCallMethod(
"
reader/book/chapter/caption
"
,
"
setCaption
"
,
0
);
digester.addSetNext(
"
reader/book/chapter
"
,
"
addReadedChapter
"
);
//
-----第2层元素结束
digester.addSetNext(
"
reader/book
"
,
"
addBook
"
);
//
-----第1层元素结束
try
{
//
解析XML文件,并得到ROOT元素
Reader reader
=
(Reader)digester.parse( TestCase.
class
.getClassLoader().getResourceAsStream(
"
readbook.xml
"
));
//
可以使用的替代方法1
//
reader = (Reader)digester.getRoot();
//
可以使用的方法2
//
先新建一个Reader对象,再对digester.push(reader);
System.out.println(
"
姓名:
"
+
reader.getName());
System.out.println(
"
共读书:
"
+
reader.getBooks().size()
+
"
本
"
);
System.out.println(
"
*****************************
"
);
Iterator books
=
reader.getBooks().iterator(),chapters
=
null
;
Book book
=
null
;
Chapter chapter
=
null
;
while
(books.hasNext())
{
//
显示书的信息
book
=
(Book)books.next();
System.out.println(
"
书名:
"
+
book.getTitle()
+
"
作者:
"
+
book.getAuthor());
System.out.println(
"
------------------------------
"
);
//
显示已阅读章节
System.out.println(
"
共读
"
+
book.getReadedChapters().size()
+
"
章
"
);
chapters
=
book.getReadedChapters().iterator();
while
(chapters.hasNext())
{
chapter
=
(Chapter)chapters.next();
System.out.println(
"
第
"
+
chapter.getNo()
+
"
章
"
+
chapter.getCaption());
}
System.out.println(
"
------------------------------
"
);
}
}
catch
(Exception e)
{
e.printStackTrace();
}
}
}
运行效果:
姓名:大大毛
共读书:2本
*****************************
书名:精通Struts 作者:孙卫琴
------------------------------
共读3章
第1章 Struts与Java Web应用简介
第2章 Struts应用:helloapp应用
第3章 Struts应用的需求分析与设计
------------------------------
书名:Hibernate开发指南 作者:夏昕
------------------------------
共读1章
第1章 Hibernate初识
------------------------------
从测试用例中可以看出,Digester不光解析了XML所含的数据并对照新建了对象,而且还复原了对象之间的关系(一个树的结构)
Digester类常用方法:
addObjectCreate(String rule,Class
class
)
该方法用于构造指定类的对象,
构造时机:
发现String rule规则所指定的节点
addSetProperties(String rule)
该方法用于设置对象的属性,
设置方法:取String rule规则所指定标签的属性 一一对应 的调用对象的setter,注意对象属性的名称必须与XML中标签属性名称一致,可一次设置多个属性
设置时机:发现String rule规则所指定的节点;
addBeanPropertySetter(String rule)
该方法的作用及使用方法类似于addSetProperties,只不过它是用String rule规则所指定标签的值 来 调用对象的setter;
addCallMethod(String rule,String methodName,
int
paraNumber)
该方法同样是设置对象的属性,但是方式更加灵活,不需要对象具有setter
设置方法:取String rule规则指定标签的属性 来 调用对象的方法(String methodName参数即是需要调用的方法名),int paraNumber参数是表示方法需要的参数个数
注意:当paraNumber = 0时,可以单独使用(表明为标签的值来调用),不然需要配合addCallParam方法
addCallParam(String rule,
int
paraIndex,String attributeName)
该方法与addCallMethod配合使用
设置方法:取String rule规则指定标签的属性值来调用方法
参数:
int paraIndex:表明需要填充的方法形参序号,从 0 开始,方法由addCallMethod指定
String attributeName:指定标签属性名称
addSetNext(String rule,String methodName)
该方法用于指定下一次出现该标签时,调用父对象的方法名,与addObjectCreate方法相呼应(不一定会对应,除非是push了Root元素)
流程:
1.新建当前层元素的对象,相当于一个addObjectCreate
2.用新建的对象作为参数去调用父对象的指定方法(方法名由String methodName指定)
作用:
可以复原标签所表现出来的层次关系
使用Digester所需要的包:
1. commons-beanutils.jar
2. commons-collections.jar
3. commons-digester.jar
4. commons-logging.jar
如果安装了Struts框架,那么这些包就都有了
使用注意事项:
1.Digester类调用的顺序,必须与XML数据文件绝对一致;
2.Digester类依赖于JavaBean规范,类必须符合规范;
3.XML文件中标签/属性的名称必须与Bean中的一致(包括大小写);