Java Web服务,第3部分: Axis2数据绑定 - 编程入门网
法将非常方便。这种做法非常简单;为服务定义的操作(如果要深究的话, 从技术上是为端口类型定义的)实际上等效于接口定义中的方法调用。唯一的主要区别在于 ,服务将输入和输出定义为 XML 消息,而不是调用参数和返回值。因此,为了在 Web 服务 定义中嵌入现有 API,您只需要约定如何将调用参数和返回值表示为 XML 消息结构即可。
幸运的是,Microsoft® 早期就确立了此领域的一个约定,为其他人节约了建立自己 约定的时间。此约定称为 wrapped document/literal,是 .NET 在将方法调用作为 Web 服 务操作公开时使用的缺省表示形式。实际上,此包装方法规定每个输入消息都是仅包含子元 素序列的 XML 元素,而每个输出消息都是具有单个子元素的 XML 元素。除了完全 .NET 互 操作性外,Microsoft 实现还有一些其他并不重要的技术细节,但用于图书馆示例(请参见 清单 4 中给出的部分代码)的消息并不是为了这些细节而采用此方法。 WSDL2Java 支持在 ADB 代码生成中对此类 wrapped doc/lit 服务进行取消包装操作。当 对合适的 WSDL 服务定义使用取消包装操作时,生成的客户机存根(以及服务器代码框架) 将更为简单和直接。清单 6 显示了与清单 5 等效的客户机应用程序代码,不过其中向 WSDL2Java 传递了 -uw 参数,以生成取消包装接口。清单 5 中增加的复杂性层次的消息类 几乎都从清单 6 中去掉了(除了 GetTypes 类),服务方法直接接受参数和返回值,而不是 嵌入在消息类中。实际上,ADB 仍然生成消息类,并在生成的代码中使用这些类,但代码通 常会忽略这些类,而直接使用数据。 清单 6. ADB 取消包装客户机代码 // create the client stub AdbUnwrapLibraryStub stub = new AdbUnwrapLibraryStub(target); // retrieve a book directly String isbn = "0061020052"; BookInformation book = stub.getBook(isbn); if (book == null) { System.out.println("No book found with ISBN ''" + isbn + ''\''''); } else { System.out.println("Retrieved ''" + book.getTitle() + ''\''''); } // retrieve the list of types defined TypeInformation[] types = stub.getTypes(new GetTypes()); System.out.println("Retrieved " + types.length + " types:"); for (int i = 0; i < types.length; i++) { System.out.println(" ''" + types[i].getName() + "'' with " + types[i].getCount() + " books"); } // add a new book String title = "The Dragon Never Sleeps"; isbn = "0445203498"; try { stub.addBook("scifi", isbn, new String[] { "Cook, Glen" }, title); System.out.println("Added ''" + title + ''\''''); title = "This Should Not Work"; stub.addBook("xml", isbn, new String[] { "Nobody, Ima" }, title); System.out.println("Added duplicate book - should not happen!"); } catch (AddDuplicateFaultException e) { System.out.println("Failed adding ''" + title + "'' with ISBN ''" + isbn + "'' - matches existing title ''" + e.getFaultMessage().getBook().getTitle() + ''\''''); } // create a callback instance BooksByTypeCallback cb = new BooksByTypeCallback(); // retrieve all books of a type asynchronously stub.startgetBooksByType("scifi", cb); long start = System.currentTimeMillis(); synchronized |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |