axis2

下載axis2-1.5.4-bin.zip文件並解壓。html

設置axis2的環境變量,以下圖所示:axis2經過wsdl生成客戶端程序並本地調用java

利用axis2中的wsdl2java.bat生成客戶端程序。apache

先啓動Tomcat7並在IE裏運行http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl 看看服務端是否正常解析。網絡

%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl -paxis2.service.server -o stubapp

其中-uri參數指定了wsdl文件的路徑,能夠是本地路徑,也能夠是網絡路徑。-p參數指定了生成的Java類的包名,-o參數指定了生成的一系列文件保存的根目錄。在執行完上面的命令後,讀者就會發如今當前目錄下多了個stub目錄,能夠找到一個HelloServiceStub.java文件,該文件複雜調用WebService,讀者能夠在程序中直接使用這個類。
運行-->cmd-->具體命令以下:dom

要先進入axis2的bin目錄而後運行wsdl2java.bat異步

Microsoft Windows XP [版本 5.1.2600]
(C) 版權全部 1985-2001 Microsoft Corp.url

C:\Documents and Settings\Jambhala>d:spa

D:\>cd D:\WebService\Axis\axis2\axis2-1.5.4-bin\axis2-1.5.4\bin插件

D:\WebService\Axis\axis2\axis2-1.5.4-bin\axis2-1.5.4\bin>wsdl2java -uri http://l
ocalhost:8081/TestAxis2Ws/services/HelloService?wsdl -p axis2.service.server -o
stub
Using AXIS2_HOME:   D:\WebService\Axis\axis2\axis2-1.5.4-bin\axis2-1.5.4
Using JAVA_HOME:    C:\Java\jdk1.6.0
Retrieving document at 'http://localhost:8081/TestAxis2Ws/services/HelloService?
wsdl'.
D:\WebService\Axis\axis2\axis2-1.5.4-bin\axis2-1.5.4\bin>
這時到axis2的bin目錄下會發現出現了一個stub目錄,以下圖所示:axis2經過wsdl生成客戶端程序並本地調用

axis2經過wsdl生成客戶端程序並本地調用

axis2經過wsdl生成客戶端程序並本地調用

其中HelloServiceStub.java是客戶端程序,HelloServiceCallbackHandler.java是異步客戶端程序。

把這兩個類複製到上次已經創建好的服務端工程裏,以下圖所示:

要參考上一次寫的MyEclipse整合Axis2插件的文章(http://shihuan830619.iteye.com/blog/1136607)

axis2經過wsdl生成客戶端程序並本地調用

注意:這個地方複製進來後會報錯的,由於在D:\WebService\Axis\axis2\axis2-1.5.4-bin\axis2-1.5.4\bin\stub\src\axis2\service\server下的類路徑爲package axis2.service.server;須要改爲packageaxis2.service.client;而且須要把HelloServiceStub.java和HelloServiceCallbackHandler.java相關的報錯位置都把路徑改一下,不要閒煩,要改的地方還滿多的呢。

建立帶main方法的StubClient.java類文件,代碼以下:

package axis2.service.domain;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

import axis2.service.client.HelloServiceStub;

public class StubClient {

 
 public static void main(String[] args) {
  HelloServiceStub stub = null;
  try {
   stub = new HelloServiceStub();
   HelloServiceStub.SayHello sh = new HelloServiceStub.SayHello();
   sh.setName("於士博");
   System.out.println(stub.sayHello(sh).get_return());
  } catch (AxisFault e) {
   e.printStackTrace();
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }

}

運行後會看到以下結果:

log4j:WARN No appenders could be found for logger (org.apache.axis2.description.AxisService).
log4j:WARN Please initialize the log4j system properly.
Hello, 於士博!

 

解釋:

上面的代碼大大簡化了調用WebService的步驟,並使代碼更加簡潔。但要注意的是,wsdl2java.bat命令生成的Stub類將WebService方法的參數都封裝在了相應的類中,類名(SayHello)爲方法名,例如,sayHello方法的參數都封裝在了SayHello類中,要想調用sayHello方法,必須先建立SayHello類的對象實例。

 

--------------------------------------------------------------------------------------------------

下面介紹純手動編寫Java代碼客戶端程序:

package axis2.service.domain;

import javax.xml.namespace.QName;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class HelloClient {

 
 public static void main(String[] args) {
  
  //使用RPC方式調用WebService 

  RPCServiceClient serviceClient = null;
  try {
         serviceClient = new RPCServiceClient();
         Options options = serviceClient.getOptions();
         //指定調用WebService的URL
         EndpointReference targetEPR = newEndpointReference("http://localhost:8081/TestAxis2Ws/services/HelloService");
         options.setTo(targetEPR);
         //指定sayHello方法的參數值
         Object[] opAddEntryArgs = new Object[] {"於士博"};
         //指定sayHello方法返回值的數據類型的Class對象
         Class[] classes = new Class[] {String.class};
         //指定要調用的sayHello方法及WSDL文件的命名空間
         QName opAddEntry = new QName("http://server.service.axis2", "sayHello");
         //調用sayHello方法並輸出該方法的返回值

         String result = serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)

                         [0].toString();

         serviceClient.cleanupTransport();  //爲了防止鏈接超時
         System.out.println(result);
         //System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)

           [0]);
  } catch (AxisFault e) {
   e.printStackTrace();
  }
  
 }

}

 

【注】:在本例中使用了RPCServiceClient類的invokeBlocking方法調用了WebService中的方法。

        invokeBlocking方法有三個參數,其中第一個參數的類型是QName對象,表示要調用的方法名;第二個

        參數表示要調用的WebService方法的參數值,參數類型爲Object[];第三個參數表示WebService方法的

        返回值類型的Class對象,參數類型爲Class[]。

        當方法沒有參數時,invokeBlocking方法的第二個參數值不能是null,而要使用new Object[]{}

        若是被調用的WebService方法沒有返回值,應使用RPCServiceClient類的invokeRobust方法,該方法只

        有兩個參數,它們的含義與invokeBlocking方法的前兩個參數的含義相同。

        在建立QName對象時,QName類的構造方法的第一個參數表示WSDL文件的命名空間名,也就是

        <wsdl:definitions>元素的targetNamespace屬性值。

相關文章
相關標籤/搜索