简介 第 7 章“在表示层集成 .NET”描述了如何集成 .NET Framework 表示层和 J2EE 业务层,以及如何定义封装 J2EE 业务服务外观的 Java 服务接口。之后讲述了 .NET Framework 互用性适配器的设计,以便 .NET Framework 应用程序(如 ASP.NET Web 窗体)可以调用 Java 服务接口。
本章和第 7 章内容相反,本章描述了如何集成 J2EE 表示层和 .NET Framework 业务层。其中包括定义不同的方法以完成该互用性的两小节:
• 使用 Web 服务来实现互用性本节描述了如何定义 .NET Framework Web 服务 (WS) 服务接口来封装 .NET Framework 业务服务外观。之后描述了如何设计 Java 互用性适配器来启用 Java 代码,如 J2EE 表示层调用 .NET Framework WS 服务接口。
• 使用 Ja.NET 来实现互用性 本节描述了如何使用 Ja.NET 来启用 J2EE 表示层,以通过使用 .NET Remoting 来访问 .NET Framework 业务服务外观。
图 8.1:为 .NET Framework 业务服务外观实现 .NET Framework 服务接口
以下过程描述了 XBikes 开发人员如何创建 .NET Framework Web 服务服务接口以公开 XBikes 的 .NET Framework 版本业务层中的业务服务外观。
1.开发人员创建一个名为 XBikes-BLL-WSServiceInterface 的新 ASP.NET Web 服务项目。
2.他们删除默认的 Service1.asmx 文件并将其替换为名为 BLLWSServiceInterface.asmx 的新 Web 服务。开发人员用如下的 [WebService] 属性来批注该 Web 服务类。
[WebService(Namespace="http://XBikes.com/BLLWSServiceInterace/")]
public class BLLWSServiceInterface : System.Web.Services.WebService
{
// Members...
}
3.该团队将 Web 服务方法添加到 Web 服务类,由现有的业务服务外观公开的每种方法都具有正确的方法签名。但是,开发人员将数据类型更改为“字符串”,而不是每种方法将数据集作为参数接受或返回。
[WebService(Namespace="http://XBikes.com/BLLWSServiceInterace/")]
public class BLLWSServiceInterface : System.Web.Services.WebService
{
[WebMethod]
public string AuthenticateCustomer(string email, string password)
{}
[WebMethod]
public string GetCategories()
{}
[WebMethod]
public string GetProductsByCategory(int CategoryID)
{}
[WebMethod]
public string GetSearchResults(string keyword)
{}
[WebMethod]
public void PlaceOrder(string order)
{}
[WebMethod]
public string GetCustomerOrders(int customerID)
{}
}
4.该团队将代码添加到每种 Web 服务方法以调用业务服务外观方法。以下代码示例显示了如何对 Web 服务服务接口中的 GetCategories 方法执行操作。开发人员调用自业务服务外观返回的 CategoriesData 对象的 GetXml 方法,从而将数据转换成 XML 格式化字符串,WS 服务接口将该字符串返回其调用方。
[WebMethod]
public string GetCategories()
{
try
{
// Create a business service facade (BSF) object
BusinessServiceFacade bsf = new BusinessServiceFacade();
// Call the GetCategories method on the BSF object
CategoriesData cd = bsf.GetCategories();
// Convert the CategoriesData dataset into XML, and return it
return cd.GetXml();
}
catch (XBikesInteropException intExp)
{
//.. Error handling code
}
}
5.根据 WS-I Basic Profile 1.0,Web 服务应该支持 SOAP 协议,但不支持 HTTPGet 或者 HTTPPost 协议。为了从 Web 服务中移除协议支持,XBikes 开发人员将以下代码添加到 Web 服务的 Web.config 文件的 部分。
<webServices>
<protocols>
<remove name="HttpGet" />
<remove name="HttpPost" />
</protocols>
</webServices>
为了测试 Web 服务,开发人员在 Visual?Studio .NET 2003 中建立并运行 Web 服务项目。运行 ASP.NET Web 服务项目时,在浏览器中会自动出现一张测试页。这张测试页包含允许调用每种 Web 服务方法的超级链接。如果必要,该测试页还有供您输入值的文本框。在调用完一个 Web 服务方法后,另一个浏览器窗口会打开显示来自 Web 服务方法的 XML 响应。
注尽管 XBikes 示例应用程序不完全符合 WS-I Basic Profile 1.0 的要求,但开发人员使用工具包功能(开发时提供)来尽可能满足 Basic Profile 的要求。
在 J2EE 内创建互用性适配器
前面部分描述了如何在 .NET Framework 中创建 Web 服务服务接口;创建之后,可以继续构建 J2EE 互用性适配器。本节内容即介绍了建立该适配器的步骤。建立步骤如下所示:
• 根据 XML 架构建立 Java 数据类。
• 使用由 Web 服务堆栈提供的工具构建 Web 服务代理。
• 为整个服务接口创建一个适配器,或者为每个用例创建一个适配器。
注在 Xbikes 中,开发人员为每个用例创建一个适配器。
互用性适配器调用该代理,然后代理调用 Web 服务。该适配器还必须在任何 Java 数据和基于 XML 架构的正确字符串/XML格式之间进行转换。
适配器的逻辑流如下所示:
1.应用程序调用适配器方法。
2.适配器方法将任何复杂数据转换成 XML 字符串表示。
3.适配器方法创建 Web 服务代理的实例。
4.适配器方法调用 Web 服务代理中的适当方法。
5.如果代理返回数据,则适配器方法将其转换成正确的 Java 格式(如果必要)。
6.适配器方法将数据返回到调用应用程序。
图 8.2 显示了该操作过程。
图 8.2:带有 J2EE 应用程序的 Web 服务代理操作
以下为构建 Java 适配器的任务:
1.从 XML 架构创建 Java 数据类型和 XML 映射。
2.为 NET Framework Web 服务从 WSDL 创建 Java Web 服务代理。
3.创建 Java 适配器以转换 Java 数据并调用 .NET Framework Web 服务。
以下部分描述了这些任务的执行步骤。
从 XML 架构创建 Java 数据类型和 XML 映射。
大多数 Java XML 产品提供工具以创建基于 XML 架构的 Java 数据类型。通常,这些工具还创建将 Java 类中的每个字段映射到 XML 架构中的元素或属性的映射文件。
注如果现有的 Java 数据类型已经与 XML 架构一致,则无须定义中间 Java 类。只需定义将 Java 字段直接映射到 XML 架构中的元素和属性的映射文件。
定义基于 XSD 的 Java 类之后,下一步是编写代码,将数据从原始的 Java 对象复制到基于 XSD 类的对象中。然后,必须编写代码以将基于 XSD 的对象序列化成 XML 格式化字符串。
将序列化代码放入 Helper 类中是一个不错的主意,XBikes 开发人员就是这么做的。Helper 类要求希望写入或读取字符串的每种类型的数据有两种方法;这两种方法接受要转换的数据的单一参数以及返回转换类型的单一值。以下方法签名显示了 Order 对象和 XML 格式化字符串之间的转换。
public static String orderToString(Order o);
public static Order StringToOrder(String o);
以下步骤阐释了 XBikes 开发人员从本章之前所述的 CustomerData.xsd XML 架构创建基于 XSD 的 Java 类的过程。XBikes 开发人员使用 GLUE 生成基于 XSD 的 Java 类,并创建映射文件以便 GLUE 可以在 Java 对象和 XML 之间进行序列化和反序列化操作。步骤是:
1.开发人员使用 GLUE 提供的 schema2java 工具创建基于 CustomerData.xsd 架构的 Java 类。
schema2java CustomerData.xsd -g -p xbikes.common.dataconverters.customers
2.schema2java 命令生成两个 Java 文件,CustomerData_TYPE.java 和 Customers_TYPE.java。XBikes 开发人员将这些文件添加到 Java 项目,将它们放在公共软件包中以便于访问。软件包位于 xbikes.common.dataconverters.customers。
3.schema2java 命令还生成一个 CustomerData.map 文件,GLUE 序列化程序用它将字段映射到正确的 XML 元素和属性。XBikes 开发人员将该映射文件复制到 文件夹中,GLUE 可在此查找 XML 序列化的映射文件。
4.因为 GLUE 是选定的环境,所以开发团队将 Glue.jar 文件添加到构建路径。
5.接下来,开发人员编写 Helper 类以在 Java 数据和字符串间执行转换。他们将新类命名为 CustomerConverter,并将其添加到软件包 xbikes.common.dataconverters 中。
6.开发人员将两种方法添加到 CustomerConverter 类,一种将 XML 字符串转换成 Java 对象,另一种将 Java 对象转换成 XML 字符串。这些方法使用 GLUE 序列化程序从基于 XSD 的 CustomerData_TYPE 和 Customers