一:前言
    目前,越来越多的系统开始使用Web Services。但是由于Java和.Net实现Web Services的不同,如何方便无缝的实现相互之间的调用还是有一定的困难。还好,由于XML的机器可读性以及双方都遵守的WSDL标准,使我们可以利用一个工具实现快速开发。本文将介绍如何使用WSDL2JAVA这个工具来实现.Net Web Services的JAVA客户端的调用。为了方便开发,本文将使用Eclipse作为开发平台,使用Eclipse的WSDL2JAVA插件来实现此功能。
二:系统配置
操作系统:Windows2000 +SP4
Java环境:Eclipse2.1
Org.apache.axis.wsdl2java.eclipse_1.1-rc2.0.2.zip
Org.apache.axis_1.1.zip
.Net环境:Visual Studio.Net 
三:AddInt方法的实现
    测试最简单的WebServices调用。输入参数和返回结果都是标准数据类型。
3.1 .Net的WebServices的实现
| 1.新建一个Asp.Net Web Services工程。 2.在Service1.asmx中添加下列代码: [WebMethod] public int AddInt(int i, int j) { return i+j; } 3.在Visual Studio.Net中执行此工程,在IE中测试AddInt方法,返回结果正确。这样,我们就配置好了一个.Net Web Services。 | 
3.2 Java客户端的实现
| 1.解压缩Org.apache.axis.wsdl2java.eclipse_1.1-rc2.0.2.zip,Org.apache.axis_1.1.zip这两个文件至D:/WSDL2JAVA目录。 2.根据D:\WSDL2Java\org.apache.axis.wsdl2java.eclipse_1.1.0.2\html中的Index的说明配置Eclipse。 3.在Eclipse中新建一个目录Work,单击鼠标右键,使用Import Web Services添加.Net WebServices的引用,生成Java的客户代理。(具体方法见index文件的说明) 4.在Work目录下新建一个Java文件,命名InvokeNetService.java。代码如下: import chenxuguang.WebServicesTest.*; public class InvokeNetService {            Service1Locator _Locator ;            Service1Soap _localService;                        public InvokeNetService()            {               try{                         _Locator = new Service1Locator();                         _localService = _Locator.getService1Soap(); }               catch(Exception any){                        any.printStackTrace();                }            }                        //Call AddInt WebMethod            public void callAddInt()            {                        try{                                   int i = _localService.addInt(1,2);                                   System.out.println("1+2 is "+ i);                         }                        catch(Exception any)                        {                                   any.printStackTrace();                        }             } 5.在Wrok目录下新建一个Java文件,命名为InvokeService.java。代码如下: import chenxuguang.WebServicesTest.*; public class InvokeService {            public static void main(String[] args) {                                    InvokeNetService netService = new InvokeNetService();                        netService.callAddInt();             } } 6.运行InvokeService.java。执行结果如下: 1+2 is 3 执行成功! | 
四:getCustomer()的方法实现
Customer是用于自定义的一个类,用来存放客户信息。本例将讨论在Java中实现.Net中子定义的类。
4.1 .Net Web Services 的 getCustomer() WebMethod的实现
| 1.新建一个类,命名为Customer.cs,代码如下: using System; namespace WebServiceAdd {                [Serializable]        public class Customer        {               public Customer()               {                      this.CustomerID = "TestID";                      this.CustomerName = "TestName";                }               public string CustomerID;               public string CustomerName;                       } } 2.在Services1.asmx中加入getCustomer() WebMethod。代码如下: [WebMethod] public Customer getCustomer(string id) {        Customer customer = new Customer();        return customer; } 3.在IE中测试getCustomer()返回结果如下:   <?xml version="1.0" encoding="utf-8" ?>  - <Customer xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://chenxuguang/WebServicesTest/">   <CustomerID>TestID</CustomerID>    <CustomerName>TestName</CustomerName>    </Customer> 结果正确! | 
4.2 Java客户端的实现
| 1.重新生成Java客户端代理。    执行成功后,可以在项目目录下发现多了三个Java文件,分别是_getCustomer.java, _getCustomerResponse.java, Customer.java。其中,Customer.java就是我们在.Net中子定义的Costomer类的Java实现。 2.在InvokeNetService 中添加下列代码: public void callCustomerService() {            try{                        _getCustomer param = new _getCustomer();                        param.setId("chen" );                        _getCustomerResponse customerRes = this._localService.getCustomer(param);                        Customer customer = customerRes.getGetCustomerResult();                        System.out.println("ID is :" + customer.getCustomerID());                        System.out.println("Name is :" + customer.getCustomerName());            }            catch(Exception any)            {                        any.printStackTrace();            } } 3.修改InvokeService的Main方法的代码:            InvokeNetService netService = new InvokeNetService();            netService.callCustomerService(); 4.执行InvokeService,输入结果如下: ID is :TestID Name is :TestName 测试成功! | 
注意事项:
(1)      从OOP的角度来说,我们应该封装Customer类,使用Get/Set 属性赋值,而不是使用公共类型的类变量。但是,如果类使用Get/Set属性并在类中修改专有变量,则数据就不会正确的发送,因为没有使用XML描述对象在内存中的二进制表示。
(2)      从Web Services的角度来说,系统之间交换的是数据,并且是无状态的。因此,我们的返回结果更应该是一个纯数据类型,而不应该是一个类。我们应该在WebMethod中包装返回结果并以string或者其它的类型传递。而在客户端,关注的也是返回的数据,而不是其中的方法实现。因此,从这个角度看,我们在实现WebMethod的时候返回结果应该是一个纯数据类型(或数据字典),而不应该是一个复杂的类对象。   
太长了,明天再写后面的把。后面将讲一下如何传递XMLDocument类型。
 
                    
                     
                    
                 
                    
                 
                
 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号