Beehive 是带来众多 Workshop 魔法的巫师,在 Apache Software Foundation ,它已经到达了成熟阶段。然而,在我们刚刚听说 Beehive 之前, BEA 向 Apache 提交了另一个项目: XMLBean 。XMLBean 已经作为一个羽翼已丰的 Apache Software Foundation Project 得到人们的接受。
XMLBean 是一种 XML-Java 绑定工具。是的,它还是另一种 XML-Java 绑定工具,但是它的出现并未伴随一些新的举措。 XML 已经证实是一种用于结构化数据的、功能强大的有用格式。当前的 XML-Java 绑定工具有它们各自的优点和缺点,但是每种工具使用起来都被认为都有些单调。 XMLBean 通过把 XML 实例和底层架构映射为 JavaBean 风格的对象,克服了单调的缺点。现在,可以通过 getter 和 setter 访问器方法定位、检索和操作 XML 实例数据,这两种方法是任何开发人员都可以轻松使用的通用方法。
XMLBean 是通过编译 XML Schema 而创建的。 XML Schema 是一种用来为 XML 文档提供准则的语言。包括特定 XML 文档必须遵守的规则的模式才能被认作是合法模式。 XML Schema 可以变得相当复杂,这取决于它们描述的 XML 实例。这种复杂性对于 XMLBean 来说无足轻重:无论有多复杂,您的模式可以被编译为 XMLBean 。
我们将讨论一个用于虚构的汽车代理的库存管理系统,这个应用程序完全使用 XMLBean 编写,它不仅演示了如何在 Web service 中使用 XMLBean ,而且还演示了从数据库到用户界面的整个过程中,它们被用作数据对象的情形。我们将重点强调这个应用程序的重要方面,但是您可以下载 整个应用程序 的源代码。这个示例应用程序依赖于一个数据库表,这个表中将保存我们的库存。表中的大多数列都很直观,除了最后一列。 STATUS 列保存的值是二取一的,或者是 new ,或者是 used ,稍后会用该值来过滤我们的结果(参见表 1 )。
表 1 车辆数据
VIN MAKE MODEL YEAR PRICE STATUS
库存表用于保存车辆信息
创建一个模式
XMLBean 来源于 XML Schema 的编译。库存管理 Web service 将返回来自表的车辆列表,而我们需要创建一个 XML Schema 来反映这个列表。就像 JDBC 把 SQL 类型映射为 Java 类型那样, XMLBean 把模式类型映射为 Java 类型。通过考虑表的结构,您可以想像得到,我们只需要和两种类型的数据打交道。在 Java 世界中,这两种类型是 String 和 int (价格是 int 类型的,因为大多数汽车的价格都没有列出分币,但是我们也可以使用 float 类型)。在模式世界中,这些类型也是 string 和 int 。尽管在我们的例子中,我们使用了简单类型,但是 XMLBean 可以处理任何模式类型。清单 1 显示了完整的 XML Schema 。注意,这里定义了两个顶层元素—— vehicleList ,它只是第二个元素 vehicle 的列表; vehicle 元素包含我们的库存表中每一列的节点定义。
XML Schema
清单 1. 在完整的 XML Schema 中定义了两个顶层元素。 vehicleList 元素是第二个元素的列表, vehicle 元素包含我们的库存表中每一列的节点定义。
<?xml version="1.0"?>
<xs:schema xmlns="http://example/schema"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example/schema">
<xs:element name="vehicleList">
<xs:complexType>
<xs:sequence>
<xs:element ref="vehicle" minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="vehicle">
<xs:complexType>
<xs:sequence>
<xs:element name="vin" type="xs:string"/>
<xs:element name="status" type="xs:string"/>
<xs:element name="make" type="xs:string"/>
<xs:element name="model" type="xs:string"/>
<xs:element name="year" type="xs:int"/>
<xs:element name="price" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
