Commons-digester:规则引擎全实例
??? 这个文件是告知digester如何解析和映射"table-rules.xml",它的主要作用就是声明XML与javabean映射关系。这个xml中的格式是已经约定的,你不能随意创建自己的节点元素。
??? 1) <pattern>的value属性为需要匹配的table-rules.xml中的元素节点名称,比如“rules”。
??? 2) <object-create-rule>表示“遇到”指定pattern的节点,将会创建一个java对象,此对象的为className类型。被创建的对象,将放在解析stack的顶部。
??? 3) <set-properties-rule>表示“对stack顶”的对象进行“属性赋值”操作,比如<rule>节点使用“set-properties”将会导致“id”属性的setter方法被调用。
??? 4) <set-next-rule>获取将“解析stack顶”的对象(stack.pop()),并执行“top-element”对象的“methodname”指定的方法;(实例中讲解)
??? 5) <call-method-rule>调用“解析stack顶”的对象的指定方法,参数值为当前pattern匹配的节点的值,paramcount为“方法的参数列表的个数”,0表示“只有一个参数”的方法,paramtypes为“方法的参数列表”的类型(","分割),如果paramtypes未声明,将会执行无参的方法。
?
三.Java实例:
??? 1) 测试类:
??? 2) TableRulePool.java:用来保存XML解析的结果,所有的rules列表,它做为digester解析时的“top-element”,当解析table-rules.xml时,遇到“<rule>”节点时,将会创建TableRule对象,并根据<set-next-rule>中指定的put方法,将tableRule实例放入列表中。
??? 2) ConfigRuleSet.java:使用java设定“规则”解析方式,取代table-rule-pattern.xml
public class ConfigRuleSet extends RuleSetBase {@Overridepublic void addRuleInstances(Digester digester) {//digester.push(TableRulePool.getInstance());digester.addObjectCreate("*/rule", "com.test.tableRule.object.TableRule");digester.addSetProperties("*/rule");digester.addSetNext("*/rule", "put");digester.addCallMethod("*/rule/table", "setTable",0,new String[]{"java.lang.String"});digester.addCallMethod("*/rule/size", "setSize",0,new String[]{"java.lang.Integer"});digester.addCallMethod("*/rule/type", "setSize",0,new String[]{"java.lang.String"});digester.addCallMethod("*/rule/delimiter", "setDelimiter",0,new String[]{"java.lang.String"});digester.addCallMethod("*/rule/strategy", "setStrategy",0,new String[]{"java.lang.String"});}}??? 可以看出java代码和xml的声明的方式很类似,顺序也需要一样。
?
--END--