引言
这个由四篇文章组成的系列使用最新的 IBM® 工具和技术来开发和部署基于 Web 服务的应用程序。这个系列是以前的由四篇文章组成的系列 Web Services Development and Deployment with WebSphere® V4 Tools and Technologies(于 2001 年 11 月出版)的更新的、改进的版本。这个系列的文章描述如何使用 WebSphere Studio Application Developer 5.0(以下称为 Application Developer)来开发和测试 Web 服务和 Web 应用程序、如何把 Web 服务部署到 WebSphere Application Server 5.0 以及如何在 IBM WebSphere UDDI Registry 中发布和查找 Web 服务。
IBM 确信 Web 服务是下一代电子商务 — 随需应变电子商务(e-business on demand)的关键构件。本系列文章将演示 IBM 是如何使用最新的电子商务基础结构和工具来兑现这一承诺的。这些文章的重点是以下这些 IBM 工具和技术:
WebSphere Studio Application Developer 5.0,用于开发和测试 Web 服务和 J2EE 应用程序。
WebSphere Application Server V5.0,用于部署 Web 服务和 J2EE 应用程序。
IBM UDDI Registry,用于发布 Web 服务。
这些文章为您讲述如何使用这些 IBM 工具和技术来为随需应变电子商务创建基于 Web 服务的解决方案。这一系列将包括以下主题:
第 1 部分(本文)演示如何使用 Application Developer 来创建和测试 Web 服务。
Part 2 demonstrates --第 2 部分演示如何使用 Application Developer 在 UDDI 注册中心中发布和查找 Web 服务、导入 Web 服务描述语言(Web Services Description Language,WSDL)文件以及创建已发布的 Web 服务的客户机。
Part 3 demonstrates --第 3 部分演示如何使用 Application Developer 来创建和测试使用 Web 服务的 Web 应用程序。
Part 4 demonstrates --第 4 部分演示如何把 Web 服务部署到 WebSphere Application Server 5.0 并从运行于 Application Developer 的 Web 应用程序中访问已部署的 Web 服务。
WebSphere Studio Application Developer
Application Developer 为应用程序开发者提供了多项功能,这些功能包括 Web 应用程序的开发和测试、XML 的开发和测试以及 Web 服务的开发和测试(本系列的重点)。当您安装完 Application Developer 后,请花些时间看一下 Application Developer 的联机帮助,特别是“Web Services Development”主题。这个主题讲述如何利用 Java™ bean(本系列的研究内容)、DADX 文件、企业 bean 和 URL 来创建 Web 服务。
Web 服务功能
在本文中,我们将创建 Web 服务,这个 Web 服务制作从 National Weather Service(NWS)实时获取的天气预报。下面的清单显示的是 forecast.WeatherForecast Java bean 的公共方法,我们将使用这个 bean 来创建 Web 服务。本文中用到的所有资源的源代码可从下面下载。构造函数(未被列出)读取属性文件,该文件包含一个属性,这个属性表示 Web 服务应该真正地与 NWS 联系以获取预报还是应该使用“现成的”数据。getStates() 方法返回另一个 Java bean forecast.beans.States,这个 bean 包含被硬编码在返回的 bean 中的州名缩写的列表。getCities() 方法返回另一个 Java bean forecast.beans.Cities,这个 bean 包含在请求的州中有报告的城市的列表。在 NWS 在线的情况下使用私有方法来从 NWS 检索城市列表,在 NWS 不在线的情况下从文件中检索城市列表,该方法把州和城市信息存在高速缓存中以提高性能。getForecast() 方法返回另一个 Java bean forecast.beans.Forecasts,这个 bean 是一个城市的多时段的预报。在 NWS 在线的情况下从 NWS 检索预报,在 NWS 不在线的情况下从文件中检索预报,该方法使用高速缓存的州和城市信息以提高性能。
package forecast;
public class WeatherForecast {
public forecast.beans.States getStates() {...}
public forecast.beans.Cities getCities(String state) {...}
public forecast.beans.Forecasts getForecast(String state, String city) {...}
下面的清单显示的是 States bean 的说明。您可以看到,它是“数据”bean,它有一个属性,即州名缩写的 String 的数组。
package forecast.beans;
public class States {
public String[] getStates() {
return state;
}
}
下面的清单显示的是 Cities bean 的说明。它也是数据 bean,它有两个属性:表示州名的 String 和城市名的 String 数组。它还包括被 WeatherForecast 用来把城市添加到 bean 中的方法。
package forecast.beans;
public class Cities {
public void setState(String state) {...}
public String getState() {...}
public void setCities(String[] cities) {...}
public String[] getCities() {...}
public void addCity(String city) {...}
}
下面的清单显示的是 Forecasts bean 的说明。它是有三个属性的数据 bean:表示预报适用的位置的 String、表示发布预报的时刻的 String 和 forecast.beans.Forecast bean 数组(请参阅下面的描述)。Forecasts bean 也包括让 WeatherForecast 把 Forecast bean 添加到数组中的方法。
package forecast.beans;
public class Forecasts {
public void setLocation(String l) {...}
public String getLocation() {...}
public void setIssued(String i) {...}
public String getIssued() {...}
public void setForecasts(Forecast[] f) {...}
public Forecast[] getForecasts() {...}
public void addForecast(Forecast f) {...}
}
下面的清单显示的是 Forecast bean 的说明。它是有两个属性的简单的数据 bean:表示预报所跨越的时段的 String 和给出预报的 String。
package forecast.beans;
public class Forecast {
public void setPeriod(String p) {..}
public String getPeriod() {...}
public void setForecast(String f) {...}
public String getForecast() {...}
}
使用 Application Developer 来创建 Web 服务
为了创建 Web 服务,我们将执行以下步骤:
创建 Web 项目。
导入 Java bean 和所需的其它资源。
生成描述 Web 服务的 WSDL 和部署描述符、有助于客户机使用 Web 服务的代理以及 Web 服务的测试客户机。
创建 Web 项目
在创建 Web 项目前,请在 J2EE 或 Web 透视图中选择 J2EE Navigator 视图。为了开始创建 Web 项目,请选择 File => New => Web Project。如图 1 所示,Create a Web Project 向导被打开。该向导提示您输入项目的名称。请在 Project name 域中输入 WForecast。您可以接受该面板的其余部分的缺省值,所以只需单击 Next。
图 1. Create a Web Project 向导:Web 项目面板.
现在您可以看到 J2EE 设置面板,如下面的图 2 所示。请输入企业应用程序归档(Enterprise Application Archive,EAR)文件的名称;对于这个示例,请使用 WForecastEAR。您可以使用这个面板来为(WebSphere Application Server V4 所支持的)J2EE 1.2 环境或(WebSphere Application Server V5 所支持的)J2EE 1.3 环境创建项目。Application Developer 支持这两个环境。我们需要 J2EE 1.3,所以选择 Finish。Application Developer 将完成 Web 项目的构造并构建相应的归档。
图 2. Create a Web Project 向导:J2EE 设置面板.
导入 Web 服务 Java bean 和资源
下一步,请导入 Web 服务的 Java 和资源文件。请先下载并解压缩(unzip)本系列文章中提供的源代码。
请展开 WForecast 项目,选择 WForecast 项目中的 Java Source 文件夹,然后选择 File => Import。在后续的 Import 向导中,请选择 File system,然后单击 Next。在 Import 向导的 File System 面板中(如下面的图 3 所示),请选择
Browse,然后浏览到您解压缩源代码的位置。请选择 WForecast/Java Source/ 文件夹,再单击 OK。请展开源代码文件夹,选择 forecast 旁边的复选框,然后单击 Finish。
图 3. 导入源代码.
Application Developer 将导入 WeatherForecast.java、一个属性文件、两个 HTML 文件和以上描述的数据 bean。现在,Application Developer 的 J2EE Navigator 视图如下所示:
图 4. 导入文件后的 WForecast 项目.
创建 WSDL、部署描述符、代理和示例客户机
为了把 WeatherForecast bean 转换成 WForecast Web 项目中的 Web 服务,请选择 WeatherForecast.java,右键单击,然后选择 New => Other。您将看到图 5 中的 New 对话框:
图 5. New 对话框.
请在左边选择 Web Services,在右边选择 Web Service,然后选择 Next。Web Service 向导的第一个面板被打开(下面的图 6)。它让您选择您将用来创建 Web 服务的组件类型。因为我们预先选择了 Java bean,所以它已被选择。如果您需要的话,您可以选中其它选项,但是请确保再次选择 Java bean Web Service。因为我们需要生成代理,所以您必须选择该选项。同样,因为我们需要通过生成的代理来测试 Web 服务,所以您应该选择该选项。然后,选择 Next。在后续的面板中,请验证 WForecast Web 项目被标识,然后单击 Next。
图 6. Web Service 向导:类型选择.
现在您可以看到 Deployment Settings 面板,如下面的图 7 所示。Application Developer 5.0 的这个新的功能部件使您可以选择运行时协议和服务器环境。在此时,仅支持 SOAP/HTTP 协议。服务器选项包括 WebSphere Application Server 4 和 5 以及 Apache Tomcat 的几个版本。该面板上的缺省值(包括目标 Web 项目)正是我们所需要的,所以只需选择 Next。后续的 Java Bean Selection 面板让您确认向导使用正确的 bean 且应该显示 forecast.WeatherForecast。选择 Next。
图 7. Web Service 向导:Deployment Settings.
您现在可以看到图 8 中的 Java Bean Identity 面板。一般来说,用来标识部署描述符中的 Web 服务的 Web service URI 应该是唯一的,但在这一情况下没有必要是唯一的。这个面板还让您为 Web 服务选择类似 HTTP 的处理范围。WeatherForecast bean 被设计成在会话范围中运行。所以,您必须把 Scope 域更改为 Session,这将确保每个用户有一个新实例且使 bean 中的信息的高速缓存能够正确运行。
图 8. Web Service 向导:Java Bean Identity.
在 Application Developer 5.0 中,Identity 面板中的 WSDL 文档域显示更多新的功能部件。现在,向导为接口、绑定和服务 WSDL 元素缺省地生成不同的 WSDL 文档。实际上,向导生成两个不同的绑定,一个用于上一步选择的协议(在这里是 SOAP/HTTP),另一个用于 Java 绑定。这一新的缺省行为使您可以使用高级的功能部件,这些部件不在本文的讨论范围内。如果您想让向导生成一个 WSDL 文档,那么您只需在接口、绑定和服务文档中使用相同的名称。这些域的缺省值对于这个练习来说是可接受的,所以选择 Next。
下面的图 9 显示的是 Java Beans Methods 面板,该面板让您选择需部署的方法。在缺省的情况下,向导预先选择了所有的公共方法,这正是我们所需要的。您也可以修改用于输入和输出的编码样式。输入字符串和输出 bean 的缺省 SOAP 编码是正确的,所以您只需单击 Next。
图 9. Web 服务向导:Java Bean Methods.
Binding Proxy Generation 面板(如下面的图 10 所示)使您可以选择您要求生成的代理使用 Web 服务提供的哪种绑定类型。在这里,我们要使用 SOAP 绑定,所以不必作什么修改。该面板上的所有其它缺省值也是正确的,所以选择 Next。
图 10. Web 服务向导:Binding Proxy Generation.
现在您可以看到测试面板,如图 11 所示。Application Developer 5.0 的另一个新的功能部件让您选择用来测试 Web 服务代理的工具。最适合 WeatherForecast Web 服务的工具是 Web service sample JSPs(缺省)或 Universal Test Client。请选择 Web service sample JSPs。您也可以选择您想测试的方法。带有 setEndPoint() 和 getEndPoint() 方法的代理被生成,这些方法使相同的代理能够与不同的实现交互。我们不想测试这些方法,所以不选择它们,然后单击 Finish。
图 11. Web 服务向导:测试.
Application Developer 生成描述 Web 服务的 WSDL 文件,生成 SOAP 部署描述符,并在 Application Developer WebSphere Test Environment 中部署 Web 服务。
Application Developer 5.0 有重要的、新的代理生成功能。Application Developer 5.0 可创建新的 Web 项目(在这里被命名为 WForecastClient),项目中包括客户机可用来访问 Web 服务的代理。Application Developer 把可被用来测试代理和 Web 服务的示例客户机(在这里是一组 JSP)放在相同的 Web 项目中。下面的图 12 显示的是 WForecastClient 项目的内容。proxy.soap.WeatherForecastProxy 代理类似于 WForecast 项目中的 WeatherForecast bean。
新项目还包括代理使用的一组数据 bean,这些 bean 类似于 WForecast 项目的 forecast.beans 包中的数据 bean。这些 bean 是在完全不了解原先的包中的实现的情况下全部从 WSDL 中生成的,这使客户机实现可以使用 bean,使用方式与原先的 bean 的使用方式完全相同,但仍然完全独立于 Web 服务的实现。与原先的 bean 相比,新的 bean 有完全相同的包和类名。与原先的 bean 相比,说明略有不同,因为它们是真正的数据 bean,每个属性有 set...() 和 get...() 方法,没有其它方法。
图 12. WForecastClient 项目.
测试 Web 服务
当您创建 Web 服务以及服务的 WSDL 描述、代理、示例客户机等的时候,Application Developer 自动地在内置的 WebSphere Test Environment 中部署 Web 服务和客户机并启动该环境。下面的图 13 显示的是运行时体系结构。Web 服务及其客户机均在 Application Developer 测试环境中运行。假设 forecast.properties 文件的 OFFLINE 属性被设为 false,那么 WeatherForecast Web 服务通过因特网访问 NWS。否则,这个 bean 从与 bean 一起被导入的本地资源文件中读取现成的数据。
图 13. 测试的运行时体系结构.
Application Developer 还启动内置的浏览器以用于查看由 Web 服务向导生成的测试客户机 JSP。下面的图 14 显示的是浏览器的初始页面。正如在 Web 服务向导中所要求的那样,测试客户机仅公开 Web 服务的“业务”方法。
图 14. 测试客户机:初始页面.
为了使用示例客户机来测试 Web 服务,请选择 Methods 面板中的 getStates。Inputs 面板将出现变化。单击 Invoke。在 Result 面板中,您将看到由州名缩写组成的数组,如图 15 所示:
图 15. 测试客户机:getStates 调用.
现在,请选择 Methods 面板中的 getCities。Inputs 面板将出现变化。请输入以上数组中的州名缩写,然后单击 Invoke。在 Result 面板中,您将看到由有预报的城市所组成的数组。该示例使用 TX。结果显示在图 16 中:
图 16. 测试客户机:getCities 调用.
现在,请选择 Methods 面板中的 getForecast。Inputs 面板发生了变化。请输入与以上的一个组合相匹配的州名缩写和城市名称,然后单击 Invoke。您将在 Result 面板中看到结果,如图 17 所示(在这里是 Texas 的 Austin),其中位置和发布时间为 String。五个时段的实际预报被简单地显示为 forecast.beans.Forecast bean 的实例。对于更深入的分析,您可以使用 Universal Test Client 选项,它可能是测试的更好的选择,因为它支持 Forecast 实例的分析。但是,它的使用方法更复杂。
图 17. 测试客户机:getForecast 调用.
结束语
本文为您讲述了如何使用 Application Developer 5.0 来创建和测试 Web 服务。与 V4 相比,V5.0 使这一过程更灵活、更容易控制 - 例如,改进了复杂参数和返回值的处理。所以,Application Developer 5.0 是创建和测试 Web 服务的更好的工具。
相关信息
IBM 随需应变电子商务 Web 站点 - 有关 IBM 的这个新步骤的信息。
IBM developerWorks Web 服务专区 - 有关 Web 服务的标准和技术的文章和教程。
关于作者
Greg Flurry 是 IBM 奥斯汀实验室(位于得克萨斯州)的 IBM Software Group Emerging Technologies 小组的高级技术人员。他的职责包括推进 IBM 电子商务技术的发展。您可以通过 flurry@us.ibm.com 与 Greg 联系。