`
8366
  • 浏览: 810193 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

digester框架 将 XML->JavaBean

阅读更多

digester组件简化了xml文件处理操作,能将xml文件按照事先确定的规则(采用编码形式或xml配置文件形式),映射成java对象。digester组件现在最新版本是2.0,它所依赖的组件是:commons-logging(推荐1.1版本),BeanUtils(推荐1.8版本),还有需要jdk1.5.


基本概念
1. 在Digester的内部采用SAX来解析XML文件。为了能够正确的使用它,必须在解析之前进行相应的设置。同时,在解析xml文件的过程中,它使用Stack来保存和检索这个期间产生的对象.
2. 为了简化使用,它通过匹配模式来定位要解析的xml标签。匹配模式的例子如下:

<?xml version="1.0"?>
<students>
 <student>
 <name>Tom</name>
 <course>JSP</course>
 </student>
 <student>
 <name>Mary</name>
 <course>J2EE</course>
 </student>
</students>

 

每个标签与相应的匹配模式对应如下表:
标签              匹配模式
<students> students
<student>  students/student
<name>     students/student/name
<course>   students/student/course


3. 使用匹配模式可以很方便的定位需要处理的元素,为了处理这些元素,需要定义处理规则。规则在匹配模式被找到时起作用。所有的规则都是从org.apache.commons.digester.Rule派生的。所有已定义的Rule对象,可以在org.apache.commons.digester中找到。


常用的规则:
- ObjectCreate,创建对象实例。
- SetProperties,将标签属性(Attribute)与要创建的对象的属性相关联。
- BeanPropertySetter,将标签所包含标签与要创建的对象的属性相关联。
- SetNext,设置遇到下一个标签时的动作。
- CallMethod,设置当匹配模式被找到时要调用的方法。
- CallParam,设置对应的callMethod中指定方法所需要的参数值。


基本使用
以正确的顺序调用Digester方法是成功使用Digester处理XML文件的关键。使用步骤如下:
1. 创建org.apache.commons.digester.Digester实例并配置,包括设置实现Digester Rule的对象。
2. 使用Digester的push方法在Digester使用的stack中放置一个初始对象。在解析xml文件的过程中,Digester使用stack来保存它所找到的对象。第一个对象在遇到第一个标签时被放置到stack中,当最后一个标签处理完毕时被弹出。为了最后能检索到这个对象,因此需要一个初始对象来保留一个指向它的引用。
3. 注册匹配模式和rule。
4. 调用parse来解析xml文件。


使用举例
1.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<students>
 <student>
 <name>Tom</name>
 <course>JSP</course>
 </student>
 <student>
 <name>Mary</name>
 <course>J2EE</course>
 </student>
</students>

 

2.硬编码形式实现
Student类

package com.tongda.whl.digester;
public class Student {
 private String name;
 private String course;
 public void setName(String name){
  this.name=name;
 }
 public void setCourse(String course){
  this.course=course;
 }
 public String getName(){
  return this.name;
 }
 public String getCourse(){
  return this.course;
 }
}
处理类
view plaincopy to clipboardprint?
package com.tongda.whl.digester;   
import org.apache.commons.digester.*;   
import org.apache.commons.logging.*;   
import java.io.IOException;   
import java.util.Vector;   
import org.apache.commons.digester.xmlrules.*;   
import org.xml.sax.SAXException;   
public class DigestTest {   
 private Log log=LogFactory.getLog(this.getClass());   
 private Vector students;   
 public DigestTest(){   
  students= new Vector(5);   
 }   
 public void addStudent( Student student){   
  students.add( student);   
 }   
 public String toString(){   
  return ((Student)students.get(0)).getName();   
 }   
 public void digest(){   
  //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0   
  //创建实例   
  Digester digester= new Digester();   
  //将初始对象压入digester的stack   
  digester.push( this);   
  //指明匹配模式和要创建的类   
  digester.addObjectCreate( "students/student", Student.class);   
  //设置对象属性   
 // digester   
  digester.addBeanPropertySetter( "students/student/name");   
  digester.addBeanPropertySetter( "students/student/course");   
  //当移动到下一个标签中时的动作   
  digester.addSetNext( "students/student", "addStudent");   
  try {   
  //解析,xml文件放在classpath下   
   DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml"));     
    log.info(ds);   
  } catch (Exception e) {   
  e.printStackTrace();   
   }   
 }   
 public static void main(String args[]){   
  DigestTest test=new DigestTest();   
  test.digest();   
 }    
}  
package com.tongda.whl.digester;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.xmlrules.*;
import org.xml.sax.SAXException;
public class DigestTest {
 private Log log=LogFactory.getLog(this.getClass());
 private Vector students;
 public DigestTest(){
  students= new Vector(5);
 }
 public void addStudent( Student student){
  students.add( student);
 }
 public String toString(){
  return ((Student)students.get(0)).getName();
 }
 public void digest(){
  //digest2.0支持jdk1.5,并且依赖 logging 1.1.1 和 beanutils 1.8.0
  //创建实例
  Digester digester= new Digester();
  //将初始对象压入digester的stack
  digester.push( this);
  //指明匹配模式和要创建的类
  digester.addObjectCreate( "students/student", Student.class);
  //设置对象属性
 // digester
  digester.addBeanPropertySetter( "students/student/name");
  digester.addBeanPropertySetter( "students/student/course");
  //当移动到下一个标签中时的动作
  digester.addSetNext( "students/student", "addStudent");
  try {
  //解析,xml文件放在classpath下
   DigestTest ds= (DigestTest)digester.parse( getClass().getClassLoader().getResourceAsStream( "students.xml"));  
    log.info(ds);
  } catch (Exception e) {
  e.printStackTrace();
   }
 }
 public static void main(String args[]){
  DigestTest test=new DigestTest();
  test.digest();
 } 
}


结果显示:Tom
3.配置文件方式实现
 配置文件:studentsRule.xml
 <?xml version="1.0"?>
<digester-rules>
 <pattern value="students">
 <object-create-rule classname="com.tongda.whl.digester.Students" />
 <set-properties-rule />
 <pattern value="student">
 <object-create-rule classname="com.tongda.whl.digester.Student" />
 <bean-property-setter-rule pattern="name"/>
 <bean-property-setter-rule pattern="course"/>
 <set-next-rule methodname="addStudent" />
 </pattern>
 </pattern>
</digester-rules>
Student类
package com.tongda.whl.digester;
public class Student {
 private String name;
 private String course;
 public void setName(String name){
  this.name=name;
 }
 public void setCourse(String course){
  this.course=course;
 }
 public String getName(){
  return this.name;
 }
 public String getCourse(){
  return this.course;
 }
}
Students类
package com.tongda.whl.digester;
import java.util.Vector;
public class Students {
  private Vector students;
  public Students(){
   students= new Vector(5);
 }
  public void addStudent( Student student){
   students.add( student);
  }
  public String toString(){
     return ((Student)students.get(0)).getName();
  }
}
处理类
view plaincopy to clipboardprint?
package com.tongda.whl.digester;   
import org.apache.commons.digester.*;   
import org.apache.commons.logging.*;   
import java.io.IOException;   
import java.util.Vector;   
import org.apache.commons.digester.xmlrules.*;   
import org.xml.sax.SAXException;   
public class DigestTest {   
 private Log log=LogFactory.getLog(this.getClass());   
 public void digestByConfig(){   
  Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml"));   
  try {   
  Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml"));   
     System.out.println(a);   
  log.info(a);   
  } catch (IOException e) {   
  e.printStackTrace();   
 } catch (SAXException e) {   
  e.printStackTrace();   
 }   
 }   
 public static void main(String args[]){   
  DigestTest test=new DigestTest();   
  test.digestByConfig();   
 }    
}  
package com.tongda.whl.digester;
import org.apache.commons.digester.*;
import org.apache.commons.logging.*;
import java.io.IOException;
import java.util.Vector;
import org.apache.commons.digester.xmlrules.*;
import org.xml.sax.SAXException;
public class DigestTest {
 private Log log=LogFactory.getLog(this.getClass());
 public void digestByConfig(){
  Digester digester = DigesterLoader.createDigester(this.getClass().getClassLoader().getResource("studentsRule.xml"));
  try {
  Students a= (Students)digester.parse( this.getClass().getClassLoader().getResourceAsStream("students.xml"));
     System.out.println(a);
  log.info(a);
  } catch (IOException e) {
  e.printStackTrace();
 } catch (SAXException e) {
  e.printStackTrace();
 }
 }
 public static void main(String args[]){
  DigestTest test=new DigestTest();
  test.digestByConfig();
 } 
}
 

 

 

结果显示:Tom


在使用Digester需要注意的地方:
1- 调用顺序,正确的调用顺序才能得出正确的结果。方法调用顺序基本和标签在xml文件中的层次关系相对应。基本的顺序是:先创建对象;然后设置属性;随后处理子元素;最后设置遇到下一个元素所对应的动作。对于子元素的处理,是同样的过程。
2- 正确的使用初始对象。对比上面2个例子,之所以在第一个例子中显示的调用了digester的push方法,其原因就在于我们并没有如第二个例子一样用xml的root元素创建一个实例。如果不显式的调用,我们将会丢失这个元素的引用,那么也就无法得到后续的对象。
3- digester的addSetNex方法中所指定的方法实际上是包含匹配模式对应标签的父标签对应对象的方法。在上两个例子中addStudent,都是包含Student对象的那个对象的方法。对于第一个例子,是DigesterTest;对于第二个例子,是Students。而且它的位置通常是在创建对象语句组的最后,与addObjectCreate相对应。在这2个语句之间的代码中所指定的方法都是所创建对象的方法。而且它们的顺序与匹配模式所对应的标签的顺序必须是一致的。
4- 使用配置文件来创建digester,这样会带来很大的灵活性。

 

参考:

 

http://blog.csdn.net/terryzero/archive/2009/07/08/4332257.aspx

分享到:
评论

相关推荐

    quartz-1.6.0/commons-beanutils/commons-digester-1.7 JAR包

    Digester提供了一种从XML文档创建Java对象结构的方式,它可以根据预定义的规则集(RuleSet)自动解析XML,并调用相应的JavaBean方法,实现XML到Java对象的映射。这个库特别适用于那些XML配置文件需要转化为Java对象...

    xml与javabean的相互转换

    除了JAXB,还可以使用DOM API手动解析XML并设置JavaBean的属性,或者使用第三方库如Apache的Digester或XStream等进行转换。 在实际应用中,我们还需要关注一些细节问题,比如XML命名空间(Namespace)的处理、XML...

    struts基本知识介绍

    -- 定义Action映射 --&gt; 的路径" type="Action的类全名" name="form的名字" scope="request|session"&gt; 在自定义的Action中使用的findForward方法的参数" path="跳转页面的路径" redirect="false"/&gt; &lt;/action&gt; ...

    JSF入门及基础知识

    下面是一个简单的JSF后端Bean的例子,用于演示如何定义一个简单的JavaBean类,并通过JSF框架将其绑定到页面组件上。 ```java package onlyfun.caterpillar; public class UserBean { private String name; ...

    Struts1.x.pdf

    -- 其他配置 --&gt; &lt;/message-resources&gt; &lt;/struts-config&gt; ``` 以上是对Struts 1.x框架的基本介绍及其在MVC设计模式中的具体实现方式,以及相关的构成元素和配置细节。通过深入理解这些内容,开发者可以更好地利用...

    java 处理xml的三种技术

    Digester是Apache软件基金会的一个开源项目,它基于SAX解析器,但提供了更高级的抽象,将XML数据转换为Java对象(JavaBean)。Digester通过匹配XML元素和属性与JavaBean的setter方法,自动创建和填充Java对象。这...

    commons-beanutils+chain+digester_jar包

    例如,可以先使用 Digester 解析XML配置文件,生成对应的Java对象,然后利用 BeanUtils 来处理这些对象的属性,最后通过 Chain 来定义并执行整个业务流程。这样的组合提供了强大的灵活性和可扩展性,使得开发者能够...

    aspectjrt、aspectjweaver、commons-beanutils、commons-digester

    这在处理XML配置文件时非常有用,例如在Spring框架中,digester被用来解析bean定义XML文件,创建和配置Java对象。使用Digester可以减少手动解析XML的繁琐工作,使代码更加简洁和可维护。 这些库在Java开发中的应用...

    digester学习笔记

    Apache Commons Digester 是一个用于处理XML文档的Java库,它允许开发者通过定义一系列规则来将XML数据映射到Java对象的属性或者创建新的Java对象。这个库特别适用于配置文件的解析,因为它简化了从XML到Java对象...

    struts1jar包说明

    - **简介**:Digester是Jakarta Commons项目下的一个组件,主要用于将XML文档转换为Java对象模型。 - **功能**: - 解析XML配置文件,如`struts-config.xml`,并将其转换为对应的Java对象。 - 支持模式匹配和事件...

    apache-commons源码及jar文件

    Betwixt提供将 JavaBean 映射至 XML 文档,以及相反映射的服务. Chain Chain 提供实现组织复杂的处理流程的“责任链模式”. CLI CLI 提供针对命令行参数,选项,选项组,强制选项等的简单API. Codec Codec 包含...

    commons jar包

    Digester通过定义规则集(RuleSet),可以自动将XML文档的元素映射到Java对象的创建和方法调用上。这在处理XML配置文件时特别有用,可以避免手动解析XML并构建相应的Java对象。开发者可以定义一系列匹配模式,当解析...

    Java架构设计.pdf

    - DOM(Document Object Model)、SAX(Simple API for XML)和Digester是处理XML文档的解析器。 - SOA中的XML绑定涉及将XML数据与Web服务交互的细节。 8. 开发工具与技术 - JBoss Developer Studio是一个集成...

    框架中常用的jar包作用

    1. **commons-digester.jar**:提供了基于规则的XML文档解析能力,主要用于将XML文件解析并映射到Java对象上,方便处理XML配置。 2. **commons-beanutils.jar**:这是Apache Commons库的一部分,封装了Java反射和...

    深入struts1核心思想.doc

    1. **Digester框架**: Digester是Apache Commons库的一部分,主要用于XML文档的解析和转换。在Struts1中,Digester用于将XML配置文件(如struts-config.xml)解析成Java对象。它通过匹配XML元素路径来创建和初始化...

    struts1.2-jars.rar 所有jar包

    2. `commons-digester.jar`:Apache Commons Digester,用来解析XML配置文件,创建和配置Java对象。 3. `commons-fileupload.jar`:Apache Commons FileUpload,处理HTTP请求中的文件上传功能。 4. `commons-logging...

    110个知名Java项目集锦

    - **简介**:Digester 是一个用于配置 XML/Java 映射的工具,可以在识别到模式后执行相应的动作。 - **特点**: - 支持基于规则的 XML 解析。 - 可以用来构建复杂的 XML 处理逻辑。 - 提供了一种灵活的方式来配置...

    struts-1.3.10-all

    8. **commons-digester-1.8.jar**:Apache Commons Digester库,用于读取XML文档,并根据预定义的规则自动创建和初始化Java对象。 9. **commons-validator-1.3.1.jar**:Apache Commons Validator,提供了数据验证...

    java常用扩展工具jar包详解

    `commons-digester.jar`库主要用于将XML文档解析为Java对象,其工作原理类似于栈,但提供了更高级的封装。主要特点包括: - 可以通过模式匹配XML元素,从而触发相应的事件处理器,将XML元素的数据转换并存储到Java...

Global site tag (gtag.js) - Google Analytics