郑州营销网站,官方网站优化方法,网站优化 方案,注册公司的具体步骤解决问题–硬编码#xff0c;需要为您的应用程序创建自定义配置#xff0c;例如struts配置文件#xff0c;以仅通过更改文件来改变应用程序行为。 Apache Digester可以轻松为您完成此任务。 使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结构。 请参阅… 解决问题–硬编码需要为您的应用程序创建自定义配置例如struts配置文件以仅通过更改文件来改变应用程序行为。 Apache Digester可以轻松为您完成此任务。 使用Apache Digester相当容易将XML文档转换为相应的Java bean对象层次结构。 请参阅下面的“摘要”。 Digester引入了三个重要概念 元素匹配模式 处理规则 对象堆栈。 元素匹配模式将 XML元素与处理规则相关联。 范例 你有什么 Java类 包含数据的XML文件 您有Java类和相应的xml文件。 您希望从xml数据创建Java类实例。 您需要编写哪些额外的代码。 分步任务 在类路径中添加Apache Digester 3 jar文件Commons日志jarBeanutils jarcglib jar 如果没有Java类则为相应的xml文件创建Java类。或者如果没有xml文件则根据java类创建。注-属性名称xml和java类中的层次结构应匹配否则需要在此处未提及的摘要XML规则中提供映射。 如以下示例中所述创建摘要规则XML文件 用几行来从XML加载Java对象 现在在行动– 这是我的Eclipse项目结构 任务2 –如下创建数据xml文件您要从中加载数据 例如– chain-config.xml ?xml version1.0 encodingUTF-8?catalogs!-- Default Catalog: Path Info example --catalog!-- Command that maps Path Info patterns to Commands --chain nameCOMMAND_MAPPERcommand classNameorg.apache.commons.chain.web.servlet.PathInfoMapper/command forward/pathinfo.jsp classNameorg.apache.commons.chain.apps.example.ForwardCommand//chain!-- Foo Command --chain name/foocommand attributepathinfoFooCount classNameorg.apache.commons.chain.apps.example.CountCommand//chain!-- Bar Command --chain name/barcommand attributepathinfoBarCount classNameorg.apache.commons.chain.apps.example.CountCommand//chain/catalog!-- Catalog for Request Parameter example --catalog namereqparam!-- Command that maps a Request Parameter to Commands --chain nameCOMMAND_MAPPERcommand catalogNamereqparam classNameorg.apache.commons.chain.web.servlet.RequestParameterMapper/command forward/reqparam.jsp classNameorg.apache.commons.chain.apps.example.ForwardCommand//chain!-- Foo Command --chain namefoocommand attributereqparamFooCount classNameorg.apache.commons.chain.apps.example.CountCommand//chain!-- Bar Command --chain namebarcommand attributereqparamBarCount classNameorg.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 namename*/private String name;/*** Getter of the property ttname/tt* return Returns the name.* uml.property namename*/public String getName() {return name;}/*** Setter of the property ttname/tt* param name The name to set.* uml.property namename*/public void setName(String name) {this.name name;}/*** uml.property namechains*/private ListChain chainsnew ArrayListChain();public void addChains(Chain chain){this.chains.add(chain);}} Chain.java import java.util.ArrayList;
import java.util.List;public class Chain {/*** uml.property namename*/private String name;/*** Getter of the property ttname/tt* return Returns the name.* uml.property namename*/public String getName() {return name;}/*** Setter of the property ttname/tt* param name The name to set.* uml.property namename*/public void setName(String name) {this.name name;}/*** uml.property namecommands*/private ListCommand commandsnew ArrayListCommand();/*** Setter of the property ttcommands/tt* param commands The commands to set.* uml.property namecommands*/public void addCommands(Command command) {this.commands.add(command);}} Command.java import java.util.ArrayList;
import java.util.List;public class Chain {/*** uml.property namename*/private String name;/*** Getter of the property ttname/tt* return Returns the name.* uml.property namename*/public String getName() {return name;}/*** Setter of the property ttname/tt* param name The name to set.* uml.property namename*/public void setName(String name) {this.name name;}/*** uml.property namecommands*/private ListCommand commandsnew ArrayListCommand();/*** Getter of the property ttcommands/tt* return Returns the commands.* uml.property namecommands*/public List getCommands() {return commands;}/*** Setter of the property ttcommands/tt* param commands The commands to set.* uml.property namecommands*/public void addCommands(Command command) {this.commands.add(command);}} 任务3 –创建 摘要程序 规则 digester-catalog-rules.xml ?xml version1.0?
!DOCTYPE digester-rules PUBLIC-//Apache Commons //DTD digester-rules XML V1.0//ENhttp://commons.apache.org/digester/dtds/digester-rules-3.0.dtd
digester-rulespattern valuecatalogs/catalogobject-create-rule classnameCatalog/set-properties-rule/!-- comment :bean-property-setter-rule patternname/ use as shown above if say catalognamereparam/name /catalog instead of catalog namereparam /catalog--!-- Nested Pattern for Characters --pattern valuechainobject-create-rule classnameChain/set-properties-rule/ !-- Nested Pattern for Characters --pattern valuecommandobject-create-rule classnameCommand/set-properties-rule/set-next-rule methodnameaddCommands paramtypeCommand/
/patternset-next-rule methodnameaddChains paramtypeChain/
/patternset-next-rule methodnameadd paramtypeCatalog/
/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();ListCatalog catalogs new ArrayListCatalog();// 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对象。 上述解决方案要注意的几点 object-create-rule创建一个对象 其余规则如其名称所暗示的那样简单明了object-create-rule创建一个新实例set-properties-rule从xml属性如目录元素的name属性设置对象的属性而bean-property-setter-rule设置嵌套xml元素中对象的属性例如catalog name reparam / name / catalog而不是catalog name reparam / catalog – set-next-rule 用于递归set-next-rulerule移至下一个目录链和命令标签。 您还指定了每种情况下要调用的方法该方法会将对象添加到父类中定义的集合中例如set-next-rule methodname addCommandsparamtype Command/此处为addCommands方法将命令对象添加到父链类中定义的命令收集对象。 您需要新的自定义规则请创建自摘要器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