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

细看SOAP

[复制链接]
发表于 2010-2-25 10:24:26 | 显示全部楼层 |阅读模式
<p >本文中,我们将介绍一些高级主题,这其中包括SOAP复杂类型处理,错误处理和远程引用。<p >注意:如果您还没有下载用来创建演示示例的软件,请参见《30分钟创建WebService》。您还需要下载演示源代码。我们假定您将软件包解压缩到c:\wasp-advanced 目录。本例中所提到的所有源代码都可以在解压缩文件demo sources后得到的src子目录中找到。它们位于com.systinet.demos.stock 包中。尽管您并不需要下载和使用该软件来理解这些文章,但是我们还是强烈推荐您,如果可能,还是这样去做。我们引入的概念和我们创建的代码具有通用性并与所使用的工具相对独立。我们假定您对XML已经有所了解,但是对Web Service却是一无所知。除非您对SOAP和WSDL有所了解,否则,我们还是建议您先阅读《30分钟创建WebService》。<p ><center><font color="#000099"><strong>SOAP 与复杂类型</strong></font></center><p >到目前为止,我们的web service仅仅只能交换像字符串、整型和双精度型之类的原数据类型。现在我们看看如何将复杂类型转换到SOAP消息中。 SOAP协议建议使用所谓的可将复杂编程语言类型转换成XML的 SOAP编码。通常,下列的转换可以自动进行: <p >● Java 2 原类型 <p >● 自定义类,可以使用熟知的JavaBeans模式进行映射。所有的公共字段和具有公共getters/setters(索取者/设置者)的字段都由Java影响串行器转换成XML。<p >● Java 2 collections (HashMap(哈希映射)、Hashtable(哈希表)、Vector(矢量)和List(列表) 等) <p >下面的简单示例将显示默认的JavaBean模式和Java 2 collection。 <p >我们将一个简单的OrderRequest结构传递给web service。OrderRequest 结构是作为最简单的JavaBean来实现的。其中使用了symbol,limitPrice 和 volume 的getters 和 setters。服务方法processOrder 将OrderRequest Java 类看作是唯一的参数。我们将演示如何在SOAP消息中表示OrderRequest结构 。我们也将编写getOrders方法的代码,该方法返回Web Service 到客户端所有可以接受的order集合。我们将使用java.util.Hashtable 包容器作为方法getOrders的返回值并且要看一看它的XML表示形式。本例中,我们将继续使用简单的订单服务(ordering web service)在股票市场上进行交易:<p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>package com.systinet.demos.mapping;public class OrderService {    private java.util.HashMap orders = new java.util.HashMap();   public String processOrder(OrderRequest order) {        String result = &amp;quotROCESSING ORDER&amp;quot;;        Long id = new Long(System.currentTimeMillis());        result       += &amp;quot;\n----------------------------&amp;quot;;        result       += &amp;quot;\nID:             &amp;quot;+id;        result       += &amp;quot;\nTYPE:           &amp;quot;+((order.getType()==order.ORDER_TYPE_SELL)?(&amp;quot;SELL&amp;quot;)&amp;quot;BUY&amp;quot;));        result       += &amp;quot;\nSYMBOL:         &amp;quot;+order.getSymbol();        result       += &amp;quot;\nLIMIT PRICE:    &amp;quot;+order.getLimitPrice();        result       += &amp;quot;\nVOLUME:         &amp;quot;+order.getVolume();        this.orders.put(id,order);        return result;    }    public java.util.HashMap getOrders() {            return this.orders;    }}</ccid_code></pre></td></tr></table></ccid_nobr><p ><center>图1:复杂类型处理的示例 (OrderService.java) </center><p >注意:所有源代码都可以在解压缩文件demo sources后得到的Bin子目录中找到。 <p >我们将运行deployMapping.bat来编译和配置订单WEB服务。客户端的应用只是创建两个订单请求并将其发送到web service。然后它得到具有这两个请求的哈希表(Hashtable)并在控制台上显示出来。我们来看看客户端应用程序的代码吧。在这里我们又进行了一次股票的投机买卖: <p ><ccid_nobr><table align="center" border="1" bordercolordark="#FFFFFF" bordercolorlight="black" cellpadding="2" cellspacing="0" width="550"><tr><td bgcolor="e6e6e6" class="code"><pre><ccid_code>package com.systinet.demos.mapping;import org.idoox.wasp.Context;import org.idoox.webservice.client.WebServiceLookup;public final class TradingClient {    public static void main( String[] args ) throws Exception {      WebServiceLookup lookup = (WebServiceLookup)Context.getInstance(Context.WEBSERVICE_LOOKUP);      OrderServiceProxy service = (OrderServiceProxy)lookup.lookup(&amp;quot;http://localhost:6060/MappingService/&amp;quot;,OrderServiceProxy.class);      com.systinet.demos.mapping.struct.OrderRequest order = new com.systinet.demos.mapping.struct.OrderRequest();      order.symbol = &amp;quot;SUNW&amp;quot;;      order.type = com.systinet.demos.mapping.OrderRequest.ORDER_TYPE_BUY;      order.limitPrice = 10;      order.volume = 100000;      String result = service.processOrder(order);      System.out.println(result);      order = new com.systinet.demos.mapping.struct.OrderRequest();      order.symbol = &amp;quot;BEAS&amp;quot;;      order.type = com.systinet.demos.mapping.OrderRequest.ORDER_TYPE_BUY;      order.limitPrice = 13;      order.volume = 213000;      result = service.processOrder(order);      System.out.println(result);      java.util.HashMap orders = service.getOrders();      java.util.Iterator iter = orders.keySet().iterator();      while(iter.hasNext()) {              Long id = (Long)iter.next();              OrderRequest req = (OrderRequest)orders.get(id);              System.out.println(&amp;quot;\n----------------------------&amp;quot;);        System.out.println(&amp;quot;\nID:             &amp;quot;+id);        System.out.println(&amp;quot;\nTYPE:           &amp;quot;+((req.getType()==com.systinet.demos.mapping.OrderRequest.ORDER_TYPE_SELL)?(&amp;quot;SELL&amp;quot;)&amp;quot;BUY&amp;quot;)));        System.out.println(&amp;quot;\nSYMBOL:         &amp;quot;+req.getSymbol());        System.out.println(&amp;quot;\nLIMIT PRICE:    &amp;quot;+req.getLimitPrice());        System.out.println(&amp;quot;\nVOLUME:         &amp;quot;+req.getVolume());      }    }}</ccid_code></pre></td></tr></table></ccid_nobr><p ><center>图2: 客户端应用程序订单的代码 (TradingClient.java) </center><p align="center"><font color="FF0000" >1</font>234<span class="content01">下一页&gt;&gt;</span></p></p>
您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

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

GMT+8, 2025-4-10 13:15 , Processed in 0.077003 second(s), 24 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

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