Betwixt适用分析

 

功能说明

提供了将 beans 转换成 XML 的方法

 

需要的包

commons-collections-3.2.jar

commons-logging-1.0.4.jar

commons-beanutils-1.8.0-BETA.jar

说明

betwixt也可以将xml转化成为bean ,功能上和commons- digester相同,实际上它也只是对commons-digester进行了一个包装和扩展,因此如果需要"xml转化成为bean",则需要 commons-digester-1.8.jar,这个jar放到not nessary文件夹下

 

实例一(example1)

实现功能

把下面这个java类转化成为xml文件

转化结果形为:

     代码部分:

       <?xml version='1.0' encoding='GB2312' ?>

           < 最外层包装 >

             < 一个 BeanJava 对象 这个配置文件中定义的值 ="1.0" String 类型对象 ="aaa" >

               <int 类型对象 >12</int 类型对象 >

               <ArrayList 类型对象 >

                 <ArrayList 中的值 >al1</ArrayList 中的值 >

                 <ArrayList 中的值 >al2</ArrayList 中的值 >

               </ArrayList 类型对象 >

               <Map 类型对象 >

                 <Map 中的值 >

                   <key>key2</key>

                   <value>value2</value>

                 </Map 中的值 >

                 <Map 中的值 >

                   <key>key1</key>

                   <value>value1</value>

                 </Map 中的值 >

               </Map 类型对象 >

             </ 一个 BeanJava 对象 >

           </ 最外层包装 >

 

         // 定义一个 Writer

        StringWriter outputWriter = new StringWriter();

        outputWriter.write( " /n" ); //xml 的头

        outputWriter.write( "< 最外层包装 >/n" );//

         // 定义一个 BeanWriter

        BeanWriter beanWriter = new BeanWriter(outputWriter);

/**************** 下面是一些属性设定项 , 都不是必须的 **********************/

         // 是否禁止 id 属性 (id 属性是 betwixt 自动添加的 )

        beanWriter.getBindingConfiguration().setMapIDs(false );

//         当遇到 ArrayList 或者 Map 时做一个包装

        beanWriter.getXMLIntrospector().getConfiguration().setWrapCollectionsInElement(true );

         // 是否以 attribute 的形式显示简单的 id

    beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false );

         // 每行结束时用什么字符 , 这里用一个换行符

        beanWriter.setEndOfLine("/n" );

         // 是否以缩进方式显示

        beanWriter.enablePrettyPrint();

         // 如果是 null 就写一个空值

        beanWriter.setWriteEmptyElements(false );

/********************* 属性设定项完毕 *********************************/

ArrayList al=new ArrayList();

al.add("al1" );

al.add("al2" );

 

Map map=new HashMap();

map.put("key1" , "value1" );

map.put("key2" , "value2" );

// 定义 BeanJava

BeanJava bj1=new BeanJava("aaa" ,12,al,map);

//        beanWriter.write("bjg", bj1);//javabean 转化成为了 XML, 这个方法自定义顶层元素名字

         beanWriter.write(bj1); //javabean 转化成为了 XML, 用默认的

        outputWriter.write( "最外层包装 >" );

 

说明:

  1. 这个目录下有个 BeanJava.betwixt 文件 , 定义了 xml 文件的显示方式 , 文件命名必须和类文件 BeanJava 同名 .
  2. 这个文件不是必须的 , 如果没有 , 则显示成下面的形式

 

  <BeanJava>

    <a_s>aaa</a_s>

    <b_i>12</b_i>

    <c_al>

      <String>al1</String>

      <String>al2</String>

    </c_al>

    <d_map>

      <entry>

        <key>key2</key>

        <value>value2</value>

      </entry>

      <entry>

        <key>key1</key>

        <value>value1</value>

      </entry>

    </d_map>

</BeanJava>

 

 

 

 

 

 

可以看到 , 它是按照属性名来定义根节点的

3 BeanJava.betwixt 文件

 

 

        

 

 

 

  

<info primitiveTypes="attribute">

    <element name=' 一个 BeanJava 对象 '>

       <attribute name=' 这个配置文件中定义的值 ' value='1.0'/>

        <attribute name='String 类型对象 ' property='a_s'/>

        <element name='int 类型对象 ' property='b_i'>

        </element>

      

       <element name='ArrayList 类型对象 '>

           <element name='ArrayList 中的值 ' property='c_al'/>

        </element>

 

       <element name='Map 类型对象 '>

           <element name='Map 中的值 '  property='d_map'>

           </element>

        </element>

      

    </element>

</info>

 

 

        

 

 

实例二(example2)

功能

实例一实现了一个普通的 javabean 的映射 , 在实际开发中 , 会碰到一个类中的属性是另一个自定义类的情况 , 实际上过程是一样的 .

把father转化为形如如下的xml:

    

 

代码

 

      * <?xml version='1.0' encoding='GB2312' ?>

             < 父亲 >

               < 姓名 > GG </ 姓名 >

               < 孩子 >

                 < 性别 > male </ 性别 >

                 < 年龄 > 12 </ 年龄 >

                 < 成绩 > 100 </ 成绩 >

               </ 孩子 >

             </ 父亲 >

 

        Child c=new Child("male" ,12,"100" );

        Father f=new Father("GG" ,c);

        

        StringWriter outputWriter = new StringWriter();

        outputWriter.write( " /n" ); //xml 的头

        BeanWriter beanWriter = new BeanWriter(outputWriter);

         /********* 下面是一些属性设定项 , 都不是必须的 **********************/

         // 是否禁止 id 属性 (id 属性是 betwixt 自动添加的 )

        beanWriter.getBindingConfiguration().setMapIDs(false );

         // 每行结束时用什么字符 , 这里用一个换行符

        beanWriter.setEndOfLine ("/n" );

         // 是否以缩进方式显示

        beanWriter.enablePrettyPrint();

         /********** 属性设定项完毕 ******************************/

        beanWriter.write(f); //javabean 转化成为了 XML, 用默认的

 

 

betwixt 问题

在实际应用中,会有先 xml 配置文件,后 javabean 映射的情况。举个例子

 

<xx>

    <parameter name="key1">value1</parameter>

    <parameter name="key2">value2</parameter>

<parameter name="key3">value3</parameter>

<parameter name="key4">value4</parameter>

</xx>

 

 

 

 

 

上面的 value1 是从 map 取出来的。如果我们用 betwixt ,最后生成的只会是

 

<entry>

        <key>key2</key>

        <value>value2</value>

      </entry>

 

 

 

 

。要想达到value4 的效果,唯一变通方法是建立一个

class MapBeanInn {

    public Object keyBetwixt ;

    public Object valueBetwixt ;

     …… 省略 setter/getter 方法

    

}

 

这样做坏处是:增加代码混乱度,降低维护性;破坏了 xml-javabean 映射的 javabean pojo 封装。 Betwixt 文档很少,打开 Log ,直接看源码。

 

|2009-07-22 11:41:07,349|DEBUG-[Could not find betwixt file HashMap$Entry.betwixt ]-[commons.betwixt.XMLIntrospector.findByXMLDescriptor,1270]

 

看到由于 Could not find betwixt file HashMap$Entry.betwixt ,因此没有解析 HashMap$Entry

commons.betwixt.XMLIntrospector.findByXMLDescriptor,1270 看看

 

protected synchronized XMLBeanInfo findByXMLDescriptor( Class aClass ) {

// trim the package name

String name = aClass.getName();

int idx = name.lastIndexOf( '.' );

if ( idx >= 0 ) {

name = name.substring( idx + 1 );

}

name += ".betwixt" ;

 

URL url = aClass.getResource( name );

得到 url=null

 

可以再后面加段代码试试

/*

* gaoling 添加!

*/

if (url==null )

        url=new URL("file:/D:/WorkSpace/eclipseWorks/workspace3/Betwixtt/bin/com/gaoling/test6/" +name);

 

src 下建立 HashMap$Entry.betwixt

 

 

 

 

 

 

解析成功! 再前后翻翻代码,会发现 betwixt 解析 . Betwixt 文件时

直接去处理 xxx 了,不会继续分析你是否有拆分请求,也就是说,如果想通过

 

<element name='HASHMAP' property=’xxx’> 直接去处理 xxx 了,不会继续分析你是否有拆分请求,也就是说,如果想通过

<element name='HASHMAP' property=’ 某个 hashmap 属性 ’>

    <text property=' 某个 hashmap 属性 .key'/>

<attribute name='name' property=' 某个 hashmap 属性 .value'/>

</element>

 

 

 

 

 

这样的配置来得到 <parameter name="key4">value4</parameter>

是不可行的!

Betwixt 的硬伤。

Castor 这个大炮可以解决需求。

 

轉載來自:http://blog.csdn.net/gaolingep/article/details/4369962

<!--EndFragment-->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值