热门标签 | 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进行配置》。


推荐阅读
  • 本教程将指导您完成 Spring Boot 应用程序中 MySQL 数据库的配置,并通过 JdbcTemplate 进行基本的数据操作测试。在此之前,我们已经成功打包并测试了 jar 和 war 包,同时实现了 JSP 页面的访问,但页面数据是静态配置的。现在,让我们一起进入数据库配置的世界。 ... [详细]
  • Apache Tomcat 安装与目录解析
    本文详细介绍了如何在Windows系统上安装Apache Tomcat 8版本,并对其主要目录结构进行了说明。包括下载、解压、配置环境变量等步骤,以及如何通过检查端口占用情况解决启动问题。 ... [详细]
  • 构建Struts 2 Web应用程序指南
    本文提供了一个详细的步骤指南,帮助开发者从零开始创建一个简单的Struts 2 Web应用程序,涵盖了从环境搭建到项目部署的全过程。 ... [详细]
  • 本文探讨了Java虚拟机(JVM)的功能,解释了为何源代码需先编译为字节码(.class),并详细介绍了Java开发工具包(JDK)和Java运行时环境(JRE)的区别及其各自的角色。此外,还将介绍如何将Java文件打包成可执行的.jar文件,并解析程序如何从硬盘加载到内存以供CPU执行。 ... [详细]
  • 持续集成概述与实践指南
    本文探讨了持续集成(CI)的基本概念、目的及其在现代软件开发中的应用。通过实例分析,帮助读者理解如何有效实施持续集成,提高软件开发效率。 ... [详细]
  • 深入理解Kafka架构
    本文将详细介绍Kafka的内部工作机制,包括其工作流程、文件存储机制、生产者与消费者的具体实现,以及如何通过高效读写技术和Zookeeper支持来确保系统的高性能和稳定性。 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • Linux: 将进程ID保存至指定文件的方法
    本文介绍如何在Linux系统中启动Java应用程序,并将该应用的进程ID(PID)记录到一个指定的文件中,以便后续监控或管理。 ... [详细]
  • Struts2(六) 用Struts完成客户列表显示
    Struts完成客户列表显示所用的基础知识在之前的随笔中已经讲过。这篇是介绍如何使用Struts完成客户列表显示。下面是完成的代码执行逻辑图:抽取项目部分代码相信大家 ... [详细]
  • php如何更改编码格式?
    php如何更改编码格式? ... [详细]
  • Jenkins 安装指南:Windows 平台详解
    本文详细介绍了如何在Windows平台上安装和配置Jenkins,包括安装步骤、启动方法及基本的系统配置,旨在帮助初次使用者顺利搭建持续集成环境。 ... [详细]
  • 本文详细介绍了MyBatis中的延迟加载功能,包括其基本概念、实现方式以及如何在实际开发中应用。通过具体的代码示例,帮助读者更好地理解和掌握这一优化数据库查询性能的重要技术。 ... [详细]
  • 本文档旨在提供详细的Java Development Kit (JDK) 安装步骤,帮助用户在Linux环境下顺利安装JDK,并进行必要的环境配置。 ... [详细]
  • 本文详细探讨了如何在 SparkSQL 中创建 DataFrame,涵盖了从基本概念到具体实践的各种方法。作为持续学习的一部分,本文将持续更新以提供最新信息。 ... [详细]
  • 本文主要探讨了Spring Boot框架中常用的请求映射注解、Starter机制、MyBatis集成方法、Spring Profiles的使用、多环境配置管理以及如何激活特定环境的配置等内容。 ... [详细]
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社区 版权所有