使用 WSAD V5.1 中的 JAXB 来开发企业应用程序(Custom Binding)

来源:百度文库 编辑:神马文学网 时间:2024/04/20 07:44:56
http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0402_mitra/0402_mitra.html 

级别: 初级

Tilak Mitra (tmitra@us.ibm.com), IT 架构师, IBM

2004 年 2 月 01 日

本文描述了如何使用 WebSphere Studio Application Developer 中用于 XML 绑定的 Java 体系结构(Java Architecture for XML Binding,JAXB)来开发实际的企业应用程序。JAXB 提供了一种便利的方法,可以 用来把 XML Schema 绑定到 Java 代码中的表示,从而使开发人员不需要了解很多 XML 本身的知识就可以把 XML 数据和处理功能融入到基于 Java 技术的应用程序中去。

引言


在信息技术的世界里,越来越多的公司期望通过在因特网上提供业务服务以把IT应用到他们的业务中。为了从因特网业务中获取最大限度的投资回报,企业正迅速地采用面向 企业到企业 business-to-busines,B2B)的事务范例,该范例从参与企业中调用服务以最大化典型业务流程的自动化程度。供应链管理业务流程就是这样的一个例子,其中,制造企业的库存与该企业的供应商的库存紧密相连。

在最近几年里,XML 成为 B2B 场景中的信息交换的最佳形式。已经为横向和竖向的市场部门创建了不同的 XML标准,而且正在努力在不同行业部门中使 XML达成一致的标准格式。

随着基于 XML 的信息交换的增加,企业必然要为使用 XML文档而编写大量的 Java 代码。JAXB 为把 XML Schema 绑定到 Java 代码中的表示提供了便利的方法。这种方法使您不需要了解大量关于XML 本身的知识就可以容易地把 XML 数据和处理功能融入到基于 Java 技术的应用程序中去。

本文的目的是向开发人员展示如何使用 WebSphere Studio ApplicationDeveloper 中的强大、简单、灵活的 JAXB 来开发实际的企业应用程序,而与此同时您并不需要了解复杂的XML 解析技术。

您需要了解的内容


尽管您不再需要担心 XML 解析技术,但您还是需要进行一些研读!JAXB 构建于 XML Schema之上。为了利用 JAXB 的强大功能您需要充分了解 XML Schema。通过 XMLschema 可以很好地表示业务范围对象和它们的结构关系,这使您能够更好地理解XML Schema 的强大功能。JAXB 的本质是 XML Schema 为 Java 对象和自身细微差别所作的灵活自定义。JAXB 的自定义同样遵循 XMLSchema 的规则。在完成了创建 Schema 的艰苦工作后,把 JAXB 自定义添加到业务范围对象模型中(用 XML Schema表示)就很简单了。

本文假设您理解:

  • XMLSchemas(越详细越好)
  • JAXB
  • Application Developer 5.1

 

软件先决条件


您必须安装如下产品以完成本文中的步骤:

  • Application Developer 5.1
  • Java Web Services Developer Pack(Java WSDP v1.3)

 

虽然大多数的用户都熟悉 Application Developer,但我们还是需要对 Java WSDP 进行一些介绍。来自 Sun Microsystems 的 Java Web Services Developer Pack(JavaWSDP)是一个免费的集成工具包,可以用来构建、测试和部署采用最新的 Web服务技术和标准实现的 XML 应用程序、Web 服务及 Web 应用程序。您将会需要该包中的 JAXB编译器和运行时库来执行本文中的步骤。请参阅 参考资料部分来下载JWSDP。

JAXB 基础


面向对象编程(object-oriented programming,OO)中有两个关键概念:类和对象。 提供软件概念和实体的结构,而 对象是类的真实的实例。在 XML 表示中可以作相似的类比。您可以把 XML Schema 看作是可用于创建 XML 文档的组织和结构。Schema(在 XML 中)和类(在 OO 中)是概念性构件,而文档(在 XML 中)和对象(在 OO中)是符合各自概念性构件的真实的实例。

使用 Java 对象和类与使用 XML 有根本的不同。JAXB 引入了数据绑定的概念以在 XML Schema 和 Java 类之间建立通信。于是 JAXB 就可以利用映射来把 XML 文档转换成 Java 类,反之亦然。JAXB Schema 编译器基于 XML Schema 的结构来创建 Java 类和接口。于是就可以在编组和解组的过程中使用 JAXB 库。 编组(Marshalling)是从一个或多个 Java 对象创建 XML 文档的过程,而 解组(unmarshalling)是从 XML 文档创建一个 Java 对象的过程。

为了在 J2EE 或任何基于 Java 的应用程序中使用 JAXB,第一步就是运行 JAXB 编译器: xjc,由它创建 Java 类和接口。为 XML Schema 中的每个元素定义生成一个或两个 Java 接口和相应的实现类。生成实现类所在的包与生成接口所在的包是相分离的。除了接口和实现类,还生成特定于 JAXB 的类。使用这些类来执行编组和解组,以在其他事物中创建实现类的实例。请注意仅通过由 JAXB 编译器生成的一个工厂类来实例化实现类。用来与 JAXB 创建的 Java 对象一起使用的两个最重要的类是:

JAXBContext
用于编组、解组和验证 XML 文档。
ObjectFactory
为实例化不同实现类而用到的工厂类。

 





设置开发环境


首先,我们需要按照如下步骤设置我们的开发环境:

  1. 下载 JAXBTestEAR.zip 文件(请参阅 下载部分),然后把文件解压到 C:\temp文件夹。
  2. 创建新的工作区并导入 JAXBTestEAREAR 文件。为了做到这一点:
    1. 在 C:\ drive 中创建名为 JAXB的文件夹。在该文件夹中,再创建名为 workspace的文件夹。
    2. 打开 Application Developer 并把工作区指向 C:\JAXB\workspace
    3. 从 Application Developer 菜单中选择 File->Import
    4. 选择 EAR file
    5. 指定项目名称为 JAXBTestEAR

    6. 浏览文件系统并选择 JAXBTestEAR.ear文件。

    7. 单击 Finish。在 J2EE Perspectives Project Navigator 选项卡中导入的项目看起来会是这样的:

  3. 既然我们已完成了初始设置,我们将需要在 Application Developer 中把 JAXB 编译器设置为 External Tool。为了做到这一点:
    1. 从 Application Developer 菜单中选择 External Tools,如下所示。

    2. 单击 New以创建新配置。
    3. Main选项卡上,输入 NameLocationWorking DirectoryArguments,如下所示。您可以浏览文件系统和工作区以获得下面显示的值。

  4. 切换到 Refresh选项卡,如下图所示选取复选框。高亮显示 $resource作用域变量,然后选择 JAXBTest作为特定资源。

  5. 单击 Apply来保存配置。
  6. 单击 Run来运行 JAXB 编译器(xjc.bat)并生成 Java 类和接口。输出控制台的输出将与下图类似:

 

现在,我们已在 Application Developer 中设置好了我们的开发环境。





示例场景


我们将要开发的示例是一个简单的图形用户界面(graphical user interface,GUI)菜单系统。Widget是概念性元素,它定义了构成图形用户界面的整套绘图组件。Widget的例子有矩形(rectangle)、正方形(square)、圆形(circle)以及其他一些可拖拉的可视组件。我们的简单 GUI由三个可视组件组成,它们分别是矩形、正方形和圆形。Widget组件封装了一组以任意顺序排列的可视组件(矩形、正方形和圆形)。客户端可以通过给定的 XML文档来构造可视组件,然后检索每个可视组件的详细信息,以用于任意方式的客户端请求。

这部分的余下内容将举例说明并解释示例场景的 XML Schema。

清单 1.示例场景的 XML Schema
                                                                                                                                                                                                                                                                                                                                                                                                                                                            

Schema 注释

  • xsd:annotation元素是 xsd:appinfoxs:documentation元素的容器,它包含了附加信息。这两个元素专用于保存机器可处理(machine-processable)的( xsd:appinfo)信息和人工可阅读的文档(human readable documentation)( xsd:documentation)。

  • 用蓝色高亮显示的部分表示特定于 JAXB 的全局 Schema 自定义,可用于整个 Schema 文件。用红色高亮显示的部分表示特定于 JAXB的自定义,它定义了用于存放生成的文件的包;在本例中就是 com.ibm.domainobjects

  • 蓝色 globalBindings 部分的 collectionType = java.util.ArrayList表示在 Java对象内部创建的任何集合都符合 Java 中的 List接口。

  • xjc:serializable元素确保生成的所有类都是可序列化的。当通过有线来发送和接收对象,而数据在不同的应用程序间传输要进行分层时,这一点特别重要。

  • 还定义了一个名为 Shape超类(superClass)。这表示在这个 Schema中定义的所有元素都有一个共同的名为 Shape的超类。在这里展示它是为了说明从 Schema 创建的类也可以访问外部类,这些外部类不是由 JAXB 编译器创建的。

  • Widgets元素的定义表示定义了名为 Widgets 的属性。如果没有定义这个属性,那么绑定编译器将会自动为选择的列表(用于矩形、正方形和圆形)生成一个名称。该自动生成通常采用子元素的名称,并用“or”把这些名称组合起来。于是,列表的访问器名称将会像是这样的: java.util.List getRectangleOrSquareOrCircle();

    很明显,上面的名称不是很有意义。 jxb:property name="Widgets" 表示存取器方法将是 getWidgets,这当然比自动生成的名称更为直观。

在示例中,JAXBTester 类说明了:

  • 如何在 Application Developer中设置外部 JAXB 编译器的使用。
  • 如何使用 JAXB 编译器来生成 Java 接口和类。
  • 如何从 XML 文档创建 Java 类。
  • 如何实例化 Java类,设置它们的属性,并最后生成与之相对应的 XML文档(与前面步骤的相反)。

 

在 XML Schema 中还可以使用其他不同的自定义方式。要了解有关 JAXB 自定义的详细说明,请参阅 参考资料





使用由 JAXB 编译器生成的类


您只需运行一次 JAXB 编译器。如果 Schema 没有改变就不需要再次运行编译器。然而,如果 Schema 经过了一些改变,您将需要再次执行 JAXB编译器的预处理步骤,以重新生成 Java接口和类。这种情况下,在再次运行预处理步骤之前删除先前运行 JAXB 编译器时所生成的全部类是可取的做法。在 Schema中的元素被删除的情况下,这样做是有帮助的。再次运行编译器生成的类不会删除先前生成的类,于是来自前面版本 Schema 的未被使用的类将会保留下来。

既然类已生成,有趣的部分就开始了!现在是使用生成的类把 XML 文档转换成 Java类的时候了,反之亦然。我们将专注于名为 JAXBTester的客户端类。

该类示范了三个动作。它首先创建 JAXB上下文并获取所需的句柄。然后它示范如何使用句柄从 XML 文档创建 Java 对象树。它还展示如何实例化不同的 Java 对象和它们的属性集,最后展示这些 Java对象如何利用所需的句柄来生成 Java 对象树的 XML 表示。

分析 JAXBTester

JAXBTester 有三个方法,如下所述:

createContext
createContext 方法实质上创建了 JAXBContext类的实例,我们可以从中获取 UnmarshallerMarshaller实例的句柄。
unmarshallIt
此方法接收一个 XML 文档--在我们的示例中,它是 WebContentschema文件夹中的 schema.xml 文件。该方法首先创建 UIWidgets类(XML 文档中的根元素)的一个实例。然后调用 UIWidgets实例中的 getWidgets访问器方法,然后在所包含 Widget的列表中反复检索不同的特定于 Widget 的属性。
marshallIt
此方法说明如何实例化 XML Schema中的任意元素,该方法为元素生成 Java对象,设置不同的属性值,然后再把每个对象添加到各自的容器中。 ObjectFactory的实例用于创建不同的 Java 对象的实例;例如:RectangleImpl、CircleImpl等等。 UIWidgetsImpl实例中的 getWidgets方法返回一个指向活动的 List的实例的句柄,可以把子元素(RectangleImpl、SquareImpl和 CircleImpl 的实例)添加到该 List中。在创建了对象的结构之后,对 Marshaller的实例的单一方法调用就会生成对象结构的 XML 表示。

请注意您甚至不需要编写一行 XML代码!转换的细节都包含在生成的类里了。





运行样本


运行客户端类之前,我们必须进行如下步骤:

  1. 运行JAXB 编译器来生成 Java 对象树。
  2. JAXBTester中注释掉的 import声明取消其注释。同样地,在编译 JAXBTester之前,对被注释掉的 unmarshallItmarshallIt方法体部分取消其注释。这些部分之所以被注释掉是因为import 声明中引用的类和方法全部来自生成的类。而 EAR文件在导入时并没有这些生成类。因此,在执行第 1步之前,必须先编译 JAXBTester
  3. 如果需要,请改变 absPathToXML(表示 schema.xml文件所在路径)的值以反映文件系统中指定文件的路径。

 

您现在已做好一切准备来运行该样本,请您自行检查结果。





结束语


本文向我们介绍了JAXB 的基础内容。它向您展示了在不需要了解 XML解析的情况下,您可以如何使用  Application Developer 中的 JAXB来创建 J2EE 应用程序。

学习 JAXB 最好的方法是首先要非常熟悉 XML Schema并达到运用自如的程度,然后再学习JAXB 自定义的技巧。而学习 XML Schema的最好方法是拿起一本书来阅读,然后把书中的概念应用到现实世界的场景中去,以利用 XML schema的不同特征。O'Reilly 出版的 XML Schema是我最喜欢的书。






回页首

下载

名字 大小 下载方法 JAXBTestEAR.zip 3.5 KB HTTP 关于下载方法的信息

参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • Java Web Services Developer Pack 1.3 是 JAXB 编译器的服务包。JDK 1.4 也是需要的。



  • Data Binding with JAXB 定义了全部的 JAXB 规范。



  • Customizing JAXB Schemas 是一篇优秀的文章,讨论的是有关利用 JAXB 规范来为应用程序自定义 XML Schema 的内容。



  • Technical Article on JAXB 提供对 JAXB 如何工作的精彩描述。



  • XML Schema (O'Reilly & Associates;2002 年), 由 Eric van der Vlist 所著,讲解了 XML Schema 的基础、编写 Schema 的不同方式、设计选择,最佳实践以及其他方面的内容。




关于作者

Tilak Mitra 是一位认证的 IT 架构师,他在位于 Fort Lauderdale/Miami 地区的 AIS 的 EAD Southeast 部门工作。他专门研究基于 J2EE、MQ 以及其他 EAI 技术的大中型企业应用程序体系结构。