许多人问为什么喜欢使用Castor,那是Castor 在数据绑定领域提供了许多的功能,无需使用模式便可在 Java 和 XML 之间进行转换,提供一种比 JAXB 更易于使用的绑定模式,以及能够对关系数据库和 XML 文档进行编组(marshal)和解组(unmarshal),还提供了 JDO 功能。JDO 也就是 Java Data Objects,是驱动 Java-to-RDBMS 编组和解组的底层技术。尽管不再像前几年那么流行,JDO 仍然是一个不错的功能。此外,由于 JDO 也是一种 Sun 规范,因此不用编写模糊的 API。更多的是Castor可以轻易地将所有 JAXB 代码转变为 Castor(并不是完全取代,但是足以使刚刚接触 Castor 的程序员轻松完成任务)。
Castor XML 数据绑定很容易上手,甚至不需要定义 XML 文档格式。只要您的数据用类 JavaBean 的对象表示,Castor 就能自动生成表示这些数据的文档格式,然后从文档重构原始数据。
在本篇章中,我们将讨论运行 Castor 所需的首要步骤,包括下载、安装、设置、配置、类路径问题等等。
Castor 的安装过程比较简单,首先,访问 Castor Web 站点并在左侧菜单中单击 Download。选择 latest milestone release,然后向下滚动到 Download sets。您可以下载 Castor JAR、DTD、doc、dependency 等所有内容,预打包的下载套件非常容易使用(参见图 1)。
图 1. Castor Web 站点的下载套件
在本文中,我们将使用版本 1.1.2.1。我选择 ZIP 格式的 The Castor JARs, docs, DTDs, command line tools, and examples 下载套件。您将获得一个可以展开的归档文件,其中包含许多 JAR 文件、文档和示例程序(参见图 2)。 图 2. 展开的 Castor 归档文件 正确放置所有文件 接下来,需要将 Castor 的所有文件安放在系统中的正确位置,使您的 Java 环境能够访问它们。 将 Java 库放在同一个位置 我强烈建议将所有第三方 Java 库放在一个常见位置。您可以将它们随意散放在系统中,但是这样做会带来严重后果,因为如下原因: 在大多数情况下很难找到需要的东西。 您将会花大量时间来确定使用的库版本,因为您会经常将多个版本放在系统的不同位置。 类路径将会变得很长而且难于理解。 我将我的所有库放在 /usr/local/java/ 中,每个库放在自己的子目录中(各个目录通常带有一个版本号)。因此将 Castor 归档文件 — 经过扩展 — 移动到您常用的库位置。在本例中,Castor 的完整路径为:/usr/local/java/castor-1.1.2.1。 为 Castor JavaDoc 添加书签 在系统中设置 Java 库的另一个步骤是定位和链接到文档。您会经常这样做,而且大多数 Java 库都提供文档的本地副本(包括 JavaDoc),使用 HTML 格式。在 Castor 中,这个路径是 castor-1.1.2.1/doc/。因此在我的系统中,我为 /usr/local/java/castor-1.1.2.1/doc/index.html 添加了一个书签。图 3 显示了本地载入的 Castor 文档外观,版本为 1.1.2.1。 图 3. 本地载入的 Castor 文档 随着 Castor 的不断发展,您也许不会经常下载最新的发行版。使用在线文档就意味着使用最新版本的文档,这可能与您系统中的版本不匹配。当使用本地文档时,使用的文档总是和当前使用的库版本对应。因此,不会由于使用不恰当或者库版本中根本不存在的特性而引起混乱和挫折。 下载 Castor 依赖项 Castor 有许多 依赖项: Apache Ant Jakarta Commons JDBC 2.0 Standard Extensions Log4J 登录实用程序 Apache Xerces XML 解析程序 这实际上是适用于大多数 Castor 操作的一个精简的集合。如果想从头构建 Castor、运行这些示例、使用这些测试,或者更深入地研究 Castor,还需要更多的依赖项。必须将这些依赖项放到类路径中,才能使用 Castor。 简单的方法 回到 Castor 的下载页面,找到稳定版本,并定位到另一个下载套件,这个下载套件叫做 Full SVN snapshot: All sources, docs, and 3rd party libraries (big)。尽管标记为 “big”,但只有 10 MB(对于用 DSL 或者电缆上网的用户来说,这根本不算什么)。下载这个文件,并展开(如图 4 所示)。 图 4. Full SVN 截图(已展开) 现在可以进入 lib/ 目录了,其中包含大量的 JAR 文件。这些正是 Castor 所需的库。 存放更多库的位置 创建一个新目录 — 在最初的 Castor 安装目录中或者与之同级的目录 — 然后将刚才下载的所有 JAR 文件移动到这个目录中。例如: [bmclaugh:~] cd /usr/local/java
[bmclaugh:/usr/local/java] ls
castor-1.1.2.1 xalan-j_2_7_0
[bmclaugh:/usr/local/java] cd castor-1.1.2.1/
[bmclaugh:/usr/local/java/castor-1.1.2.1] ls
CHANGELOG castor-1.1.2.1.jar
castor-1.1.2.1-anttasks.jar doc
castor-1.1.2.1-codegen.jar jdbc-se2.0.jar
castor-1.1.2.1-ddlgen.jar jta1.0.1.jar
castor-1.1.2.1-jdo.jar schema
castor-1.1.2.1-xml.jar
[bmclaugh:/usr/local/java/castor-1.1.2.1] mkdir lib
[bmclaugh:/usr/local/java/castor-1.1.2.1] cd lib
[bmclaugh:/usr/local/java/castor-1.1.2.1/lib] cp ~/downloads/castor-1.1.2.1/lib/*.jar .
[bmclaugh:/usr/local/java/castor-1.1.2.1/lib] 此处,我在 Castor 文件夹中创建了一个 lib/ 目录,将所有的 JAR 文件移到其中,供 Castor 使用。 设置类路径 现在需要设置类路径中的所有东西。我在 Mac OS X 配置中使用一个 .profile 文件处理所有这些问题。您也许想将您的 profile 也设置为这样,或者在 Windows 中设置一个系统环境变量。在任何情况下,都需要将如下 JAR 文件添加到类路径: castor-1.1.2.1.jar(在 Castor 主目录中) castor-1.1.2.1-xml.jar(在 Castor 主目录中) xerces-J-1.4.0.jar(放在与 Castor 依赖项库相同的位置) commons-logging-1.1.jar(放在与 Castor 依赖项库相同的位置) 作为参考,以下是我的 .profile,从中可以看到我是如何设置的: export JAVA_BASE=/usr/local/java
export JAVA_HOME=/Library/Java/Home
export XERCES_HOME=$JAVA_BASE/xerces-2_6_2
export XALAN_HOME=$JAVA_BASE/xalan-j_2_7_0
export CASTOR_HOME=$JAVA_BASE/castor-1.1.2.1
export EDITOR=vi
export CASTOR_CLASSES=$CASTOR_HOME/castor-1.1.2.1.jar:
$CASTOR_HOME/castor-1.1.2.1-xml.jar:
$CASTOR_HOME/lib/xerces-J_1.4.0.jar:
$CASTOR_HOME/lib/commons-logging-1.1.jar
export CVS_RSH=ssh
export PS1="[`whoami`:w] "
export CLASSPATH=$XALAN_HOME/xalan.jar:$XALAN_HOME/xml-apis.jar:
$XALAN_HOME/xercesImpl.jar:
~/lib/mclaughlin-xml.jar:$CASTOR_CLASSES:. 请确保将所有这些文件都放到了类路径中,接下来将做一个快速测试。 测试安装 首先构建一个非常 简单的类,然后构建一个实用程序将其在 XML 和 Java 之间来回转换。这里并不会演示 Castor 的所有功能,而只是一个非常基本的测试。清单 1 显示了我将使用的一个 CD 类。输入这些源代码并保存为 CD.java
清单 1. CD 类(用于测试) package ibm.xml.castor;
import java.util.ArrayList;
import java.util.List;
public class CD implements java.io.Serializable {
private String name = null;
private String artist = null;
private List tracks = null;
public CD() {
super();
}
public CD(String name, String artist) {
super();
this.name = name;
this.artist = artist;
}
...set/get方法省略。。。。
public void addTrack(String trackName) {
if (tracks == null) {
tracks = new ArrayList();
}
tracks.add(trackName);
}
}
现在需要一个类处理编组。如清单 2 所示。 清单 2. 用于测试编组的类 package ibm.xml.castor;
import java.io.FileWriter;
import org.exolab.castor.xml.Marshaller;
public class MarshalTester {
public static void main(String[] args) {
try {
CD sessions = new CD("Sessions for Robert J", "Eric Clapton");
sessions.addTrack("Little Queen of Spades");
sessions.addTrack("Terraplane Blues");
FileWriter writer = new FileWriter("cds.xml");
Marshaller.marshal(sessions, writer);
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
} 最后一个类如清单 3 所示,是一个用于解组的类。 清单 3. 用于测试解组的类 package ibm.xml.castor;
import java.io.FileReader;
import java.util.Iterator;
import java.util.List;
import org.exolab.castor.xml.Unmarshaller;
public class UnmarshalTester {
public static void main(String[] args) {
try {
FileReader reader = new FileReader("cds.xml");
CD cd = (CD)Unmarshaller.unmarshal(CD.class, reader);
System.out.println("CD title: " + cd.getName());
System.out.println("CD artist: " + cd.getArtist());
List tracks = cd.getTracks();
if (tracks == null) {
System.out.println("No tracks.");
} else {
for (Iterator i = tracks.iterator(); i.hasNext(); ) {
System.out.println("Track: " + i.next());
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace(System.err);
}
}
} 像下面这样编译这些类: [bmclaugh:~/Documents/developerworks/castor] javac -d . *.java
Note: CD.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details. 如果使用的是 Java 5 或更高的版本,而在 CD.java 中没有使用参数化的类型,就会出现上面的警告。不要担心,这不会有什么影响。现在需要运行编组程序测试类。 [bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.MarshalTester 找到并打开 cds.xml。其内容应该像这样: <?xml version="1.0" encoding="UTF-8"?>
<CD>
<artist>Eric Clapton</artist>
<name>Sessions for Robert J</name>
<tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Little Queen of Spades</tracks>
<tracks xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="java:java.lang.String">Terraplane Blues</tracks>
</CD> 这些内容可读性不太好,但是应该能在 XML 文档中看到在 MarshalTester 类中创建的 CD 的所有信息。 现在需要确保可以将 XML 文档转换回 Java。运行解组测试程序: [bmclaugh:~/Documents/developerworks/castor] java ibm.xml.castor.UnmarshalTester
CD title: Sessions for Robert J
CD artist: Eric Clapton
Track: Little Queen of Spades
Track: Terraplane Blues 这些代码非常简单,无需解释。如果你获得了这样的输出,就说明已经用 Castor 打开了 XML 文件,并且已经将其转换为一个 Java 类。 现在 — 我们假设您已经用 UnmarshalTester 获得了相同的 cds.xml 和输出 — 您安装的 Castor 能够正常运行。您还没有使用 Castor 做任何比较复杂的工作,只是确保了它能正常运行、正确设置了 JAR 文件以及 Castor 能够根据需要实现不同的功能。 结束语 现在,您有了一个能够正常运行的 Castor 环境。清单 1、2 和 3 让您对 Castor 的工作原理有了一定的了解。在下一篇章中,将会讲解下编组和解组功能,您将会更进一步了解 Castor 的 XML 特性,以及如何使用映像文件。到那时,请继续体验 Castor 的功能。
|