沉睡森林@漂在北京

本处文章除注明“转载”外均为原创,转载请注明出处。

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  152 随笔 :: 4 文章 :: 114 评论 :: 0 Trackbacks

 

今天在使用Digester的时候遇到了一个问题,还没有找到很好的办法解决。
    java
文件如下:
    Digester digester = new Digester();
   digester.setValidating(false);
   digester.addObjectCreate("catalog", Catalog2.class);
   digester.addObjectCreate("catalog/hi/book", Book2.class);
   digester.addBeanPropertySetter("catalog/hi/book/author", "author");
   digester.addBeanPropertySetter("catalog/hi/book/title", "title");
   
   digester.addSetNext("catalog/book", "addBook");
   
   File input = new File("E:\\MyProjects\\Workspace\\DigesterDemo\\src\\com\\example\\demo2\\example.xml");
   
   Catalog2 c = (Catalog2) digester.parse(input);
   System.out.println(c.toString());

    xml
文件如下:
<?xml version="1.0"?>
<catalog  >
 <hi>
  <book>
   <author>Author 1</author>
   <title>Title 1</title>
  </book>
 </hi>
</catalog>

 

其中,当我加入了hi节点后,输出为null,不加入时,可以处理。即加入了hi节点后,books.size = 0

 

不知道这个问题如何才可以搞定,按照struts的源代码可以看出,struts-config/action-mappings/action  这里也同样没有actionMappings这个对象的实例。

 

后来,终于在自己的代码里面找到了问题, digester.addSetNext("catalog/book", "addBook"); 这里的代码catalog/book中间少了一个hi节点。加上马上就好了。

 

但解决上面问题的过程中,我还发现了struts下面的ConfigRuleSet对象。代码贴出来。

 

package org.apache.struts.config;

 

import org.apache.commons.digester.AbstractObjectCreationFactory;

import org.apache.commons.digester.Digester;

import org.apache.commons.digester.Rule;

import org.apache.commons.digester.RuleSetBase;

import org.apache.struts.util.RequestUtils;

import org.xml.sax.Attributes;

 

/**

 * <p>

 * The set of Digester rules required to parse a Struts configuration file (

 * <code>struts-config.xml</code>).

 * </p>

 *

 * @author Craig R. McClanahan

 * @version $Revision: 1.14 $ $Date: 2002/12/21 04:42:20 $

 * @since Struts 1.1

 */

 

public class ConfigRuleSet extends RuleSetBase {

 

     // --------------------------------------------------------- Public Methods

 

     /**

      * <p>

      * Add the set of Rule instances defined in this RuleSet to the specified

      * <code>Digester</code> instance, associating them with our namespace URI

      * (if any). This method should only be called by a Digester instance. These

      * rules assume that an instance of

      * <code>org.apache.struts.config.ModuleConfig</code> is pushed onto the

      * evaluation stack before parsing begins.

      * </p>

      *

      * @param digester

      *            Digester instance to which the new Rule instances should be

      *            added.

      */

     public void addRuleInstances(Digester digester) {

 

         digester.addObjectCreate("struts-config/data-sources/data-source",

                   "org.apache.struts.config.DataSourceConfig", "className");

         digester.addSetProperties("struts-config/data-sources/data-source");

         digester.addSetNext("struts-config/data-sources/data-source",

                   "addDataSourceConfig",

                   "org.apache.struts.config.DataSourceConfig");

 

         digester.addRule("struts-config/data-sources/data-source/set-property",

                   new AddDataSourcePropertyRule());

 

         digester.addRule("struts-config/action-mappings",

                   new SetActionMappingClassRule());

 

         digester.addFactoryCreate("struts-config/action-mappings/action",

                   new ActionMappingFactory());

         digester.addSetProperties("struts-config/action-mappings/action");

         digester.addSetNext("struts-config/action-mappings/action",

                   "addActionConfig", "org.apache.struts.config.ActionConfig");

 

         digester.addSetProperty(

                   "struts-config/action-mappings/action/set-property",

                   "property", "value");

 

         digester.addObjectCreate(

                   "struts-config/action-mappings/action/exception",

                   "org.apache.struts.config.ExceptionConfig", "className");

         digester

                   .addSetProperties("struts-config/action-mappings/action/exception");

         digester.addSetNext("struts-config/action-mappings/action/exception",

                   "addExceptionConfig",

                   "org.apache.struts.config.ExceptionConfig");

 

         digester.addSetProperty(

                   "struts-config/action-mappings/action/exception/set-property",

                   "property", "value");

 

         digester.addObjectCreate(

                   "struts-config/action-mappings/action/forward",

                   // "org.apache.struts.config.ForwardConfig",

                   "org.apache.struts.action.ActionForward", "className");

         digester

                   .addSetProperties("struts-config/action-mappings/action/forward");

         digester.addSetNext("struts-config/action-mappings/action/forward",

                   "addForwardConfig", "org.apache.struts.config.ForwardConfig");

 

         digester.addSetProperty(

                   "struts-config/action-mappings/action/forward/set-property",

                   "property", "value");

 

         digester.addObjectCreate("struts-config/controller",

                   "org.apache.struts.config.ControllerConfig", "className");

         digester.addSetProperties("struts-config/controller");

         digester.addSetNext("struts-config/controller", "setControllerConfig",

                   "org.apache.struts.config.ControllerConfig");

 

         digester.addSetProperty("struts-config/controller/set-property",

                   "property", "value");

 

         digester.addObjectCreate("struts-config/form-beans/form-bean",

         // "org.apache.struts.config.FormBeanConfig",

                   "org.apache.struts.action.ActionFormBean", "className");

         digester.addSetProperties("struts-config/form-beans/form-bean");

         digester.addSetNext("struts-config/form-beans/form-bean",

                   "addFormBeanConfig", "org.apache.struts.config.FormBeanConfig");

 

         digester.addObjectCreate(

                   "struts-config/form-beans/form-bean/form-property",

                   "org.apache.struts.config.FormPropertyConfig", "className");

         digester

                   .addSetProperties("struts-config/form-beans/form-bean/form-property");

         digester.addSetNext("struts-config/form-beans/form-bean/form-property",

                   "addFormPropertyConfig",

                   "org.apache.struts.config.FormPropertyConfig");

 

         digester

                   .addSetProperty(

                            "struts-config/form-beans/form-bean/form-property/set-property",

                            "property", "value");

 

         digester.addSetProperty(

                   "struts-config/form-beans/form-bean/set-property", "property",

                   "value");

 

         digester.addObjectCreate("struts-config/global-exceptions/exception",

                   "org.apache.struts.config.ExceptionConfig", "className");

         digester.addSetProperties("struts-config/global-exceptions/exception");

         digester.addSetNext("struts-config/global-exceptions/exception",

                   "addExceptionConfig",

                   "org.apache.struts.config.ExceptionConfig");

 

         digester.addSetProperty(

                   "struts-config/global-exceptions/exception/set-property",

                   "property", "value");

 

         digester.addObjectCreate("struts-config/global-forwards/forward",

         // "org.apache.struts.config.ForwardConfig",

                   "org.apache.struts.action.ActionForward", "className");

         digester.addSetProperties("struts-config/global-forwards/forward");

         digester.addSetNext("struts-config/global-forwards/forward",

                   "addForwardConfig", "org.apache.struts.config.ForwardConfig");

 

         digester.addSetProperty(

                   "struts-config/global-forwards/forward/set-property",

                   "property", "value");

 

         digester.addObjectCreate("struts-config/message-resources",

                   "org.apache.struts.config.MessageResourcesConfig", "className");

         digester.addSetProperties("struts-config/message-resources");

         digester.addSetNext("struts-config/message-resources",

                   "addMessageResourcesConfig",

                   "org.apache.struts.config.MessageResourcesConfig");

 

         digester.addSetProperty("struts-config/message-resources/set-property",

                   "property", "value");

 

         digester.addObjectCreate("struts-config/plug-in",

                   "org.apache.struts.config.PlugInConfig");

         digester.addSetProperties("struts-config/plug-in");

         digester.addSetNext("struts-config/plug-in", "addPlugInConfig",

                   "org.apache.struts.config.PlugInConfig");

 

         digester.addRule("struts-config/plug-in/set-property",

                   new PlugInSetPropertyRule());

 

     }

 

}

 

/**

 * Class that calls <code>addProperty()</code> for the top object on the stack,

 * which must be a <code>org.apache.struts.config.DataSourceConfig</code>.

 */

 

final class AddDataSourcePropertyRule extends Rule {

 

     public AddDataSourcePropertyRule() {

         super();

     }

 

     public void begin(Attributes attributes) throws Exception {

         DataSourceConfig dsc = (DataSourceConfig) digester.peek();

         dsc.addProperty(attributes.getValue("property"), attributes

                   .getValue("value"));

     }

 

}

 

/**

 * Class that records the name and value of a configuration property to be used

 * in configuring a <code>PlugIn</code> instance when instantiated.

 */

 

final class PlugInSetPropertyRule extends Rule {

 

     public PlugInSetPropertyRule() {

         super();

     }

 

     public void begin(Attributes attributes) throws Exception {

         PlugInConfig plugInConfig = (PlugInConfig) digester.peek();

         plugInConfig.addProperty(attributes.getValue("property"), attributes

                   .getValue("value"));

     }

 

}

 

/**

 * Class that sets the name of the class to use when creating action mapping

 * instances. The value is set on the object on the top of the stack, which must

 * be a <code>org.apache.struts.config.ModuleConfig</code>.

 */

final class SetActionMappingClassRule extends Rule {

 

     public SetActionMappingClassRule() {

         super();

     }

 

     public void begin(Attributes attributes) throws Exception {

         String className = attributes.getValue("type");

         if (className != null) {

              ModuleConfig mc = (ModuleConfig) digester.peek();

              mc.setActionMappingClass(className);

         }

     }

 

}

 

/**

 * An object creation factory which creates action mapping instances, taking

 * into account the default class name, which may have been specified on the

 * parent element and which is made available through the object on the top of

 * the stack, which must be a <code>org.apache.struts.config.ModuleConfig</code>

 * .

 */

final class ActionMappingFactory extends AbstractObjectCreationFactory {

 

     public Object createObject(Attributes attributes) {

 

         // Identify the name of the class to instantiate

         String className = attributes.getValue("className");

         if (className == null) {

              ModuleConfig mc = (ModuleConfig) digester.peek();

              className = mc.getActionMappingClass();

         }

 

         // Instantiate the new object and return it

         Object actionMapping = null;

         try {

              actionMapping = RequestUtils.applicationInstance(className);

         } catch (Exception e) {

              digester.getLogger()

                       .error("ActionMappingFactory.createObject: ", e);

         }

 

         return actionMapping;

     }

 

}



posted on 2008-10-17 18:26 王总兵 阅读(502) 评论(0)  编辑  收藏 所属分类: Digester

只有注册用户登录后才能发表评论。


网站导航: