自下而上或实施优先
。起点为 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 10g
第 3 版或更高版本(参见“下载”portlet)。
要将 Java 类公开为基本 Web
服务,只需添加一些批注。我们来看看这样能否奏效。(注意,可以使用相同的机制通过 JAX-WS 和 JAXB 批注将 EJB 3 会话组件发布为
Web 服务。这在您需要将作为 EJB 组件实施的现有业务逻辑公开为 Web 服务时非常方便;例如,将其集成到一个 SOA
环境中。这与在本地和/或远程接口旁的会话 Bean 上添加新接口类似。)
将 Web 服务发布到 WebLogic
下一步是在 WebLogic 上部署 Web 服务并查看生成的 Web 服务产物(如 WSDL 和 XSD)。
在开始前,请确保已启动 Oracle WebLogic Server。
将 Web 服务项目添加到 WebLogic Server。右键单击 Server
视图中的服务器并选择 Add and Remove projects...
. 在新的对话框中,将 MovieGadgetWebServiceEAR
项目移至右侧并单击 Finish
。
图 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:
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 服务是否正常工作。
如果尚未打开,单击 Launch WebLogic Test Client
按钮启动 WebLogic Test Client。应打开一个 MovieGadget Web 服务的测试页面。显示所有可用操作。
图 11:
Oracle Enterprise Pack for Eclipse 中的 WebLogic Test Client
注意,输入参数的格式为 arg0、arg1 等。我们将在下一节中使用 JAX-WS 批注更改该默认行为。
测试 getMovieById 操作。输入“1”作为参数“arg0”的值,并单击 getMovieById
。应返回电影 The Wrestler
的一个 XML 表示。
图 12:
Oracle Enterprise Pack for Eclipse 中的 WebLogic Test Client
将该项目重新发布到 WebLogic Server,并使用 Test Client 检查 WSDL。注意,Web 服务名称、目标命名空间和输入参数名称已更改。
使用以下参数测试所有操作:
id 为 1 的 getMovieById 操作。应返回“The Wrestler”。
Name 为“the”的 getMovieByName 操作。这应返回“The Wrestler”、“The Curious Case of Benjamin Button”和“Eternal Sunshine of the Spotless Mind”。
searchKey 为“director”且 searchValue 为“Danny Boyle”的 searchMovies 操作。应返回“Slumdog Millionaire”和“28 Days Later...”。
图 15:
使用 WebLogic Test Client 测试 Web 服务
图 16:
使用 WebLogic Test Client 测试 Web 服务
WebLogic Administration Console 的一个优点是它提供运行中组件的一些基本监视信息。我们来看一下 Web 服务已调用的次数。
登录到 Oracle WebLogic Server Administration Console 并导航至 MovieGadget Web 服务。选择 Monitoring
选项卡并检查监视信息。
图 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 服务客户端的支持。
创建一个新的 WebLogic Web 服务项目。输入“MovieGadgetClient”作为名称,并将该项目添加到一个名为“MovieGadgetClientEAR”的新 EAR 项目中。
图 18:
创建一个新的 WebLogic Web 服务项目充当 MovieGadget Web 服务的客户端
右键单击“MovieGadgetClient”项目并选择 New -> Other...
创建一个 Web 服务客户端。在对话框中选择 WebLogic Web Services -> Web Service Client
并单击 Next
。
图 19:
创建一个新的 Web 服务客户端
客户端代码基于已部署 Web 服务的 WSDL 生成。因为本教程中的 Web 服务使用自下而上的方法,所以我们没有本地 WSDL。
选择 Remote
并输入您在前一节获取的 WSDL 地址。应该是 http://host:7001/MovieGadgetWebService/MovieWebService?WSDL
。确保已选择 MovieGadgetClient
作为客户端项目。单击 Validate WSDL
按钮。Next
和 Finish
按钮在验证成功后启用。单击 Next
。
图 20:
基于已部署 Web 服务的 WSDL 生成一个 Web 服务客户端
选择 Keep generated Ant script
以便稍后重新生成客户端。保持所有其他默认值不变,然后单击 Next
。
图 21:
使用 WebLogic clientgen Ant 任务生成一个 Web 服务客户端
在 Customization Options 对话框中,选择 Copy WSDL into client JAR
并单击 Finish
。
图 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 服务。
右键单击“MovieGadgetClient”项目并选择 New -> Other...
创建一个 Web 服务客户端。在对话框中,选择 Web -> Servlet
并选择 Next
。
将位于 zip 文件 MovieGadgetDataImport 项目的 DataImportServlet 中的代码复制到新建的 Servlet。注意与 JAXB 相关的语句。
将 MovieGadgetDataImportEAR 项目发布到 WebLogic Server。
通过打开一个浏览器窗口并输入对应的 URL 调用 Servlet,该 URL 应为 http://localhost:7001/MovieGadgetClient/MovieGadgetClientServlet
。将显示以下 Web 页面,显示 Web 服务调用的结果。
图 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 方面的信息和通信技术咨询。