既然已经创建了 XML Schema ,必须把它编译为 XMLBean 。如果您使用的是 XMLBean 项目(您可以从 Apache 站点上下载),那么可以通过 Schema Compiler 实用程序或者特殊的 xmlbean Ant 任务来执行这种编译。也可以使用 scomp 实用程序以各种方式编译模式,您可以在 XMLBean 发布的 bin 目录中找到这个实用程序。(请参阅这个实用程序的使用文档,以获得更多相关信息。) xbean.jar 文件位于 XMLBean 发布的 lib 目录中,它是 xmlbean Ant 任务的容器。通过 Ant 任务进行的模式编译具有明显的优点,即允许我们将模式编译放在其他常见的构建任务中。
如果使用的是 WebLogic Workshop ,那么可以简单地在应用程序中创建一个模式项目,并导入模式。使用模式项目时,每次在项目中导入或修改模式时,编译都会自动进行。图 1 显示了把我们的模式导入一个模式项目后的结果。为每个顶级元素都创建了一个以后缀 Document 结尾的对象。这些对象代表我们的模式中定义整个元素或类型。它们是为访问、操作和创建符合给定类型的 XML 提供入口点的工厂。 XML 类型是由嵌入的工厂类 : VehicleListDocument.VehicleList 和 VehicleDocument.Vehicle 表示的。这些类访问了 XML 实例数据本身。

图 1. 模式导入
模式项目自动编译模式
我们的库存管理服务将提供一些操作。这些功能之一就是从我们的库存表返回所有的车辆。其他两项功能允许客户机更新或者创建库存中的车辆。每项任务单独使用 XMLBean 进行通信。
任务管理
我们需要创建一个数据库控件来管理这些任务。这个控件必须提供一个方法,从数据库选择车辆信息,返回车辆的一个列表,并提供接受车辆信息来更新或插入数据库的方法。通常,我们会创建一个值对象,并将这个对象用作控件的方法的返回类型和参数类型。然而,因为已经在库存表之后对 XMLBean 进行了建模,而且知道将在服务中使用这些对象,所以我们可以简单地把信息直接检索到 XMLBean 中,从而简化整个服务。在这个代码片断中,数据库控件的部分显示了一个 getAllVehicles() 方法,用于简单地返回一个 VehicleDocument.Vehicles 的数组,以及 insertVehicle() 方法,用于接受一个 VehicleDocument.Vehicle 对象作为参数。
/**
* :sql statement="SELECT *
* FROM INVENTORY"
*/
VehicleDocument.Vehicle[]
getAllVehicles();
/**
* :sql statement="INSERT INTO
* INVENTORY VALUES
* ({vehicle.vin},
* {vehicle.make},
* {vehicle.model},
* {vehicle.year},
* {vehicle.price},
* {vehicle.status})"
*/
void insertVehicle(
VehicleDocument.
Vehicle vehicle);
因为 XMLBean 拥有 getter 和 setter 访问器方法,所以可以在 SQL 表达式中直接使用它,就好像它是一个值对象一样。 Web service 将使用这个数据库控件来检索和维护库存信息。当控件使用代表 XML 实例文档的嵌入类时, Web service 不能以这种方式转换内部类,它们必须单独与外部的工厂类打交道。这种情况是一个小问题。插入和更新方法将接收 VehicleDocument 作为一个参数,以便获得内部的 VehicleDocument.Vehicle 类,我们将使用访问器方法 getVehicle() 。 Web service 的 insertVehicle() 方法看起来如下所示:
public void insertVehicle(
VehicleDocument vehicleDoc)
{
VehicleDocument.Vehicle
vehicle = vehicleDoc.
getVehicle();
vehicleControl.
insertVehicle(vehicle);
}
