Apache之Digester (2)

来源:互联网 发布:淘宝介入一般是谁赢 编辑:程序博客网 时间:2024/04/30 03:09

  BeanPropertySetterRule:Bean属性设置规则,对匹配当前指定模式的元素设置bean属性同名或者指定属性的值。
    对应Digester中有关这个规则的Javadoc方法说明:
      addBeanPropertySetter(java.lang.String pattern)  - 对匹配当前指定模式的元素设置bean属性同名属性的值。
      addBeanPropertySetter(java.lang.String pattern, java.lang.String propertyName)  - 对匹配当前指定模式的元素设置bean属性指定属性的值。
      
    CallMethodRule:方法调用规则,对匹配当前指定模式的元素,初始化指定的方法类型和方法参数,并压入堆栈。此规则需要和CallMethodRule
    规则配合使用:
    对应Digester中有关这个规则的Javadoc方法说明:
      addCallMethod(java.lang.String pattern, java.lang.String methodName) - 初始化指定的方法,只是当前方法不需要任何参数。
      addCallMethod(java.lang.String pattern, java.lang.String methodName, int paramCount) - 初始化指定的方法,参数个数为
      paramCount,参数类型缺省为java.lang.String。注意有种特殊情况,就是paramCount为0的时候,默认使用当前元素的字符数据作为
      参数值。
      addCallMethod(java.lang.String pattern, java.lang.String methodName, int paramCount, java.lang.Class[] paramTypes) -
      同上,只是有指定的参数类型.
      addCallMethod(java.lang.String pattern, java.lang.String methodName, int paramCount, java.lang.String[] paramTypes) -
      同上
      
    CallParamRule:提供CallMethodRule规则所需要的参数,必须跟CallMethodRule配合使用。
    对应Digester中有关这个规则的Javadoc方法说明:
      addCallParam(java.lang.String pattern, int paramIndex) - 使用匹配当前指定模式元素的字符数据作为索引为paramIndex的参数值.
      addCallParam(java.lang.String pattern, int paramIndex, boolean fromStack)  - 从操作数栈中,默认取出栈顶对象作为索引
      为paramIndex的参数值.
      addCallParam(java.lang.String pattern, int paramIndex, int stackIndex)  - 从操作数栈中,取出从栈顶数第stackIndex + 1个
      对象作为索引为paramIndex的参数值.
      addCallParam(java.lang.String pattern, int paramIndex, java.lang.String attributeName) - 使用属性attrbuteName的值作为
      索引为paramIndex的参数值.
      
    PathCallParamRule:提供当前匹配的模式路径作为方法调用所需要的参数,配合CallMethodRule使用。
    对应Digester中有关这个规则的Javadoc方法说明:
      addCallParamPath(java.lang.String pattern, int paramIndex) - 指定索引为paramIndex的值为当前匹配模式的路径.
     
    ObjectParamRule;指定对象作为指定索引的值,配合CallMethodRule使用。
    对应Digester中有关这个规则的Javadoc方法说明:
      addObjectParam(java.lang.String pattern, int paramIndex, java.lang.Object paramObj) - 指定索引为paramIndex的值为给定
      的对象的值.
      
    SetNestedPropertiesRule:当前匹配模式的直接子元素和对应bean的属性之间的映射.
    对应Digester中有关这个规则的Javadoc方法说明:
      addSetNestedProperties(java.lang.String pattern)  - 默认当前匹配模式的元素的直接子元素和bean中对应属性之间值的映射
      addSetNestedProperties(java.lang.String pattern, java.lang.String[] elementNames, java.lang.String[] propertyNames)   - 
      当前匹配模式的直接子元素集和bean中属性集之间的映射
      addSetNestedProperties(java.lang.String pattern, java.lang.String elementName, java.lang.String propertyName) -
      当前匹配模式的直接子元素和bean中属性之间的映射
 

  SetNextRule:匹配当前模式时,将栈顶对象作为次栈顶对象中指定方法的参数。
  对应Digester中有关这个规则的Javadoc方法说明:
    addSetNext(java.lang.String pattern, java.lang.String methodName) - 指定次栈顶元素的方法名称,将栈顶对象作为指定方法的参数。
    addSetNext(java.lang.String pattern, java.lang.String methodName, java.lang.String paramType) - 指定次栈顶元素的方法名称和参数类型,将栈顶对象作为指定方法的参数。

  SetPropertiesRule:匹配当前模式的元素的属性与栈顶对象中同名或者指定对应关系的属性值。
  对应Digester中有关这个规则的Javadoc方法说明:
    addSetProperties(java.lang.String pattern) - 指定栈顶对象属性的值为当前匹配元素中同名元素属性的值。
    addSetProperties(java.lang.String pattern, java.lang.String[] attributeNames, java.lang.String[] propertyNames) - 对应栈顶对象属性的值为指定的当前匹配元素中元素属性的值
    addSetProperties(java.lang.String pattern, java.lang.String attributeName, java.lang.String propertyName)  - 同上

  SetPropertyRule:不常用的一个规则,主要用于key-value值对。一个元素属性为栈顶对象的属性,一个元素属性为栈顶对象的属性的值。
  对应Digester中有关这个规则的Javadoc方法说明:
    addSetProperty(java.lang.String pattern, java.lang.String name, java.lang.String value) - name和value都是匹配当前模式的元素属性,name的值是栈顶对象中同名的属性名称,而value的值是栈顶对象中属性名称为name的值。(好像有点绕口)

  SetRootRule:将当前栈顶对象作为根对象中指定方法的参数。
  对应Digester中有关这个规则的Javadoc方法说明:
    addSetRoot(java.lang.String pattern, java.lang.String methodName) - 将当前栈顶对象作为根对象中指定为methodName方法的参数。
    addSetRoot(java.lang.String pattern, java.lang.String methodName, java.lang.String paramType) -  同上,只是多了一个方法参数的类型

  SetTopRule:与SetNextRule正好想法,是将次栈顶元素作为栈顶元素指定方法的参数。
  对应Digester中有关这个规则的Javadoc方法说明:
    addSetTop(java.lang.String pattern, java.lang.String methodName) - 将次栈顶元素作为栈顶元素指定为methodName方法的参数。
    addSetTop(java.lang.String pattern, java.lang.String methodName, java.lang.String paramType) -  同上,只是多了一个方法参数的类型

  前面介绍的基本就是digester的常用主要用法,正常来说足够了!不过为了提供一些额外更强大的扩展,digester提供了扩展的通配符匹配规则,更强大也更方便!那就是ExtendedBaseRules,这个类扩展了基本的匹配规则RulesBase,提供了更通用的通配符匹配规则,以下简要介绍一下:
  首先说一下基本的匹配模式,有三种:
  Parent Match(可以理解为匹配子元素的精确父匹配):a/b/c/? */a/b/c/?
  Ancester Match(可以理解为匹配那种出身自一个精确序列元素的元素):a/b/* */a/b/*
  Universal Wildcard Match(可以理解为通配符匹配,都以!开头):!*a/b !a/b/? !*a/b/? !a/b/* !*/a/b/*
  Wild Match (可以理解为更通用更模糊的通配符匹配):* !*

  ?代表直接子元素
  * 代表任意的父或子元素
  ! 代表以什么什么为开头

  举个例子:
        Digester digester = new Digester();
        digester.setRules(new ExtendedBaseRules());
        digester.setValidating(false);
        
        
        digester.addObjectCreate("!*/b", BetaBean.class);
        digester.addObjectCreate("!*/a", AlphaBean.class);
        digester.addObjectCreate("root", ArrayList.class);
        digester.addSetProperties("!*";
        digester.addSetNext("!*/b/?", "setChild";
        digester.addSetNext("!*/a/?", "setChild";
        digester.addSetNext("!root/?", "add";
        ArrayList root = 
            (ArrayList) digester.parse(getInputStream("Test4.xml");
        
        assertEquals("Wrong array size", 2, root.size());
        AlphaBean one = (AlphaBean) root.get(0);
        assertTrue(one.getChild() instanceof BetaBean);
        BetaBean two = (BetaBean) one.getChild();
        assertEquals("Wrong name (1)", two.getName() , "TWO";
        assertTrue(two.getChild() instanceof AlphaBean);
        AlphaBean three = (AlphaBean) two.getChild(); 
        assertEquals("Wrong name (2)", three.getName() , "THREE";       
        BetaBean four = (BetaBean) root.get(1);
        assertEquals("Wrong name (3)", four.getName() , "FOUR";
        assertTrue(four.getChild() instanceof BetaBean);
        BetaBean five = (BetaBean) four.getChild(); 
        assertEquals("Wrong name (4)", five.getName() , "FIVE";

   Test4.xml文件:
   
    <root>
      <a name="ONE">
        <b name="TWO">
            <a name="THREE"/>
        </b>
      </a>
      <b name="FOUR">
        <b name="FIVE"/>
      </b>
    </root>

原创粉丝点击