论坛首页 Java企业应用论坛

Castor学习笔记

浏览 3100 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-28  
准确说是一种Java XML数据绑定技术。
在大型的企业应用中,互发接口使用的大部分都是基于XML文档接口的数据信息,抛出复杂的信息本 身,其实从结构上讲,大部分都是较为简单的结构,因为这个文档本身只是为传递一些信息存在的。例如如下这个文档结构。

熟悉hibernate的或许知道hibernate的意义在于数据库和javabean之间的映射,俗称ORM,那么简单的理解Castor的含义,那就可以叫做OXM了。Object-XML-Mapping。Castor可以将一个javabean直接写入到xml中,可以将一个结构规则的xml装入javabean中去,强大吧。
开始使用Castor
新建一个java项目,引入castor的引用包,应该是两个,一个是castor,一个是xercesImpl的包。
http://www.castor.org/1.3/download.html
第一个Castor程序
这里,先要写一个javabean,这里的David是一个简单的javabean,拥有name,age,borndate3个属性,下面重点的是如何用castor来生成和解析xml文件
public static void main(String[] args) {
		// TODO Auto-generated method stub

		David bean = new David();
		bean.setAge(24);
		bean.setName("David");
		bean.setBorndate(new Date());

		try {
			// write it out as XML
			File file = new File("files//David.xml");
			Writer writer = new FileWriter(file);
			Marshaller.marshal(bean, writer);
			// now restore the value and list what we get
			Reader reader = new FileReader(file);
			David read = (David) Unmarshaller.unmarshal(David.class, reader);
			System.out.println("David: " + read.getName() + read.getBorndate()
					+ read.getAge());
		} catch (IOException ex) {
			ex.printStackTrace(System.err);
		} catch (MarshalException ex) {
			ex.printStackTrace(System.err);
		} catch (ValidationException ex) {
			ex.printStackTrace(System.err);
		}
	}
 
<?xml version="1.0" encoding="GBK"?>
<david age="24">
    <borndate>2010-01-06T13:09:20.218+08:00</borndate>
    <name>David</name>
</david>



认识Castor
Castor提供的API中Marshaller和Unmarshaller是非常重要的两个,其中Marshaller用于生成xml,而后者用于从xml解析出javabean,如上面的代码所示,简单的给Marshaller传入需要生成xml的bean对象和负责写入文件的writer后,Marshaller在内部进行了诸如获取对象的字段信息,调用writer写入xml等等等等复杂的事情。而Unmarshaller需要的仅仅是类的结构和负责读取文件的reader。而且,对于用户来说,Castor还提供了默认的xml文档格式,在上面的代码中,如果我们不关心xml的格式,我们甚至不用去考虑这些事情。
格式描述文件
了解hibernate的应该知道,hibernate中有种文件格式称做映射文件,而那个文件的作用是用来描述对象和数据库表之间的映射关系。castor中也有用于描述对象和xml之间映射关系的文件,这个文件用来规定Marshaller如何来写这个xml文件。
废话不多说,看一个例子:
如果我想要让xml格式变更一下,例如变成如下的格式:
<?xml version="1.0" encoding="GBK"?>
<david age="24" borndat="2010-01-06T13:00:02.234+08:00" name="David"/>

这里把所有的子结点都写成了属性的形式。很显然,如果不改动代码,程序一定不会改变文档的结构,那么,这就涉及到了我们先前提到的xml格式描述文件。
<!DOCTYPE databases PUBLIC
"-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
"http://castor.exolab.org/mapping.dtd">
<mapping>
<description>Basic mapping example</description>
<class name="org.david.castor.David" auto-complete="true">
<map-to xml="David"/>
<field name="name">
<bind-xml name="name" node="attribute"/>
</field>
<field name="borndate">
<bind-xml name="borndate" node="attribute"/>
</field>
</class>
</mapping>


通过这个文件我们可以把每个feild的映射方式进行设定,这里<bind-xml name="borndate" node="attribute"/> ,name规定了这个值在xml中的显示名,而node规定了该值的xml存储方式,这里是用attribute形式进行存储,即写到了结点的属性里。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics