Apache 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

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

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

相关文章

腾讯云搭svn服务器,腾讯云使用笔记二: 安装svn服务器及web同步

A01&#xff1a;安装subversionsudo apt-get install subversionA02:创建仓库很多目录可以放subversion文件仓库&#xff0c;最常见的是/usr/local/svn和/home/svnsudo mkdir -p /home/svn/youshengyousesudo svnadmin create /home/svn/youshengyouse//说明&#xff1a;先创建…

python将图像转换为8位单通道_使用Python将图片转换为单通道黑白图片

本文介绍如何使用python将图片转换为纯黑白的单通道图片。文中用到的脚本支持彩色、灰度、带alpha通道的输入图片以及SVG矢量图&#xff0c;支持调整输出图片大小以及设置灰度阈值。最后介绍如何输出SSD1306 OLED显示屏可用的XBM文件&#xff0c;并利用输出的XBM数据在0.96寸的…

Java FlameGraph 火焰图

上周一个偶然的机会听同事提到了Java FlameGraph&#xff0c;刚实验了一下&#xff0c;效果非常好。 一、什么是FlameGraph 直接看图说话。FlameGraph 是 SVG格式&#xff0c;矢量图&#xff0c;可以随意扩大缩小&#xff0c;看不清的信息可以放大看。图中&#xff0c;各种红橙…

ADB 常用命令

获取Android设备号 adb shell getprop ro.serialno 获取系统版本 adb shell getprop ro.build.version.release>4.2.2 获取系统api版本 adb shell getprop ro.build.version.sdk>17 获取设备分辨率&#xff08;SDK4.3&#xff09; adb shell wm size获取设备屏幕密度&am…

哪个Java线程消耗了我的CPU?

当您的Java应用程序占用100&#xff05;的CPU时&#xff0c;您该怎么办&#xff1f; 事实证明&#xff0c;您可以使用内置的UNIX和JDK工具轻松找到有问题的线程。 不需要探查器或代理。 为了进行测试&#xff0c;我们将使用以下简单程序&#xff1a; public class Main {publi…

烟草局计算机笔试,2020年广西南宁烟草局什么时候笔试?

最近广西烟草局各地市社招通知频发&#xff0c;南宁烟草局报名截止至今都无任何消息&#xff0c;根据往年的考情&#xff0c;通知近期很大可能会发布&#xff0c;将于6月底完成笔面!你备考好了吗&#xff1f;今天广西中公国企小编来给大家说一下南宁烟草局社招的笔试内容及备考…

JAVA Swing 组件演示***

下面是Swing组件的演示&#xff1a; package a_swing;import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.…

Spring 3.1缓存和@CacheEvict

我的上一个博客演示了Spring 3.1的Cacheable批注的应用&#xff0c; Cacheable批注用于标记返回值将存储在缓存中的方法。 但是&#xff0c; Cacheable只是Spring的Guy为缓存而设计的一对注释​​中的一个&#xff0c;另一个是CacheEvict 。 像Cacheable一样&#xff0c; Cache…

centos 获取硬件序列号_如何在 Linux 上查找硬件规格

在 Linux 系统上有许多工具可用于查找硬件规格。-- Sk&#xff08;作者&#xff09;在 Linux 系统上有许多工具可用于查找硬件规格。在这里&#xff0c;我列出了四种最常用的工具&#xff0c;可以获取 Linux 系统的几乎所有硬件&#xff08;和软件&#xff09;细节。好在是这些…

位置服务器管理器,查看 DIMM 位置

键入&#xff1a;-> show /System/Memory/DIMMs -t locationTarget | Property | Value-----------------------------------------------------------------------/System/Memory/DIMMs/ | location | CMIOU0/CM/CMP/BOB00/CH0/DIMM (CPU MemoryDIMM_0 | | IO Unit 0 Memor…

Spring –持久层–编写实体并配置Hibernate

欢迎来到本教程的第二部分。 当您看到本文有多长时间时&#xff0c;请不要惊慌–我向您保证&#xff0c;这主要是简单的POJO和一些生成的代码。 在开始之前&#xff0c;我们需要更新我们的Maven依赖项&#xff0c;因为我们现在将使用Hibernate和Spring。 将以下依赖项添加到pom…

无线服务器主机名是,wifi默认服务器主机名

wifi默认服务器主机名 内容精选换一换以CentOS 7操作系统的弹性云服务器为例&#xff1a;登录Linux弹性云服务器&#xff0c;查看“cloud-init”的配置文件。检查“/etc/cloud/cloud.cfg”文件中“update_hostname”是否被注释或者删除。如果没有被注释或者删除&#xff0c;则需…

pygame里面物体闪烁运动_利用自闪烁发光二极管探究小车在倾斜轨道上的运动规律...

2020年11月23日&#xff0c;周一&#xff0c;24小时安全值班。利用当班中午的时间&#xff0c;微主在创客空间测试了自闪烁发光二极管在匀加速运动中的效果&#xff0c;结果还比较满意。将小车放置在倾斜的轨道上&#xff0c;将自闪烁发光二极管和纽扣电池构成频闪光源&#xf…

python网络爬虫与信息提取 学习笔记day3

Day3&#xff1a; 只需两行代码解析html或xml信息 具体代码实现:day3_1 注意BeautifulSoup的B和S需要大写&#xff0c;因为python大小写敏感 import requests r requests.get("http://python123.io/ws/demo.html") r.text demo r.text from bs4 import Beauti…

番石榴文件:Java文件管理

正如我在这里 &#xff0c; 这里 &#xff0c; 这里和这里所讨论的那样&#xff0c; Groovy和Java SE 7都为Java文件管理提供了改进。 但是&#xff0c;当特定的Java应用程序尚不能使用Java SE 7或Groovy进行文件管理时&#xff0c;仍然可以通过使用Guava的Files类获得改进的文…

顺序查找

顺序查找属于查找中较容易的一个方法&#xff0c;且对数据是否已经排序没有要求&#xff0c;是很常用的一个查找算法。 但缺点是必须一个一个数字进行比较查找&#xff0c;查找所需步骤可能较多。 顺序查找算法的思想是&#xff0c;将目标与待查找数据进行比较&#xff0c;若发…

王者荣耀微信哪个服务器人最少,王者荣耀:微信区王者人数锐减,大神们都去哪了?这些原因很真实...

原标题&#xff1a;王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实王者荣耀&#xff1a;微信区王者人数锐减&#xff0c;大神们都去哪了&#xff1f;这些原因很真实大家好&#xff01;王者荣耀S16赛季已经开启一月之余&#xff…

一个div压在另一个div上面_【CSS小分享】用CSS画一个新拟态风格键盘

什么是新拟态新拟态的英文名称是“Neumorphism”&#xff0c;也有人称为“Soft UI”。简单讲&#xff0c;新拟态是一种图形样式&#xff0c;其原理是通过模拟真实物体来为界面的UI元素赋予真实感。新拟态风格起源于dribbble&#xff0c;后面陆续被收录在2020设计趋势预测里面&a…

JBoss BRMS与JasperReports进行报告

介绍 Jasperreports是一个免费的可下载库&#xff0c;可用于为Java EE应用程序生成丰富的报告。 本指南还提供了使用Jasper iReport设计器生成报告模板的步骤。 软件需求 JBoss BRMS 5.3&#xff08;从客户门户网站http://access.redhat.com &#xff09; JasperReports 4.6…

java字符串 删除指定字符的那些事

需求如下&#xff1a; 1.算出2周以前的时间&#xff0c;以正常日期格式返回 2.如果月份和日期前面有0需要去掉返回结果&#xff0c;比如&#xff1a;2017-08-15 就需要显示2017-8-15。 Calendar calendar Calendar.getInstance();calendar.add(Calendar.DATE, -14);Date date…