digester_Apache Digester示例–轻松配置

digester

解决问题–硬编码,需要为您的应用程序创建自定义配置,例如struts配置文件,仅通过更改文件即可改变应用程序的行为。 Apache Digester可以轻松为您完成此任务。

使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结构。 请参阅下面的“摘要”。
Digester引入了三个重要概念:

  1. 元素匹配模式
  2. 处理规则
  3. 对象堆栈。

元素匹配模式将 XML元素与处理规则相关联。

范例:
你有什么:

  1. Java类
  2. 包含数据的XML文件

您有Java类和相应的xml文件。 您希望从xml数据创建Java类实例。

您需要编写哪些额外的代码。
分步任务:

  1. 在类路径中添加Apache Digester 3 jar文件,Commons日志jar,Beanutils jar,cglib jar
  2. 如果没有Java类,则为相应的xml文件创建Java类。或者,如果没有xml文件,则根据java类创建。注-属性名称,xml和java类中的层次结构应匹配,否则,需要在此处未提及的摘要XML规则中提供映射。
  3. 如以下示例中所述,创建摘要规则XML文件
  4. 使用几行来从xml加载Java对象

现在在行动–

这是我的Eclipse项目结构:

任务2 –如下创建数据xml文件,您要从中加载数据, 例如– chain-config.xml

<?xml version="1.0" encoding="UTF-8"?><catalogs><!-- Default Catalog: "Path Info" example --><catalog><!-- Command that maps "Path Info" patterns to Commands --><chain name="COMMAND_MAPPER"><command                       className="org.apache.commons.chain.web.servlet.PathInfoMapper"/><command forward="/pathinfo.jsp"  className="org.apache.commons.chain.apps.example.ForwardCommand"/></chain><!-- Foo Command --><chain name="/foo"><command attribute="pathinfoFooCount" className="org.apache.commons.chain.apps.example.CountCommand"/></chain><!-- Bar Command --><chain name="/bar"><command attribute="pathinfoBarCount" className="org.apache.commons.chain.apps.example.CountCommand"/></chain></catalog><!-- Catalog for "Request Parameter" example --><catalog name="reqparam"><!-- Command that maps a "Request Parameter" to Commands --><chain name="COMMAND_MAPPER"><command catalogName="reqparam"  className="org.apache.commons.chain.web.servlet.RequestParameterMapper"/><command forward="/reqparam.jsp" className="org.apache.commons.chain.apps.example.ForwardCommand"/></chain><!-- Foo Command --><chain name="foo"><command attribute="reqparamFooCount" className="org.apache.commons.chain.apps.example.CountCommand"/></chain><!-- Bar Command --><chain name="bar"><command attribute="reqparamBarCount" className="org.apache.commons.chain.apps.example.CountCommand"/></chain></catalog></catalogs>


创建相应的Java类 Catalog.java:

import java.util.ArrayList;
import java.util.List;public class Catalog {/*** @uml.property  name="name"*/private String name;/*** Getter of the property <tt>name</tt>* @return  Returns the name.* @uml.property  name="name"*/public String getName() {return name;}/*** Setter of the property <tt>name</tt>* @param name  The name to set.* @uml.property  name="name"*/public void setName(String name) {this.name = name;}/*** @uml.property  name="chains"*/private List<Chain> chains=new ArrayList<Chain>();public void addChains(Chain chain){this.chains.add(chain);}}


Chain.java:

import java.util.ArrayList;
import java.util.List;public class Chain {/*** @uml.property  name="name"*/private String name;/*** Getter of the property <tt>name</tt>* @return  Returns the name.* @uml.property  name="name"*/public String getName() {return name;}/*** Setter of the property <tt>name</tt>* @param name  The name to set.* @uml.property  name="name"*/public void setName(String name) {this.name = name;}/*** @uml.property  name="commands"*/private List<Command> commands=new ArrayList<Command>();/*** Setter of the property <tt>commands</tt>* @param commands  The commands to set.* @uml.property  name="commands"*/public void addCommands(Command command) {this.commands.add(command);}}


Command.java:

import java.util.ArrayList;
import java.util.List;public class Chain {/*** @uml.property  name="name"*/private String name;/*** Getter of the property <tt>name</tt>* @return  Returns the name.* @uml.property  name="name"*/public String getName() {return name;}/*** Setter of the property <tt>name</tt>* @param name  The name to set.* @uml.property  name="name"*/public void setName(String name) {this.name = name;}/*** @uml.property  name="commands"*/private List<Command> commands=new ArrayList<Command>();/*** Getter of the property <tt>commands</tt>* @return  Returns the commands.* @uml.property  name="commands"*/public List getCommands() {return commands;}/*** Setter of the property <tt>commands</tt>* @param commands  The commands to set.* @uml.property  name="commands"*/public void addCommands(Command command) {this.commands.add(command);}}

任务3 –创建 摘要程序 规则 digester-catalog-rules.xml

<?xml version="1.0"?>
<!DOCTYPE digester-rules PUBLIC"-//Apache Commons //DTD digester-rules XML V1.0//EN""http://commons.apache.org/digester/dtds/digester-rules-3.0.dtd">
<digester-rules><pattern value="catalogs/catalog"><object-create-rule classname="Catalog"/><set-properties-rule/><!-- comment :<bean-property-setter-rule pattern="name"/>  use as shown above  if say  <catalog><name>reparam</name> </catalog> instead of <catalog name="reparam"> </catalog>--><!-- Nested Pattern for Characters --><pattern value="chain"><object-create-rule classname="Chain"/><set-properties-rule/>                 <!-- Nested Pattern for Characters --><pattern value="command"><object-create-rule classname="Command"/><set-properties-rule/><set-next-rule methodname="addCommands"  paramtype="Command"/>
</pattern><set-next-rule methodname="addChains" paramtype="Chain"/>
</pattern><set-next-rule methodname="add" paramtype="Catalog"/>
</pattern>
</digester-rules>

任务4 –加载xml数据的客户端程序

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;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;import java.util.ArrayList;
import java.util.List;public class runProgram {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stub// Create an instance of the Digester from the XML rule setDigesterLoader  digesterLoader = DigesterLoader.newLoader(new FromXmlRulesModule() {@Overrideprotected void loadRules() {// TODO Auto-generated method stubloadXMLRules( getClass( ).getResource("/com/tatu/resources/digester-catalog-rules.xml"));}});
Digester digester = digesterLoader.newDigester();List<Catalog> catalogs = new ArrayList<Catalog>();// Push a reference to the plays List on to the Stackdigester.push(catalogs);// Parse the XML documentInputStream input = Digester.class.getClass().getResourceAsStream("/com/tatu/resources/chain-config.xml");try {Object root = digester.parse(input);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SAXException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

做完了 因此已经用xml数据加载了catalogs对象。
上述解决方案要注意的几点:

  1. object-create-rule创建一个对象
  2. 其余规则如其名称所暗示的那样简单明了:object-create-rule创建一个新实例,set-properties-rule从xml属性(如目录元素的name属性)设置对象的属性,而bean-property-setter-rule设置嵌套xml元素的对象的属性,例如<catalog> <name> reparam </ name> </ catalog>,而不是<catalog name ='reparam'> </ catalog>
  3. set-next-rule :(用于递归)set-next-rulerule移至下一个目录,链和命令标签。 您还指定了每种情况下要调用的方法,该方法会将对象添加到父类中定义的集合中,例如:<set-next-rule methodname ='addCommands'paramtype ='Command'/>,此处为addCommands()方法将命令对象添加到父链类中定义的命令集合对象。
  4. 您需要新的自定义规则,请创建自摘要器Rule类派生的自己的Rule类。

有任何问题,请发表您的评论。

再想一想,您不希望在xml文件和java类之间出现所有这些麻烦。 猜猜怎么着,有个避免的办法。 但是我不喜欢这个把戏,除非你很着急。 但是,每次使用快捷方式时,都必须失去灵活性。

技巧是使用Apache Betwixt。 记住要使用Betwixt,您需要使用Apache Digester 2.1。 有关更多信息,请访问apache Betwixt网站。

使用Betwixt BeanWriter将Java bean写入文件,然后使用BeanReader从该文件读取。 从BeanWriter生成文件后,就可以更改值,并在BeanReader中加载该文件。 (这里需要省略配置之间的映射)

祝您编程愉快,别忘了分享!

参考: “ 我的软件开发博客”博客中的JCG合作伙伴 Bijay Deo的示例-使用Apache Digester进行示例配置-轻松配置 。


翻译自: https://www.javacodegeeks.com/2012/09/apache-digester-example-make-easy.html

digester

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 9附加流

Java 9即将发布&#xff01; 它不仅仅是Jigsaw项目 。 &#xff08;我也很惊讶。&#xff09;它给平台带来了很多小的变化&#xff0c;我想一一看一下。 我将标记所有这些帖子&#xff0c;您可以在这里找到它们。 让我们从…开始 流 Streams学习了两个新技巧。 第一个处理前缀…

Hibernate---对象的三种状态

Hibernate---对象的三种状态 简而言之&#xff0c;hibernate本就是面向对象的基于ORM的框架&#xff0c;位于dao层&#xff0c;对数据进行操作的框架。我就谈谈hibernate的对象的三种状态。他们分别为&#xff1a;游离&#xff0c;持久和瞬时。通过代码来详解一下吧。 hibernat…

IDEA项目搭建四——使用Mybatis实现Dao层

一、引入mybatis及mysql的jar包 可以从阿里云上面查找版本&#xff0c;db操作放在dao层所以打开该层的pom.xml文件&#xff0c;找到<dependencies>节点增加两个引入 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifac…

JUnit 5 –动态测试

在定义测试时&#xff0c;JUnit 4有一个很大的弱点&#xff1a;它必须在编译时发生。 现在&#xff0c;JUnit 5将解决此问题&#xff01; Milestone 1 刚刚发布 &#xff0c;并带有全新的动态测试&#xff0c;该动态测试允许在运行时创建测试。 总览 本系列中有关JUnit 5的其他…

python基础-网络基础知识和网络编程

之前对这一块的知识,总是记不住,这次正好有系统的学习,所以决定好好的梳理一下 1. 计算机网络基础知识 1.1 互联网协议和OSI模型 *协议模型互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层,如下图所示 *每层运行常见物理设备 *每层运行常见的协议 1.2 基础网络概念…

LeetCode(90):子集 II

Medium&#xff01; 题目描述&#xff1a; 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [[2],[1],[1,2,2],[2,2],[1,2],[] ] 解题思路&…

一念成佛,一念成魔

一念成佛&#xff0c;一念成魔 前几天&#xff0c;因我与寝友的一次错误导致电脑系统崩溃&#xff0c;连开机都开不了了。可我发现我并不是很生气&#xff0c;只是用玩笑话调侃了他一下。后来想想&#xff0c;要是放在以前&#xff0c;我一定会大发脾气&#xff0c;几天都不去理…

nodejs微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

组件模块化使用

// 使用$attr可以直接在父元素上拿数据让子元素使用或者是孙元素使用 <template><div>props:{{name}},{{age}} 或者 {{$props[name]}},{{$props[age]}} <br>attrs: {{$attrs[gender]}} 在$attrs里面只会有props没有注册的属性</div> </template>…

VS2010发布、打包安装程序超全超详细

找不到原文链接 1、 在vs2010 选择“新建项目”“其他项目类型”“ Visual StudioInstaller “安装项目”&#xff1a; 命名为&#xff1a;Setup1 。 这是在VS2010中将有三个文件夹&#xff0c; 1.“应用程序文件夹”表示要安装的应用程序需要添加的文件&#xff1b; 2.“…

介绍HawkFX

如前所述&#xff0c; 我开始玩JRubyFX 。 对我来说&#xff0c;学习一些新的最佳方法可以解决用例&#xff0c;因此我开始为Hawkular创建库存浏览器。 为什么选择JRubyFX&#xff1f; 让我们首先从“什么是JRubyFX”开始&#xff1f; JRubyFX是通过JRuby引入Ruby世界的JavaFX…

HibernateTemplate

org.springframework.orm.hibernate5.HibernateTemplate 这是spring-orm-4.3.4.RELEASE.jar包中的一个类&#xff0c;这个类是对Hibernate进行了封装&#xff1b; 这是可以进行注入的属性&#xff0c;需要注入sessionFactory属性&#xff0c;因此我们需要创建一个sessionFactor…

第四章: 4.1 logging模块 | 正则表达式

修改json数据然后写入json文件中 f open(1234.json,r,encodingutf-8) data f.read() data1 json.loads(data)data1[status] 1f1 open(1234.json,w,encodingutf-8)json.dump(data1,f1) hashlib md5值的用法 #加入下面这个就可以 password input(请输入密码:)m hashlib.md…

使用保险柜管理机密

您如何存储秘密&#xff1f; 密码&#xff0c;API密钥&#xff0c;安全令牌和机密数据属于秘密类别。 那是不应该存在的数据。 在容易猜测的位置&#xff0c;不得以纯文本格式提供。 实际上&#xff0c;不得在任何位置以明文形式存储它。 可以使用Spring Cloud Config Server或…

winScp中文乱码设置

打开一个putty窗口(图一)&#xff0c;左上角鼠标左键点击&#xff0c;弹出设置界面&#xff0c;选择Change Settings&#xff0c;在图二界面的window->translation&#xff0c;Remote character set选择UTF-8&#xff0c;Apply应用即可。 转载于:https://www.cnblogs.com/ya…

多台电脑共用一个耳机、音箱

台式机电脑声卡一般有三个插孔&#xff0c;一个是麦克风&#xff0c;一个是耳机&#xff0c;另一个就是LineIn输入口了&#xff0c;买一根AUX线&#xff0c;一头插入笔记本的耳机插口&#xff0c;另一头插入台式机linein口&#xff1b;在控制面板的声音中选择线路输入&#xff…

liferay开发文档_Liferay –简单主题开发

liferay开发文档实际上&#xff0c;Liferay的6.1版本已经走了很长一段路&#xff0c;该版本完全支持JSF和IceFaces。 我一直在努力学习它的绳索&#xff0c;因为我希望使其成为我们团队中的标准协作工具。 好的软件应用程序可以解决问题&#xff0c;但是好的软件应用程序不仅可…

ACRush 楼天城回忆录

利用假期空闲之时&#xff0c;将这几年 GCJ &#xff0c; ACM &#xff0c; TopCoder 参加的一些重要比赛作个回顾。首先是 GCJ2006 的回忆。 Google Code Jam 2006 一波三折&#xff1a; Google Code Jam 2006 是我第一次到美国参加现场的程序设计比赛。 Google Code Jam 2006…

JUnit 5 –条件

最近&#xff0c;我们了解了JUnit的新扩展模型以及它如何使我们能够将自定义行为注入测试引擎。 我向你保证要看情况。 现在就开始吧&#xff01; 条件允许我们在应该执行或不应该执行测试时定义灵活的标准。 它们的正式名称是“ 条件测试执行” 。 总览 本系列中有关JUnit 5…

我的编程竞赛之路 ——中国大学生计算机编程第一人楼天城访谈

记者/陈秋歌 25岁的楼天城有“中国大学生计算机编程第一人”的称号&#xff0c;也被参加竞赛的学子们敬称为“楼教主”。他的传奇经历一直激励着众多年轻学子&#xff1a;从2001年开始参加计算机编程竞赛&#xff0c;并连获全国一等奖&#xff1b;2004年入选国家集训队&#xf…