热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用ApacheDigester简化XML配置

本文介绍了如何利用ApacheDigester库解决硬编码问题,通过创建自定义配置文件(如Struts配置文件)来动态调整应用程序的行为。文章详细描述了使用ApacheDigester将XML文档转换为JavaBean对象的过程,并提供了具体的实现步骤。
本文旨在探讨如何通过Apache Digester解决应用程序中的硬编码问题,特别是当需要通过修改文件而非重新编译代码来改变应用行为时。Apache Digester提供了一种简便的方法,能够将XML配置文件转换成Java Bean对象,从而实现灵活的应用配置管理。

Apache Digester的核心功能在于它能轻松地将XML文档解析并转换为对应的Java Bean对象层级结构。这一过程主要依赖于三个关键概念:

  1. 元素匹配模式:定义了XML文档中的元素如何与特定的处理规则相匹配。
  2. 处理规则:指定了如何处理匹配到的XML元素,包括创建对象、设置属性等操作。
  3. 对象堆栈:用于管理解析过程中创建的对象实例,确保它们能够正确地构建为所需的对象层级结构。

为了更好地理解这一过程,我们可以通过一个具体的例子来进行说明。假设你有一个包含数据的XML文件和一个或多个Java类,你的目标是从XML文件中读取数据,并创建这些Java类的实例。

具体步骤如下:

  1. 首先,在项目的类路径中加入Apache Digester 3的JAR文件,以及其他必要的库文件,如Commons Logging、BeanUtils和CGLIB。
  2. 如果尚未存在,根据XML文件的内容创建相应的Java类,反之亦然。注意,Java类和XML文件中的属性名称及结构应当保持一致,否则需要在规则文件中提供映射。
  3. 创建一个Digester规则文件,如digester-catalog-rules.xml,用于定义XML元素与Java类之间的映射关系。
  4. 编写少量的代码,使用Digester从XML文件中加载Java对象。

接下来,我们将通过一个实际的项目结构来展示这一过程的具体实现。

这是我的Eclipse项目结构:

任务2 - 创建一个名为chain-config.xml的数据XML文件,内容如下:



























创建相应的Java类:

Catalog.java:

import java.util.ArrayList;
import java.util.List;

public class Catalog {
private String name;
private List chains = new ArrayList();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void addChains(Chain chain) {
this.chains.add(chain);
}
}

Chain.java:

import java.util.ArrayList;
import java.util.List;

public class Chain {
private String name;
private List commands = new ArrayList();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public void addCommands(Command command) {
this.commands.add(command);
}
}

Command.java:

public class Command {
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

任务3 - 创建Digester规则文件digester-catalog-rules.xml:



















任务4 - 编写客户端程序加载XML数据:

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.digester3.Digester;
import org.apache.commons.digester3.binder.DigesterLoader;
import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;
import org.xml.sax.SAXException;

public class RunProgram {
public static void main(String[] args) {
DigesterLoader digesterLoader = DigesterLoader.newLoader(new FromXmlRulesModule() {
@Override
protected void loadRules() {
loadXMLRules(getClass().getResource("/com/tatu/resources/digester-catalog-rules.xml"));
}
});

Digester digester = digesterLoader.newDigester();
List catalogs = new ArrayList();
digester.push(catalogs);

InputStream input = Digester.class.getClass().getResourceAsStream("/com/tatu/resources/chain-config.xml");
try {
Object root = digester.parse(input);
} catch (IOException | SAXException e) {
e.printStackTrace();
}
}
}

至此,我们已经成功地使用XML数据加载了Catalogs对象。需要注意的是,Digester的规则非常直观且易于理解:

  1. object-create-rule用于创建一个新的对象实例。
  2. 其他规则如set-properties-rulebean-property-setter-rule分别用于设置对象属性和嵌套元素的属性。
  3. set-next-rule用于处理递归结构,将新创建的对象添加到父对象的集合中。
  4. 如果需要自定义规则,可以继承Digester的Rule类来创建自己的规则。

如果您在XML文件和Java类之间遇到映射问题,可以考虑使用Apache Betwixt作为替代方案。虽然使用Betwixt可能会牺牲一定的灵活性,但它提供了一种更简便的方法来实现Java Bean与XML文件之间的转换。

祝您编程愉快,欢迎分享您的经验和见解!

参考资料:本文内容基于Bijay Deo在JCG上的文章《使用Apache Digester进行配置》。


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 本文详细介绍了如何准备和安装 Eclipse 开发环境及其相关插件,包括 JDK、Tomcat、Struts 等组件的安装步骤及配置方法。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • andr ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
author-avatar
jia19891213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有