中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > .NET > 临时文章
集成J2EE和.NET Web服务(三)
作者:Evelyn Hobson 时间:2006-09-30 14:06 出处:BEA 责编:月夜寒箫
              摘要:集成J2EE和.NET Web服务(三)

从J2EE客户端调用.NET Web服务

在这里,我需要证明J2EE Web服务客户端可以调用.NET Web服务。在这个例子中,我没有一个预先存在的.NET应用程序,因此我从头开始创建一个.NET Web服务。

创建.NET Web服务

我决定重新创建相同的Orders应用程序,因为我已经知道这个应用程序在J2EE上是如何工作的。首先我使用Microsoft Access创建一个新的数据库用于复制表。其次,我增加ADO.NET对象用于访问数据库并且通过一个Web服务页面Orders.asmx 来显示那些方法。

为了使得方法通过Web服务接口可以访问,我在方法签名的前面增加[Web Method]指示符。DataSet类型是一个新的数据类型,当前只是在.NET语言中可以使用。这意味着Web服务客户端必须能够将该数据类型转换成实现语言中的等价类型。在该实例中,J2EE客户端必须能够将DataSet类型转换成Java的等价类型。

[ WebMethod ]
            public DataSet getOrdersByCustomer(int customerNbr)
            {
            DataSet ds = new DataSet("OrderSet");
            oleDbDataAdapter1.SelectCommand.CommandText = "SELECT
            OrderNumber,CustomerName,ExpectedShipDate
            FROM OrderMaster WHERE CustomerNbr=" + customerNbr +
            " ORDER BY OrderNumber";
            oleDbDataAdapter1.Fill(ds,"Orders");
            return ds;
            }

为.NET Orders Web服务创建J2EE客户端

接下来,我开始为.NET Orders Web服务创建J2EE客户端。在WebLogic Workshop和Visual Studio .NET 之间的大部分步骤是相同的,但是它们的实现方式有轻微的差异。为了创建客户代理,WebLogic Workshop还需要WSDL文档,但是在我可以从WSDL文档为.NET Web服务创建服务控制之前,必须首先将WSDL文档加入到lib目录。在下面的代码片断中,我创建了服务控制(Service Control)的一个实例,创建了映射到Web服务方法的方法,然后调用该方法。

private OrdersNETControl OrdersNETClient;
            public Node getOrdersByCustomer(int customerNbr)
            {
            return (Node)
            OrdersNETClient.getOrdersByCustomer(customerNbr);
            }

注意,WebLogic Workshop 期望从.NET Orders Web服务返回一个节点(Node)。为了能够扩展数据值,Workshop将.NET的DataSet数据类型映射到一个普通的XML文档节点。这在理解上仍然有些小麻烦。我不得不查看WebLogic Workshop所生成的Control文件来揭示它。

OrdersNETControl.control
            /** @editor-info:link source="OrdersNET.wsdl" autogen="true" */
            import Weblogic.jws.control.ServiceControl;
            /**
            * @jws:location http-url="http://localhost/OrderRetrieval/Service1.asmx"
            * @jws:wsdl file="#OrdersNETWsdl"
            */
            public interface OrdersNETControl extends ServiceControl
            {
            public org.w3c.dom.Node getOrdersByEmployee
            (java.lang.String EmployeeID);
            ...
            }

请求和应答代码

现在我具有一个客户端和一个Web服务,让我们看看当我向Web服务发送一个请求时发生什么。通过Web服务,SOAP消息以同步或者异步方式被来回传送。这里我只是显示SOAP消息的一部分,它是与我正在调用的Web服务方法相关联的。我调用getOrdersByCustomer方法并且向它传递一个值为200的customerNbr参数。

<getOrdersByCustomer xmlns="http://tempuri.org/">
            <customerNbr>200</customerNbr>
            </getOrdersByCustomer>
            Fragment 9 - Request XML message
            在来自Web服务的应答中,我获得一个Orders数组,它表示customerNbr为200的所有订单。
            <ccid_nobr>
            <table width="400" border="1" cellspacing="0" cellpadding="2"
            bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
            <tr>
            <td bgcolor="e6e6e6" class="code" style="font-size:9pt">
            <pre><ccid_code>   <OrderSet xmlns="">
            <Orders diffgr:id="Orders1" msdata:rowOrder="0">
            <OrderNumber>2</OrderNumber>
            <CustomerName>Set in Place</CustomerName>
            <ExpectedShipDate>2002-10-02</ExpectedShipDate>
            </Orders>
            </OrderSet>

需要考虑的问题和结束语

基本Web服务的SOAP和WSDL的互操作性可以通过下列步骤来证明:

  • J2EE客户端可以调用.NET Web服务。
  • J2EE客户端可以使用.NET WSDL文档来创建存根。
  • .NET客户端可以调用J2EE Web服务。
  • .NET客户端可以使用J2EE WSDL文档来创建存根。

    要增强J2EE和.NET之间的互操作性,业界还需要采取更多的步骤。首先,应该增加对于所有XML Schema类型的支持。例如,在Java语言中,XML Schema类型选择并没有标准的等价体。其次,对于并不具有一个等价的Java类型的.NET数据类型,应该增加相应的支持。ADO.NET的DataSet类型也没有等价的Java类型。根据我的经验,WebLogic Workshop将一个DataSet转换成一个普通的XML节点,然后在Java上进行分析以提取出DataSet值。第三,对于Microsoft已经增加到它们的SOAP实现中的扩展,应该在J2EE中增加相应的支持。

    WSDL是服务互操作性的核心,并且一个公共的WSDL接口可以增加重用。由于WSDL定义了Web服务所期望的数据类型,它允许SOAP客户端与Web服务的互操作性。J2EE和.NET都有一些可用的工具用于生成客户端的代理,它向开发人员隐藏一定层次的复杂性。其他的最佳实践包括严格遵循广泛接受的标准(例如,SOAP 1.2),尽可能保持数据类型的简单性,以及为所有数据类型提供XML Schema定义。

    在.NET或者J2EE中都可以成功地编写Web服务。今天,在J2EE和.NET之间的简单互操作性是可能的,并且还从互操作性标准团体那里得到持续的增强。使用易于序列化的公共数据类型使得开发人员的工作更加容易。根据您的编程背景,学习一门新语言或者一种新编程范型有可能是必要的。

    关于作者

    Evelyn Hobson是HP开发人员资源组织的软件工程师和顾问,该组织探索与开发人员相关的前沿技术。她感兴趣的领域包括XML、J2EE、.NET和Web服务。

  • 关闭本页
     
    首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
    Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有