Oracle Account

Manage your account and access personalized content. Sign up for an Oracle Account

Sign in to my Account
Sign in to Cloud

Access your cloud dashboard, manage orders, and more. Sign up for a free trial

开发人员:Eclipse
下载
 Oracle Enterprise Pack for Eclipse
 Oracle WebLogic Server 10.3
 示例代码
标签
eclipse , java , 全部


Oracle Enterprise Pack for Eclipse 中的 Web 服务支持

通过分步教程了解 Oracle Enterprise Pack for Eclipse 11g 中的增值 Web 服务开发支持。

作者:Ronald van Luttikhuizen ACE

2009 年 5 月发表

随着 20 世纪 90 年代 XML 以及一些临时 WS-* 标准神秘前身的出现,一些领跑者很快认识到应该通过互联网上的标准接口(例如,HTTP 上的 XML)交换数据。起初的标准和工具支持非常有限,但是后来,随着行业范围标准(如 SOAP 和 WSDL)的出现带来了“膨胀的预期高峰”,此时,XML 和 Web 服务的使用变得无处不在 — 有人会这样说但没有很好的理由。

最后,我们了解了 Web 服务的真正价值:实现互操作性(在需要的地方)并通过标准跨异构技术。这非常符合面向服务和重用的理念,客户端可以使用 Web 服务充分利用服务,无需顾及底层技术和基础架构。

现在,我们有多种工具和框架支持 Web 服务开发。在 Java 领域,我们看到了这些工具和框架(例如,基于 DOM 的 XML 分析器以及一些需要很多手动编码仍然不是始终能生成符合 WS-I 的 Web 服务的原始 Web 服务框架)均分的局面。(许多供应商将 WS-I 支持包含在其工具中,而非赢利的 WS-I 提供将验证 Web 服务合规性的工具。有关测试 Web 服务产物 WS-I 合规性的方法,请参见 Eclipse Wiki 。)

Java Community Process 在 21 世纪初将 JAX-RPC(适用于基于 XML RPC 的 Java API;JSR-101)规范正式化,从而在 Java 中支持基于 XML 的 RPC 标准。这导致了众多可以生成 JAX-RPC Web 服务和 Web 服务客户端而无需创建专用实施的工具和框架的出现。

JAX-RPC 后来演变为 JAX-WS(适用于 XML Web 服务的 Java API;JSR-224)— 主要反映出 Web 服务不只是 RPC,它还与通信 XML 文档有关。相比 JAX-RPC,JAX-WS 的一些优点是支持更新的标准、改进了数据绑定、使用 MTOM 对附件进行更好的支持、支持 EJB 3 以及使用批注改进和简化了编程模型。

JAX-WS 还通过将数据绑定委托给 JAXB(适用于 XML 绑定的 Java 体系结构;JSR-222)将 Web 服务运行时与数据绑定功能分离开来,它们在 JAX-RPC 中是混合在一起的。JAXB 是一个框架,用于将 XML 文档转化为 Java 对象 — 称为 编组 (反之,称为 反编组 )。该过程称为对象-XML 映射 (OXM),和对象关系映射 (ORM) 类似。

例如,EclipseLink 通过 JPA 和 JAXB 等标准同时支持 ORM 和 OXM。注意,JAXB 最好“单独”使用,无需涉及 Web 服务即可执行数据绑定 — 例如,在导入 XML 文件和永久保存此数据时。

图 1
图 1 :JAXB 的 XJC 编译器基于 XML 模式创建 Java 类。这些类和 JAXB 运行时实现了运行时 XML 数据和 Java 对象的相互转换。只要模式不更改,这些类型生成后即可使用。模式中的更改需要重新生成 Java 类。

JAX-WS 2 和 JAXB 2 是 JEE 5 规范的一部分,与使用批注和“按异常进行配置”的其他 Java/JEE 5 技术类似。这意味着您只需添加一个 @WebService 批注即可轻松地将 Java 类公开为 Web 服务。但是,如果您希望更改默认行为,将需要使用更多的批注和/或 JAX-WS API。(JAX-WS 的 WebLogic Server 10 g 第 3 版实施基于 JAX-WS 参考实施 [JAX-WS RI] 2.1.4 版。JAX-WS RI 是一个开源项目,是 Glassfish 的一部分。除 Web 服务基础外,该版本的 WebLogic 还支持各种 WS-* 标准,如 WS-Security、WS-Addressing、WS-Policy、SAML 等。)

Oracle Enterprise Pack for Eclipse 11 g 提供了一组经认证的、基于标准的 Eclipse IDE 插件,Eclipse IDE 增强了 Oracle WebLogic Server 的 JEE 开发、调试和部署。截至本文撰写之日,这些插件可用于 Eclipse 3.4 (Ganymede),并可作为可以添加到现有 Eclipse 环境的多合一安装程序或单独插件集合进行下载。特性包括快速交换(对 WebLogic Server 的 Java 类重新定义支持)、虚拟 EAR 技术(改进 WebLogic Server 对大型应用程序的部署性能)、适用于 WebLogic Server 部署描述符的图形编辑器,以及一个适用于 Eclipse 数据工具平台的 Oracle 数据库插件。

现在,我们来详细了解如何使用 Oracle Enterprise Pack for Eclipse 开发 Web 服务。虽然在默认的 Eclipse 发布版本中也可以使用 JAX-WS 和 JAXB 开发 Web 服务,但是 Oracle Enterprise Pack for Eclipse 还提供了额外的价值,它提供了额外的向导、项目类型以及可以简化 Web 服务开发(尤其是在使用 Oracle WebLogic Server 作为运行时的情况下)的其他支持。

创建 Web 服务:如何选择正确的方法?

在开始开发 Web 服务前,有必要了解几种创建 Web 服务的方法。Oracle Enterprise Pack for Eclipse 对每种方法都提供支持。

  • 自上而下或协定优先 。此方法的起点是 Web 服务的协定:其 WSDL。您要么设计 WSDL,要么它作为“既定事实”提供。您将从 WSDL 生成 Java 实施。如果协定频繁更改,由于实施被覆盖,Java 代码的重新生成将遇到困难。如果您使用该方法,请确保您不会更改已生成的 Java 类。
  • 自下而上或实施优先 。起点为 Java 实施;所有的 Web 服务产物(如其 WSDL)已生成。当您希望将现有组件公开为 Web 服务时,这是一种快捷的方法。但是,您需要谨慎操作,因为您限制了对已生成的 Web 服务产物的控制,因此,如果 Web 服务重新生成,将很容易突破接口。
  • 中间会合的方法 。在此方法中,您自己既定义协定又定义实施,并在稍后使用 JAX-WS、JAXB API 和代码创建协定和实施间的连接。这是一种非常灵活的方法:您既可以更改 WSDL,又可以更改实施。这需要在开始时做更多的工作,但在后来的过程中会更简单。

让我们从一个用于演示目的的示例应用程序开始:

示例应用程序:OTN MovieGadget

这个虚构的应用程序基于 Oracle 的公共 wiki (wiki.oracle.com) 的一个新增内容。要扩展其社交网络功能,需添加几个小工具。其中一个是“OTN MovieGadget”,它使人们可以根据对电影的喜爱进行交流、讨论和联系。它非常适用于联系同在 Oracle 社区的其他人,但更适用于联系那些喜欢 The Wrestler 或是 Brad Pitt 或 Kate Winslet 的忠实影迷的人们。要实施这样一个小工具,需要用 Web 服务提供所需服务,如根据演员或电影名称搜索电影。

在这个分步教程中,您将从头构建该 Web 服务,使用 Oracle Enterprise Pack for Eclipse 进行开发,并使用 Oracle WebLogic Server 作为运行时应用服务器。该 Web 服务将使用 JAX-WS 公开。接下来,您将创建一个适用于 Web 服务的客户端,并使用 JAXB 导入一个包含新电影数据的 XML 文件。我们在本文中将使用自下而上的方法,因为已提供源代码,并且自下而上的生成将为本教程中其他任务提供快速启动。请记住,没有总体上“最好的”方法;请选择最适合您需求的方法。

安装和配置

执行以下步骤来设置您的环境:

  • 下载并安装 Oracle WebLogic Server 10 g 第 3 版或更高版本(参见“下载”portlet)。
  • 创建一个名为“otn_examples”的新 Oracle WebLogic 域,我们将在该域中部署并运行本教程中的项目。
  • 下载并安装 Oracle Enterprise Pack for Eclipse 11 g (参见“下载”portlet)。
  • 在 Oracle Enterprise Pack for Eclipse 中,配置到新建的“otn_examples”域的服务器连接。

这些步骤的说明可以在 OTN 上的 Oracle Enterprise Pack for Eclipse 页面 找到。

结构

以下 UML 类图显示了将实施该小工具的 MovieGadgetService 组件的设计。

图 2
图 2: 显示 MovieGadgetService 组件设计的 UML 类图

您可以在随附的 zip 文件 中找到包含普通的 Java 代码的 MovieGadget 项目。将其导入 Oracle Enterprise Pack for Eclipse,运行 MovieServicesTester 查看其工作方式。(注意,已使用 MovieServicesDataPopulator 类填充电影数据;在实际项目中,该数据将来自诸如关系数据库之类的数据存储。)

创建 Web 服务项目

我们通过创建一个将包含 Web 服务的项目来开始本教程。

  1. 创建一个新的 Web 服务项目。从菜单中选择 File -> New -> Other... . 在对话框中,选择 WebLogic Web Services -> Web Service Project 。单击 Next

    图 3
    图 3: 在 Oracle Enterprise Pack for Eclipse 中创建一个新的 Web 服务项目

    注意,为方便起见,我们从一开始就创建一个包含所有正确 facet、库等元素的 WebLogic Web 服务项目。在自下而上的方法中,通常已存在包含您希望公开为 Web 服务的 Java 类的项目。在这种情况下,您将添加 JAX-WS 和 JAXB 批注、添加所需的库和 facet,并创建一个对 Java 代码进行打包的 EAR 项目(如果需要),之后将其部署到应用服务器上。

  2. 输入“MovieGadgetWebService”作为项目名称。如果目标运行时尚未设置为“Oracle WebLogic Server 10gR3”,从下拉列表中选择该选项。选择 Add project to an EAR 。保留所有其他默认值不变,然后单击 Next

    图 4
    图 4: 在 Oracle Enterprise Pack for Eclipse 中创建一个新的 Web 服务项目

  3. 保留 Web Module 对话框中所有的默认值不变,然后单击 Finish 创建新的 Web 服务项目。

    图 5
    图 5: 在 Oracle Enterprise Pack for Eclipse - Web Module 中创建一个新的 Web 服务项目

  4. 新项目已创建,所有相关 facet、库和所需的部署描述符(如 web.xml 和 weblogic.xml)已添加到项目中。Eclipse 询问您是否希望更改 Java EE 的透视图。选择 Yes 。这将打开与 Java EE 软件开发相关的所有视图。

    图 6
    图 6: 在 Oracle Enterprise Pack for Eclipse 中更改 Java EE 的透视图

    注意,您可以使用右上角的选项卡和 Open Perspective 图标更改透视图。

创建“MovieGadget”Web 服务

现在,让我们创建实际的 Web 服务。

  1. 通过右键单击“MovieGadgetWebService”项目并选择 New -> WebLogic Web Service 添加一个新的 JAX-WS Web 服务。
  2. Web Service 对话框中,输入“MovieGadgetWebService/src/com/oracle/otn/movie/service”作为父文件夹,并输入“MovieServices”作为文件名。单击 Finish 创建 Web 服务。

    图 7
    图 7: 在 Oracle Enterprise Pack for Eclipse 中创建一个新的 JAX-WS Web 服务

    Oracle Enterprise Pack for Eclipse 生成“MovieServices.java”类,该类在编辑器中打开。该类包含虚拟方法“hello()”。注意其中两个基本 JAX-WS 批注:@WebService 和 @WebMethod。这两个批注都来自 javax.jws 程序包。第一个批注表示应使用 JAX-WS 将该类公开为 Web 服务。@WebMethod 批注是一个方法范围的批注,标记将公开为 Web 服务操作的方法。这些批注的属性(以及其他通用 JAX-WS 批注和特定于 WebLogic 的批注)可以用于进一步自定义 Web 服务。(根据 JAX-WS 规范,需要使用 @WebService 批注。如果未使用 @WebMethod 批注,默认情况下,所有公共方法将公开为 Web 服务操作。当使用 @WebMethod 批注对一个或多个方法进行批注时,将仅公开已批注的方法。)

  3. 服务的实施超出了范围,所以将“MovieGadgetService/src”目录的内容从 zip 文件复制到“MovieGadgetWebService/src”目录。
  4. 在 Eclipse 中刷新“MovieGadgetWebService”项目并打开 MovieServices.java
  5. 将 @WebService 批注添加到类,并将 @WebMethod 批注添加到这三个方法中。保存您的修改。

    图 8
    图 8: 添加 JAX-WS 批注后的 MovieServices 类

要将 Java 类公开为基本 Web 服务,只需添加一些批注。我们来看看这样能否奏效。(注意,可以使用相同的机制通过 JAX-WS 和 JAXB 批注将 EJB 3 会话组件发布为 Web 服务。这在您需要将作为 EJB 组件实施的现有业务逻辑公开为 Web 服务时非常方便;例如,将其集成到一个 SOA 环境中。这与在本地和/或远程接口旁的会话 Bean 上添加新接口类似。)

将 Web 服务发布到 WebLogic

下一步是在 WebLogic 上部署 Web 服务并查看生成的 Web 服务产物(如 WSDL 和 XSD)。

在开始前,请确保已启动 Oracle WebLogic Server。

  1. 将 Web 服务项目添加到 WebLogic Server。右键单击 Server 视图中的服务器并选择 Add and Remove projects... . 在新的对话框中,将 MovieGadgetWebServiceEAR 项目移至右侧并单击 Finish

    图 9
    图 9: 将 Web 服务项目添加到 WebLogic Server

    注意,如果启用“Automatically Acquire Lock and Activate Changes”选项,项目将无法发布到服务器。如果是这样,请使用 Oracle WebLogic Server Administration Console 禁用此选项。转至 Preferences ,取消选择 Automatically Acquire Lock and Activate Changes ,然后单击 Save

    该项目已发布到服务器。如果您在“Server”视图中将其展开,将看到该项目。

    图 10
    图 10: Web 服务项目已部署到 Oracle WebLogic Server

测试 Web 服务并检查生成的 Web 服务产物

Oracle Enterprise Pack for Eclipse 与一个名为 WebLogic Test Client 的易于使用的 Web 服务测试程序捆绑提供。该测试客户端是一个 Web 应用程序,随 WebLogic Server 提供并集成在 Oracle Enterprise Pack for Eclipse 中。由于 WebLogic Test Client 的窗口已打开,您可能已在部署期间注意到该程序。我们来看看 Web 服务是否正常工作。

  1. 如果尚未打开,单击 Launch WebLogic Test Client 按钮启动 WebLogic Test Client。应打开一个 MovieGadget Web 服务的测试页面。显示所有可用操作。

    图 11
    图 11: Oracle Enterprise Pack for Eclipse 中的 WebLogic Test Client

    注意,输入参数的格式为 arg0、arg1 等。我们将在下一节中使用 JAX-WS 批注更改该默认行为。

  2. 测试 getMovieById 操作。输入“1”作为参数“arg0”的值,并单击 getMovieById 。应返回电影 The Wrestler 的一个 XML 表示。

    图 12
    图 12: Oracle Enterprise Pack for Eclipse 中的 WebLogic Test Client

  3. 我们来看一下生成的 WSDL 和 XSD。单击 WebLogic Test Client 控制台顶部显示的 WSDL URL。该 URL 应与 http://localhost:7001/MovieGadgetWebService/MovieServicesService?WSDL 类似。

    图 13
    图 13: 使用 WebLogic Test Client 检查生成的 WSDL

    注意,还生成了一个模式定义并由 WSDL 导入。您可以在新的浏览器窗口中打开它并进行查看;默认地址为 http://host:7001/MovieGadgetWebService/MovieServicesService?xsd=1

    (您还可以使用 WebLogic Server Administration Console 查看 Web 服务 WSDL 并启动 WebLogic Test Client。打开控制台并导航至 deployments -> MovieGadgetWebServiceEAR 。展开部署,选择 Web 服务并选择 Testing 选项卡。)

使用批注修改默认 Web 服务行为

如果您对 WSDL 和 XSD 的检查比较细心,可能会注意到某些生成的默认值。这同样是在更多的 Java/JEE 框架(例如,EJB 3)中常用的“按异常进行配置”行为。让我们使用批注来更改该默认行为的某些部分。

  1. Web 服务名称和 Java 类一样,后缀为“Service”。Web 服务的服务、端口和操作都在 http://services.movie.otn.oracle.com/ 命名空间中。

    将 Web 服务名称更改为 MovieWebService,并将目标命名空间更改为 http://www.oracle.com/otn/movie/

    在 Eclipse 中,将 MovieServices 类的 @WebService 批注替换为

    @WebService(serviceName="MovieWebService", targetNamespace="http://www.oracle.com/otn/movie/").
    
  2. 所有 Web 服务操作的输入参数都被命名为 arg0、arg1,依此类推。另请注意,这些参数位于“default”或“null”命名空间中。

    为输入参数提供有意义的名称并将它们放入与 Web 服务及其操作相同的命名空间中。

    在 Eclipse 中,将:

      @WebParam(name="attributeName", targetNamespace="http://www.oracle.com/otn/movie/")
    

    添加到每一个方法参数。用实际名称替换“attributeName”。

    图 14
    图 14: 添加并修改 JAX-WS 批注以更改 Web 服务行为

  3. 将该项目重新发布到 WebLogic Server,并使用 Test Client 检查 WSDL。注意,Web 服务名称、目标命名空间和输入参数名称已更改。
  4. 使用以下参数测试所有操作:
    1. id 为 1 的 getMovieById 操作。应返回“The Wrestler”。
    2. Name 为“the”的 getMovieByName 操作。这应返回“The Wrestler”、“The Curious Case of Benjamin Button”和“Eternal Sunshine of the Spotless Mind”。
    3. searchKey 为“director”且 searchValue 为“Danny Boyle”的 searchMovies 操作。应返回“Slumdog Millionaire”和“28 Days Later...”。

    图 15
    图 15: 使用 WebLogic Test Client 测试 Web 服务

    图 16
    图 16: 使用 WebLogic Test Client 测试 Web 服务

    WebLogic Administration Console 的一个优点是它提供运行中组件的一些基本监视信息。我们来看一下 Web 服务已调用的次数。

  5. 登录到 Oracle WebLogic Server Administration Console 并导航至 MovieGadget Web 服务。选择 Monitoring 选项卡并检查监视信息。

    图 17
    图 17: 在 WebLogic Administration Console 中查看一些 Web 服务的基本监视信息

    注意,可以使用“Customize this table”链接更改显示的信息。

此处 [ http://e-docs.bea.com/wls/docs103/webserv_ref/annotations.html ] 概述了所有 Web 服务元数据批注 (JSR-181)、JAX-WS 批注 (JSR-224)、JAXB 批注 (JSR-222)、通用批注 (JSR-250) 以及特定于 WebLogic 的 Web 服务批注。请参见 OTN 文章 结合 WebLogic Server 10 使用 JAX-WS 和 JAXB:JAX-WS 自定义绑定 ,了解数据绑定自定义的方法。

生成 Web 服务客户端

创建 Web 服务的能力和创建 Web 服务客户端的能力同样重要 — 甚至可能更重要,因为,服务使用者通常比实际服务的数量要多。在本节中,我们将通过基于其 WSDL 创建适用于 MavieGadget Web 服务的客户端检查 Oracle Enterprise Pack for Eclipse 对开发 Web 服务客户端的支持。

  1. 创建一个新的 WebLogic Web 服务项目。输入“MovieGadgetClient”作为名称,并将该项目添加到一个名为“MovieGadgetClientEAR”的新 EAR 项目中。

    图 18
    图 18: 创建一个新的 WebLogic Web 服务项目充当 MovieGadget Web 服务的客户端

  2. 右键单击“MovieGadgetClient”项目并选择 New -> Other... 创建一个 Web 服务客户端。在对话框中选择 WebLogic Web Services -> Web Service Client 并单击 Next

    图 19
    图 19: 创建一个新的 Web 服务客户端

  3. 客户端代码基于已部署 Web 服务的 WSDL 生成。因为本教程中的 Web 服务使用自下而上的方法,所以我们没有本地 WSDL。

    选择 Remote 并输入您在前一节获取的 WSDL 地址。应该是 http://host:7001/MovieGadgetWebService/MovieWebService?WSDL 。确保已选择 MovieGadgetClient 作为客户端项目。单击 Validate WSDL 按钮。 Next Finish 按钮在验证成功后启用。单击 Next

    图 20
    图 20: 基于已部署 Web 服务的 WSDL 生成一个 Web 服务客户端

  4. 选择 Keep generated Ant script 以便稍后重新生成客户端。保持所有其他默认值不变,然后单击 Next

    图 21
    图 21: 使用 WebLogic clientgen Ant 任务生成一个 Web 服务客户端

  5. 在 Customization Options 对话框中,选择 Copy WSDL into client JAR 并单击 Finish

    图 22
    图 22: 使用 WebLogic clientgen Ant 任务生成一个 Web 服务客户端

    WebLogic clientgen Ant 任务生成代理代码以调用 MovieGadget Web 服务。该代码打包到一个 JAR 文件中并放在 MovieGadgetClient 项目的 WebContent/WEB-INF/lib 目录中。存档包含源类和编译的类。通过包装或在服务器上创建共享库并将其导入,此 JAR 可供其他需要调用 MovieGadget Web 服务的应用程序使用。

    clientgen_build.xml Ant 文件位于项目的根目录中。Ant 任务使用 JAX-WS(例如 MovieWebService.java 中的 @WebServiceClient 的批注)调用 Web 服务。使用 JAXB 将 XML 数据类型映射到生成的 Java 对象。例如,ObjectFactory.java 中的 JAXB 对象工厂。

要对此进行演示,我们可以使用代理代码从一个 Web 页面调用 Web 服务。

  1. 右键单击“MovieGadgetClient”项目并选择 New -> Other... 创建一个 Web 服务客户端。在对话框中,选择 Web -> Servlet 并选择 Next
  2. Create Servlet 对话框中输入“com.oracle.otn.movie.servlets”作为程序包,并输入“MovieGadgetClientServlet”作为类名称。单击 Finish

    图 23
    图 23: 通过代理代码创建将调用 Web 服务的 Servlet

  3. 将位于 zip 文件 MovieGadgetClient 项目的 MovieGadgetClientServlet 中的代码复制到新建的 Servlet。注意,Servlet 使用 Web 服务客户端 JAR 中的类调用 Web 服务。
  4. 将 MovieGadgetClientEAR 项目发布到 WebLogic Server。
  5. 通过打开一个浏览器窗口并输入对应的 URL 调用 Servlet,该 URL 应为 http://host:7001/MovieGadgetClient/MovieGadgetClientServlet 。将显示以下 Web 页面 — 显示 Web 服务调用的结果。

    图 24
    图 24: 使用代理从 Servlet 调用 MovieGadget Web 服务的结果

该教程的最后一部分介绍 Oracle Enterprise Pack for Eclipse 对使用 JAXB 进行数据绑定的支持。

使用 JAXB 的对象-XML 映射

JAXB 是一个数据绑定标准,可以单独使用,也可以通过 JAX-WS 使用。例如,在实际项目中,该功能可用于导入 XML 数据并将其永久保存到一个关系数据库中。

在本节中,我们将创建一个简单的应用程序,该应用程序读取包含电影数据的 XML 文件、将其转换为 Java 对象并将数据显示在示例 Web 页面上。

  1. 创建一个新的 WebLogic Web 服务项目。输入“MovieGadgetDataImport”作为名称,并将该项目添加到一个名为“MovieGadgetDataImportEAR”的新 EAR 项目中。
  2. 将 movie.xsd 和 zip 文件的 MovieGadgetDataImport 项目中的两个示例 xml 文件复制到新建项目的 src 目录中。在 Eclipse 中刷新项目。
  3. 基于 movie.xsd 模式生成 Java 类。右键单击 MovieGadgetDataImport 项目并选择 New -> Other... . 在对话框中选择 WebLogic Web Services -> JAXB Types 并单击 Next
  4. New JAXB Types 对话框中,选择 MovieGadgetDataImport 项目并将 movies.xsd 添加到模式文件的列表中。单击 Next

    图 25
    图 25: 基于 movies.xsd 模式生成 JAXB 类型

  5. Generated Artifacts 对话框中选择 Keep generated Ant script 选项,以便在需要时再次执行 Ant 任务。保留其他默认值不变。

    图 26
    图 26: 使用 XJC 绑定编译器生成 JAXB 类型

  6. 输入“com.oracle.otn.movies.jaxb.entities”作为 Java 程序包,JAXB 类型将在该 Java 程序包中生成。同样选择 Include source code in JAR 选项,以便稍后查看生成的代码。单击 Finish

    图 27
    图 27: 使用 XJC 绑定编译器生成 JAXB 类型

    XJC 绑定编译器基于模式生成 JAXB 类型并将 movie.xsd.jar 存档中的这些 Java 类和 ObjectFactory 类打包到一起,ObjectFactory 类使您能够以编程方式构造 Java 类型的新实例以及用于指定已生成类型所属的顶级程序包的 package-info 类。

    movie.xsd.jar 存档位于 MovieGadgetDataImport 项目的 WebContent/WEB-INF/lib 目录中。

为演示其功能,我们将创建一个 Servlet,将包含电影数据的 XML 文件转换为我们刚刚创建的 Java 对象。这叫做反编组。基于 JAXB 对象类型生成 XML 的过程(编组)非常简单,将作为练习留给读者。

  1. 右键单击 MovieGadgetDataImport 项目并选择 New -> Other... 创建一个新的 Servlet。在对话框中选择 Web -> Servlet 并单击 Next
  2. Create Servlet 对话框中输入“com.oracle.otn.movie.servlets”作为程序包,并输入“DataImportServlet”作为名类名称。单击 Finish
  3. 将位于 zip 文件 MovieGadgetDataImport 项目的 DataImportServlet 中的代码复制到新建的 Servlet。注意与 JAXB 相关的语句。
  4. 将 MovieGadgetDataImportEAR 项目发布到 WebLogic Server。
  5. 通过打开一个浏览器窗口并输入对应的 URL 调用 Servlet,该 URL 应为 http://localhost:7001/MovieGadgetClient/MovieGadgetClientServlet 。将显示以下 Web 页面,显示 Web 服务调用的结果。

    图 28
    图 28: 使用 JAXB 将 XML 反编组为 Java 对象的结果

注意,反编组的 XML 必须遵循用于生成 JAXB 类型的 XML 模式。该方法的优点是编译时类型检查(与示例 DOM 不同)和更快的 XML 处理。如果 XML 对该模式无效,JAXB 将生成一个运行时错误。如果模式频繁更改或根本没有模式,您可能希望使用无需生成映射的 XML 框架。

结论

通过本教程,我们了解了一些 Web 服务开发的最佳实践:

  • 在使用特定于供应商的批注(与那些已在 JAX-WS 和 JAXB 标准中定义的批注不同)时要谨慎。虽然特定于供应商的批注非常强大,但是它们破坏了 Web 服务的可移植性并将其限定到一个特定的运行时。
  • 在使用自下而上或中间会合的方法时,不要将所有方法默认公开为 Web 服务操作。仅公开服务使用者实际需要的方法。这促进了封装并阻止了对“内部”方法的访问。
  • 当今的大多数产品和技术都支持 Web 服务。在决定要使用的技术时,要充分考虑其利弊。例如,与关系数据库相比,Java 可为 Web 服务开发以及 XML 处理提供更优秀的支持和运行时。
  • 避免创建接收、处理和/或发送大型 XML 文档的 Web 服务。XML 处理是资源密集型操作,相对较慢,因此,不适于处理批量数据。应使用其他技术(例如数据库或 ETL 工具)达成此目的。
  • 开发基本 Web 服务非常简单 — 但是使其强健、安全且可扩展(足够的)非常难。应在项目一开始时解决这些非功能性的问题,而不应在项目结束时才发现没有满足某些要求。
  • 根据要求和约束条件提前决定最适合您的 Web 服务开发方法:自上而下或协定优先、自下而上或中间会合。

Ronald van Luttikhuizen ( ronald.vanluttikhuizen@approach-alliance.nl ) 是 Approach Alliance ( www.approach-alliance.com ) 的一名架构师(并且是 Oracle ACE),这家公司总部设在荷兰,主要从事 SOA 和 BI 方面的信息和通信技术咨询。