digester框架属于jakarta commons,它以规则和模式为基础处理xml文档。与sax和dom之类的标准api相比,digester不涉及太多的细节问题,非常适合于对xml文档进行简单的处理。
在java和xml开发中,一个常见的任务是把xml文档转换成对应的java bean对象的层次结构。人们经常用标准的sax和dom api来完成这个任务。虽然这两种api都很强大和灵活,但对于某些简单的任务来说,它们显得操作层次太低,也就是说,涉及了太多的细节问题。jakarta digester框架能够很好地满足这类场合的需要。
digester框架简介
jakarta的digester框架从struts框架发展而来,原先被用来处理struts-config.xml配置文件,但很快人们认识到它有着更广泛的用途,把它转入了jakarta commons项目。jakarta commons的目标是提供一个“可重用java组件的仓库”。digester最新的版本是1.3,于2002年8月13日发布。
digester框架允许开发者指定一组动作,当解析器在xml文档中发现某些特定的简单模式时动作被执行。digester框架带有10个预定义的规则(rule),涵盖了unmarshalling xml(例如创建bean或设置bean属性)的大多数需求( marshalling的原意是指“配制整齐,编组列车”,marshalling是在内存中为java对象生成xml描述文档的过程,而unmarshalling是指把xml形式的描述转换到可用java代码操作的对象的过程,我们称之为“反配制”),但必要时用户可以定义和实现自己的规则。
在本文的例子中,我们将反配制下面这个xml文档:
下面是bean的代码。注意使用digester框架时,bean类必须定义成public。
在java和xml开发中,一个常见的任务是把xml文档转换成对应的java bean对象的层次结构。人们经常用标准的sax和dom api来完成这个任务。虽然这两种api都很强大和灵活,但对于某些简单的任务来说,它们显得操作层次太低,也就是说,涉及了太多的细节问题。jakarta digester框架能够很好地满足这类场合的需要。
digester框架简介
jakarta的digester框架从struts框架发展而来,原先被用来处理struts-config.xml配置文件,但很快人们认识到它有着更广泛的用途,把它转入了jakarta commons项目。jakarta commons的目标是提供一个“可重用java组件的仓库”。digester最新的版本是1.3,于2002年8月13日发布。
digester框架允许开发者指定一组动作,当解析器在xml文档中发现某些特定的简单模式时动作被执行。digester框架带有10个预定义的规则(rule),涵盖了unmarshalling xml(例如创建bean或设置bean属性)的大多数需求( marshalling的原意是指“配制整齐,编组列车”,marshalling是在内存中为java对象生成xml描述文档的过程,而unmarshalling是指把xml形式的描述转换到可用java代码操作的对象的过程,我们称之为“反配制”),但必要时用户可以定义和实现自己的规则。
在本文的例子中,我们将反配制下面这个xml文档:
<?xml version="1.0"?> <catalog library="somewhere"> <book> <author>author 1</author> <title>title 1</title> </book> <book> <author>author 2</author> <title>his one book</title> </book> <magazine> <name>mag title 1</name> <article page="5"> <headline>some headline</headline> </article> <article page="9"> <headline>another headline</headline> </article> </magazine> <book> <author>author 2</author> <title>his other book</title> </book> <magazine> <name>mag title 2</name> <article page="17"> <headline>second headline</headline> </article> </magazine> </catalog> |
下面是bean的代码。注意使用digester框架时,bean类必须定义成public。
import java.util.vector; public class catalog { private vector books; private vector magazines; public catalog() { books = new vector(); magazines = new vector(); } public void addbook( book rhs ) { books.addelement( rhs ); } public void addmagazine( magazine rhs ) { magazines.addelement( rhs ); } public string tostring() { string newline = system.getproperty( "line.separator" ); stringbuffer buf = new stringbuffer(); buf.append( "--- books ---" ).append( newline ); for( int i=0; i<books.size(); i++ ){ buf.append( books.elementat(i) ).append( newline ); } buf.append( "--- magazines ---" ).append( newline ); for( int i=0; i<magazines.size(); i++ ){ buf.append( magazines.elementat(i) ).append( newline ); } return buf.tostring(); } } //=================================================== public class book { private string author; private string title; public book() {} public void setauthor( string rhs ) { author = rhs; } public void settitle( string rhs ) { title = rhs; } public string tostring() { return "book: author='" + author + "' title='" + title + "'"; } } //=================================================== import java.util.vector; public class magazine { private string name; private vector articles; public magazine() { articles = new vector(); } public void setname( string rhs ) { name = rhs; } public void addarticle( article a ) { articles.addelement( a ); } public string tostring() { stringbuffer buf = new stringbuffer( "magazine: name='" + name + "' "); for( int i=0; i<articles.size(); i++ ){ buf.append( articles.elementat(i).tostring() ); } return buf.tostring(); } } //=================================================== public class article { private string headline; private string page; public article() {} public void setheadline( string rhs ) { headline = rhs; } public void setpage( string rhs ) { page = rhs; } public string tostring() { return "article: headline='" + headline + "' on page='" + page + "' "; } } |