提供了将 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文件夹下
把下面这个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( "最外层包装 >" );
<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>
实例一实现了一个普通的 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-->