设为首页收藏本站language 语言切换
查看: 1360|回复: 0
收起左侧

集成J2EE和.NET Web服务(三)

[复制链接]
发表于 2010-2-25 10:32:55 | 显示全部楼层 |阅读模式
<p >接上一篇:集成J2EE和.NET Web服务(二)<p ><B>从J2EE客户端调用.NET Web服务</B><p >在这里,我需要证明J2EE Web服务客户端可以调用.NET Web服务。在这个例子中,我没有一个预先存在的.NET应用程序,因此我从头开始创建一个.NET Web服务。<p ><I>创建.NET Web服务</I><p >我决定重新创建相同的Orders应用程序,因为我已经知道这个应用程序在J2EE上是如何工作的。首先我使用Microsoft Access创建一个新的数据库用于复制表。其次,我增加ADO.NET对象用于访问数据库并且通过一个Web服务页面Orders.asmx 来显示那些方法。 <p ><img  src="http://www.hh010.com/upload_files/article/244/9_x8ipgc305445.gif"><p >为了使得方法通过Web服务接口可以访问,我在方法签名的前面增加[Web Method]指示符。DataSet类型是一个新的数据类型,当前只是在.NET语言中可以使用。这意味着Web服务客户端必须能够将该数据类型转换成实现语言中的等价类型。在该实例中,J2EE客户端必须能够将DataSet类型转换成Java的等价类型。 <p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>[ WebMethod ]  public DataSet getOrdersByCustomer(int customerNbr)  {  DataSet ds = new DataSet(&quot;OrderSet&quot;);  oleDbDataAdapter1.SelectCommand.CommandText = &quot;SELECT  OrderNumber,CustomerName,ExpectedShipDate  FROM OrderMaster WHERE CustomerNbr=&quot; + customerNbr +  &quot; ORDER BY OrderNumber&quot;;  oleDbDataAdapter1.Fill(ds,&quot;Orders&quot;);  return ds;  }</ccid_code></pre></td></tr></table></ccid_nobr><p ><B>为.NET Orders Web服务创建J2EE客户端</B><p >接下来,我开始为.NET Orders Web服务创建J2EE客户端。在WebLogic Workshop和Visual Studio .NET 之间的大部分步骤是相同的,但是它们的实现方式有轻微的差异。为了创建客户代理,WebLogic Workshop还需要WSDL文档,但是在我可以从WSDL文档为.NET Web服务创建服务控制之前,必须首先将WSDL文档加入到lib目录。在下面的代码片断中,我创建了服务控制(Service Control)的一个实例,创建了映射到Web服务方法的方法,然后调用该方法。<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>private OrdersNETControl OrdersNETClient;  public Node getOrdersByCustomer(int customerNbr)  {  return (Node)  OrdersNETClient.getOrdersByCustomer(customerNbr);  }</ccid_code></pre></td></tr></table></ccid_nobr><p >注意,WebLogic Workshop 期望从.NET Orders Web服务返回一个节点(Node)。为了能够扩展数据值,Workshop将.NET的DataSet数据类型映射到一个普通的XML文档节点。这在理解上仍然有些小麻烦。我不得不查看WebLogic Workshop所生成的Control文件来揭示它。 <p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>OrdersNETControl.control  /** @editor-info:link source=&quot;OrdersNET.wsdl&quot; autogen=&quot;true&quot; */  import Weblogic.jws.control.ServiceControl;  /**  * @jws:location http-url=&quot;http://localhost/OrderRetrieval/Service1.asmx&quot;  * @jws:wsdl file=&quot;#OrdersNETWsdl&quot;  */  public interface OrdersNETControl extends ServiceControl  {  public org.w3c.dom.Node getOrdersByEmployee  (java.lang.String EmployeeID);  ...  }</ccid_code></pre></td></tr></table></ccid_nobr><p ><I>请求和应答代码</I><p >现在我具有一个客户端和一个Web服务,让我们看看当我向Web服务发送一个请求时发生什么。通过Web服务,SOAP消息以同步或者异步方式被来回传送。这里我只是显示SOAP消息的一部分,它是与我正在调用的Web服务方法相关联的。我调用getOrdersByCustomer方法并且向它传递一个值为200的customerNbr参数。<p ><ccid_nobr><table width="400" border="1" cellspacing="0" cellpadding="2"  bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"><tr><td bgcolor="e6e6e6" class="code" ><pre><ccid_code>&lt;getOrdersByCustomer xmlns=&quot;http://tempuri.org/&quot;&gt;  &lt;customerNbr&gt;200&lt;/customerNbr&gt;  &lt;/getOrdersByCustomer&gt;  Fragment 9 - Request XML message在来自Web服务的应答中,我获得一个Orders数组,它表示customerNbr为200的所有订单。&lt;ccid_nobr&gt;&lt;table width=&quot;400&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot;  bordercolorlight = &quot;black&quot; bordercolordark = &quot;#FFFFFF&quot; align=&quot;center&quot;&gt;&lt;tr&gt;    &lt;td bgcolor=&quot;e6e6e6&quot; class=&quot;code&quot; style=&quot;font-size:9pt&quot;&gt;    &lt;pre&gt;&lt;ccid_code&gt;   &lt;OrderSet xmlns=&quot;&quot;&gt;  &lt;Orders diffgr:id=&quot;Orders1&quot; msdata:rowOrder=&quot;0&quot;&gt;  &lt;OrderNumber&gt;2&lt;/OrderNumber&gt;  &lt;CustomerName&gt;Set in Place&lt;/CustomerName&gt;  &lt;ExpectedShipDate&gt;2002-10-02&lt;/ExpectedShipDate&gt;  &lt;/Orders&gt;  &lt;/OrderSet&gt;</ccid_code></pre></td></tr></table></ccid_nobr><p ><B>需要考虑的问题和结束语</B><p >基本Web服务的SOAP和WSDL的互操作性可以通过下列步骤来证明:<BR><li>J2EE客户端可以调用.NET Web服务。<BR><li>J2EE客户端可以使用.NET WSDL文档来创建存根。<BR><li> .NET客户端可以调用J2EE Web服务。<BR><li>.NET客户端可以使用J2EE WSDL文档来创建存根。<p >要增强J2EE和.NET之间的互操作性,业界还需要采取更多的步骤。首先,应该增加对于所有XML Schema类型的支持。例如,在Java语言中,XML Schema类型选择并没有标准的等价体。其次,对于并不具有一个等价的Java类型的.NET数据类型,应该增加相应的支持。ADO.NET的DataSet类型也没有等价的Java类型。根据我的经验,WebLogic Workshop将一个DataSet转换成一个普通的XML节点,然后在Java上进行分析以提取出DataSet值。第三,对于Microsoft已经增加到它们的SOAP实现中的扩展,应该在J2EE中增加相应的支持。<p >WSDL是服务互操作性的核心,并且一个公共的WSDL接口可以增加重用。由于WSDL定义了Web服务所期望的数据类型,它允许SOAP客户端与Web服务的互操作性。J2EE和.NET都有一些可用的工具用于生成客户端的代理,它向开发人员隐藏一定层次的复杂性。其他的最佳实践包括严格遵循广泛接受的标准(例如,SOAP 1.2),尽可能保持数据类型的简单性,以及为所有数据类型提供XML Schema定义。<p >在.NET或者J2EE中都可以成功地编写Web服务。今天,在J2EE和.NET之间的简单互操作性是可能的,并且还从互操作性标准团体那里得到持续的增强。使用易于序列化的公共数据类型使得开发人员的工作更加容易。根据您的编程背景,学习一门新语言或者一种新编程范型有可能是必要的。<p ><B>关于作者</B><p >Evelyn Hobson是HP开发人员资源组织的软件工程师和顾问,该组织探索与开发人员相关的前沿技术。她感兴趣的领域包括XML、J2EE、.NET和Web服务。<p >                                 <p align="center"></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-4-6 18:24 , Processed in 0.080023 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表