`
fishyu2010
  • 浏览: 24227 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Digester简介及JRXmlLoader分析

阅读更多

Digester提供一种事件驱动的xml格式数据的处理方式,它根据xml的路径模式生成不同的对象并调用指定的方法设置对象的参数。Digester提供了比SAX更高级更友好的接口,更多的实现细节都被封装了,开发人员可以更专注于语义上的处理过程。

 

使用Digester需要加载commons-digester-*.*.jar

使用Digester的基本步骤:

1、  创建一个org.apache.commons.digester.Digester类的实例

2、  设置初始化参数参数 如:

3、  (可选的)将需要初始化的对象放到Digester的对象栈中

4、  注册你希望触发事件的路径模式,如果一个路径模式注册了多个事件则事件按注册的列表顺序执行。

5、  调用digester.parse()方法解析指定的xml文件。   

Digester的属性及意义

classLoader 类加载器,当使用ObjectCreateRule FactoryCreateRule规则时使用classLoader加载规则需要的类。如果不设置程序会调用线程类加载器或者使用加载Digester时所使用的加载器。

 

errorHandler 定义自己的SAX ErrorHandler,默认的把所有解析错误输出到日志,但是Digester会继续进行解析。

 

namespaceAware 是否使用xml命名空间

 

ruleNamespaceURI 命名空间位置

 

rules 匹配规则

 

useContextClassLoader 是否使用上下文类加载器

 

validating 是否进行特点规则校验,默认执行格式良好校验

 

对象堆栈

 

通过xml文档结构,Digester会动态创建一个对象树。Digester最初开发的主要目的就是通过struts-config.xml文件让struts实现自我配置。

Digester公开一个堆栈当xml元素满足某个模式是,就会调用注册的方法去创建一个对象,并放入对象堆栈中。常用的堆栈操作方法有:

clear()  清理堆栈

peek()  获取栈顶的对象

pop()  栈顶的对象出栈

push() 对象入栈

 

一般当遇到一个元素的起始标签是创建对应的对象,当处理元素的子元素时对象呆在栈中,直到遇见元素的结束元素将对象出栈。

 

在栈中每创建一个元素,就会用一个top-1位置的对象(对象的父对象)的方法将top对象赋给top-1对象,这样就可以明确各对象之间的从属关系。

 

一个简单的办法应用根元素对应的对象就是预先见将对象的持有者入栈,然后添加addSetNext方法将跟对象赋给持有对象。

 

 

JasperReport编译jrxml加载器的分析:

 

public class JRXmlLoader

    

private Digester digester = null; 

private JasperDesign jasperDesign = null;

 

    public JRXmlLoader(Digester digester)

    {

       this.digester = digester;

    }

 

    public void setJasperDesign(JasperDesign jasperDesign)

    {

       this.jasperDesign = jasperDesign;

    }

 

    public JasperDesign loadXML(InputSource is) throws JRException

    {

           //将当前对象入栈,以便存储根元素生成的对象

           digester.push(this); 

           /*  

            * 解析输入的xml文件流 

            * */

           digester.parse(is);

             ......

    

           return this.jasperDesign;

    }

}

 

  

 

 

JRXmlDigesterFactory配置Digester匹配模式

public final class JRXmlDigesterFactory

{

/**

     * Configures the given digester for parsing jasperreport xml report definition files.

     */

    public static void configureDigester(Digester digester) throws SAXException, ParserConfigurationException

    {

       // set a composite classloader that includes both the JR classloader

       // and the context classloader

       CompositeClassloader digesterClassLoader = new CompositeClassloader(

              JRXmlDigesterFactory.class.getClassLoader(), 

              Thread.currentThread().getContextClassLoader());

       digester.setClassLoader(digesterClassLoader);

       

       digester.setErrorHandler(new ErrorHandlerImpl());

       

       digester.setNamespaceAware(true);

       

       digester.setRuleNamespaceURI(JRXmlConstants.JASPERREPORTS_NAMESPACE);

 

       /*

        * 注册创建jasperDesign的工厂

          */

       digester.addFactoryCreate("jasperReport", 

JasperDesignFactory.class.getName());

       /*

          将栈顶对象调用setJasperDesign方法放入紧邻的对象中

           即之前的JRXmlLoader digester.push(this);    

        */

       digester.addSetNext("jasperReport", "setJasperDesign", JasperDesign.class.getName());

       /*   

         将属性元素入栈     

        * */

       digester.addRule("*/property", new JRPropertyDigesterRule());

       

       /*  

         创建reportFont的对象通过 addFont将该对象赋给紧邻的对象

*/

       digester.addFactoryCreate("jasperReport/reportFont", JRReportFontFactory.class.getName());

       digester.addSetNext("jasperReport/reportFont", "addFont", JRReportFont.class.getName());

        ......

}

}

 

 

 

JasperDesignFactory创建JasperDesign对象

 

public class JasperDesignFactory extends JRBaseFactory

{

 

    

    /**

     * ObjectCreationFactory 定义的接口用于通过xml element创建对象

     */

    public Object createObject(Attributes atts)

    {

        /*

         * 创建jasperDesign对象,并取得对应的属性

         */

       JasperDesign jasperDesign = new JasperDesign();

       //获取并设置属性name    

jasperDesign.setName(

atts.getValue(JRXmlConstants.ATTRIBUTE_name));

        jasperDesign.setLanguage(

atts.getValue(JRXmlConstants.ATTRIBUTE_language));

        ......

     }

}

 

1
0
分享到:
评论

相关推荐

    digester用法测试案例

    通过分析这个案例,你可以更好地理解如何在实际项目中运用Digester来处理XML数据。 总的来说,Digester是Java开发中处理XML的一种强大工具,它通过简单的规则定义,极大地提高了开发效率,减少了手动解析XML的工作...

    利用commons-digester解析xml

    标签“源码”和“工具”表明,这个主题可能涉及对Commons Digester的源代码分析,以及如何将其作为一个工具集成到项目中。理解源码可以帮助开发者更深入地了解其工作原理,以便于定制或优化。而作为工具, Commons ...

    Digester

    Digester是Apache软件基金会下的Jakarta项目中的一个Java库,主要用于简化XML到Java对象的映射过程。在处理XML文档时,它通过匹配XML元素结构到相应的Java对象的方法调用,实现了XML解析的自动化。这个工具对于那些...

    commons-digester3-3.2-API文档-中英对照版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    Castor、digester实例

    Castor和Digester是两个在Java开发中用于对象与XML数据之间进行映射的库,它们简化了XML数据的解析和对象的序列化过程。在本文中,我们将深入探讨这两个库,以及如何通过实例来使用它们。 首先,让我们了解Castor。...

    commons-digester.jar

    `commons-digester.jar`是Apache Commons项目中的一个组件,主要功能是解析XML文档并根据预定义的规则自动创建和填充Java对象。这个组件在Java应用程序中尤其有用,特别是那些需要从XML配置文件中构建复杂对象层次...

    Digester java解析xml

    Java中的Digester库是Apache Commons项目的一部分,它提供了一种方便的方式来解析XML文档,并将解析结果映射到Java对象模型上。这个库特别适合于创建简单的XML到Java对象的映射,而不需要编写大量的手动解析代码。在...

    Tomcat7启动分析(三)Digester的使用

    在Tomcat7的启动过程中,涉及到很多内部组件的初始化,其中`Digester`是一个重要的工具,用于解析XML配置文件,将XML结构映射为Java对象。本篇文章将深入剖析`Digester`的使用以及它在Tomcat7启动过程中的作用。 `...

    commons-digester-2.1.jar

    `commons-digester-2.1.jar` 是Apache Commons项目中的一个组件,主要负责XML文档的解析和对象的创建与绑定。Apache Commons Digester库提供了一种规则驱动的方法来解析XML文档,并根据预定义的规则将XML数据映射到...

    digester使用

    《digester深度解析》 Java世界中,XML作为数据交换和配置文件的常用格式,其解析和对象绑定是一项常见的任务。Apache Commons Digester是Apache软件基金会提供的一个强大的工具,专门用于将XML文档解析为Java对象...

    Digester读取xml教程.rar

    《使用Digester解析XML的深度指南》 在Java开发中,处理XML文件是常见的任务,而Apache Commons Digester库提供了一种高效且便捷的方式来解析XML并将其映射到Java对象。本教程将深入探讨如何使用Digester来读取XML...

    Digester两种解析方式

    在Java开发中,Apache Commons Digester是一个非常有用的库,它允许开发者通过XML配置来实例化、配置和关联Java对象。 Digester提供了两种主要的解析方式,即规则硬编码和独立的规则文件,这两种方法各有其特点和...

    digester组件简化了xml文件处理操作

    ### Digester组件简化XML文件处理操作 #### 一、引言 随着Web技术的发展,XML作为数据交换格式的重要性日益凸显。然而,对于大型且复杂的XML文档进行解析与处理时,传统的方法如DOM(Document Object Model)和SAX...

    XML的解析之——使用Digester

    本文将深入探讨如何使用Apache的 Digester 库来解析XML文档,这是一款强大的工具,能够将XML数据映射到Java对象,简化了处理XML的过程。 Digester 是Apache Commons项目的一部分,它提供了一种规则驱动的方法来处理...

    commons-digester3-3.2-API文档-中文版.zip

    赠送jar包:commons-digester3-3.2.jar; 赠送原API文档:commons-digester3-3.2-javadoc.jar; 赠送源代码:commons-digester3-3.2-sources.jar; 赠送Maven依赖信息文件:commons-digester3-3.2.pom; 包含翻译后...

    Digester解析XML

    #### 一、Digester简介 **Digester** 是Apache Commons项目中的一个子项目,主要用于简化XML文档的解析工作。它建立在SAX的基础之上,通过定义一系列的模式(Pattern)和规则(Rule),能够有效地处理复杂的XML结构...

    commons-digester-2.0.rar源文件及jar文件

    《Apache Commons Digester 2.0:解析XML的利器》 Apache Commons Digester是一个Java库,主要用于将XML文档解析成Java对象。这个库的核心功能是根据预定义的规则(Rule)来读取XML文档,然后根据这些规则进行一...

    digester3.2 源码

    《digester3.2源码解析与应用实例》 Apache Digester是一个强大的Java库,用于在XML文档和Java对象之间建立映射关系,通过规则来自动解析XML并创建或更新对象结构。在digester3.2版本中,我们能够深入理解其内部...

    org.apache.commons.digester解析XML.rar

    1. **Apache Commons Digester简介** Apache Commons Digester是Apache软件基金会的一个开源项目,它提供了一种方式来将XML文档的元素与Java对象的方法调用进行绑定,这样在解析XML时可以自动创建和填充Java对象。...

Global site tag (gtag.js) - Google Analytics