天天看點

webservice學習 使用dii的方式:  使用Stubs方式: 

注:紅色部分為我添加的。

axis支援三種web service的部署和開發,分别為:

1.Dynamic Invocation Interface ( DII)

2.Stubs方式

1.編寫服務端程式HelloService

public class HelloService{

public String getName(String name)

{

return "Welcome to Axis, "+name;

}

2.将源碼拷貝到AXIS_HOME下,重命名為 HelloService.jws

4.編寫通路服務的用戶端 HelloClient.java,編譯,執行,在指令提示行下會看到 "return value is Welcome to Axis ,fengshan"

public class HelloClient { 

  public static void main(String[] args) { 

    try { 

      String endpoint = "http://localhost:8080/axis/HelloService.jws"; 

      Service service = new Service(); 

      Call call = null; 

      call = (Call) service.createCall(); 

      call.setOperationName(new QName( 

          "http://localhost:8080/axis/HelloService.jws", "getName")); 

      call.setTargetEndpointAddress(new java.net.URL(endpoint)); 

      String ret = (String) call.invoke(new Object[] { "fengshan" }); 

      System.out.println("return value is " + ret); 

    } catch (Exception ex) { 

      ex.printStackTrace(); 

    } 

  } 

總結:dii方式比較簡單,伺服器端暴露一個類,用戶端通過固定的方式(套路來通路伺服器提供的服務)

伺服器:寫一個類,裡面有一個業務方法,然後将字尾名字從java改成jws

用戶端:1.構造連接配接位址:http://localhost:8080/axis/HelloService.jws (ip+路徑+類名.jws)

      2.構造vservice對象,掉用service對象的createCall()方法傳回call對象

      3.調用call對象的etOperationName()方法設定通路webservice資源的參數

      4.調用call對象的invoke()方法,并且傳遞對象數組,字元串類型,(通過wsdl可以觀察出request和response的參數,根據這些表述,來設定請求參數和接受傳回資料)

1.伺服器端仍然使用HelloService.java,編譯後将他放在axis\WEB-INF\classes下

2.編寫deploy.wsdd檔案,聲明伺服器端需要釋出的webservice的名字,和她的方法(放在web-inf目錄下)

deploy.wsdd内容:

<deployment xmlns="http://xml.apache.org/axis/wsdd/" 

        xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

<service name="HelloService" provider="java:RPC"> 

    <parameter name="className"    

            value="HelloService"/> 

    <parameter name="allowedMethods" value="*"/>    <!---這裡也可以填寫需要暴露的方法的名字-> 

</service> 

</deployment>    

4.接下來用戶端測試該服務。

首先,在環境變量中設定CLASSPATH,加入以下jar:%AXIS_LIB%\axis.jar;

%AXIS_LIB%\axis-ant.jar; 

%AXIS_LIB%\commons-discovery.jar;

%AXIS_LIB%\commons-logging.jar;

%AXIS_LIB%\jaxrpc.jar;

%AXIS_LIB%\saaj.jar;

%AXIS_LIB%\log4j-1.2.8.jar;

%AXIS_LIB%\wsdl4j.jar 

可以通過以下指令檢視是否設定好了CLASSPATH:Echo %CLASSPATH%。

Axis提供了實作WSDL2Java的指令行工具org.apache.axis.wsdl.WSDL2Java,利用這個工具可以從WSDL位址處生成Java代碼。指令如下:(在axis目錄下)

會在com(由上述指令行中參數設定)包下生成HelloService.java、HelloServiceService.java、HelloServiceServiceLocator.java和HelloServiceSoapBindingStub.java四個檔案。

5.編寫測試類(在axis目錄下)

public class HelloClient 

    public static void main(String[] args) 

    { 

     try 

     {    

        com.HelloServiceServiceLocator locator=new com.HelloServiceServiceLocator(); 

        com.HelloService service=locator.getHelloService(); 

        System.out.println(service.getName("fengshan")); 

     } 

     catch(Exception e) 

     { 

         System.err.println("Execution failed.Exception:"+e); 

使用步驟:

1.    在獲得自動映射的4個類以後,new一個 loctor對象,這個對象實作了 一個接口(HelloServiceService ),調用接口種的方法getHelloService()獲得一個service對象,然後用這個對象調用webservice暴露的方法會得到一個傳回值(String).

我們自己也可以簡單寫一個用戶端來調用:

public <b>class</b> HelloWorldClient1 {

       <b>public</b> <b>static</b> <b>void</b> main(String[] args) {

              <b>try</b> {

                     Service service = <b>new</b> Service();

                     String Url = "http://localhost:8080/axis/services/HelloService";

                     Call call = (Call) service.createCall();

                     call.setTargetEndpointAddress(Url); 

                     call.setOperationName(<b>new</b> QName(Url, "getName"));

                     String result = (String) call.invoke(<b>new</b> Object[] { "winwin" });

                     System.out.println(result); 

              } <b>catch</b> (ServiceException e) {

                     e.printStackTrace();

              } <b>catch</b> (RemoteException e) {

              }

       }

其實上面四個自動生成的java檔案也就是像以上這個用戶端這樣來調用的。可以對照看看。

本文轉自 yzzh9 51CTO部落格,原文連結:http://blog.51cto.com/java999/187468,如需轉載請自行聯系原作者