2012年9月26日 星期三

加法服務

加法服務

This document is provided as is. You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟
請勿轉貼


在之前的範例中,我們開發了一個回傳字串的服務:TimeService。在這個 範例,我們將提供一個簡單的服務,該服務允許 client 傳給 service 兩個整數, 然後 service 將兩個整數加總後回傳。如果各位是好奇寶寶的話,其實你們可以 嘗試將服務改成其它資料型態、改成減法/乘法、或者攝氏轉華氏的服務等。 發布 AdditionService 服務的步驟整理如下:
  1. 撰寫 Addition.java 如下,並將 compile 好的 .class 檔放到 axis\WEB-INF\classes
    public class Addition {
      public Addition() {
      }
    
      public int addNumbers(int a, int b) {
        return a + b;
      }
    }
    
  2. 產生一個註冊用的 WSDD 檔,以我們的範例而言,這個 WSDD 檔的內容 如下,並假設這個檔案的名稱是 deploy-add.wsdd
    01 <deployment xmlns="http://xml.apache.org/axis/wsdd/"
    02     xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    03
    04   <service name="AdditionService" provider="java:RPC"
    04               style="wrapped" use="literal">
    05     <parameter name="className" value="Addition" />
    06     <parameter name="allowedMethods" value="*" />
    07   </service>
    08 </deployment>
    
    然後執行下列指令來完成註冊。
    adminclient.bat deploy-add.wsdd
    
  3. 檢查該服務的 WSDL(尤其是比對 document/literal wrapped 的部分):
    <wsdl:types>
      <schema elementFormDefault="qualified" targetNamespace="http://DefaultNamespace" xmlns="http://www.w3.org/2001/XMLSchema">
        <element name="addNumbers">
          <complexType>
            <sequence>
              <element name="in0" type="xsd:int"/>
              <element name="in1" type="xsd:int"/>
            </sequence>
          </complexType>
        </element>
        <element name="addNumbersResponse">
          <complexType>
            <sequence>
              <element name="addNumbersReturn" type="xsd:int"/>
            </sequence>
          </complexType>
        </element>
      </schema>
    </wsdl:types>
    
    <wsdl:message name="addNumbersRequest">
      <wsdl:part element="tns1:addNumbers" name="parameters"/>
    </wsdl:message>
    
    <wsdl:message name="addNumbersResponse">
      <wsdl:part element="tns1:addNumbersResponse" name="parameters"/>
    </wsdl:message>
    
    <wsdl:portType name="Addition">
      <wsdl:operation name="addNumbers">
        <wsdl:input message="impl:addNumbersRequest" name="addNumbersRequest"/>
        <wsdl:output message="impl:addNumbersResponse" name="addNumbersResponse"/>
      </wsdl:operation>
    </wsdl:portType>
    
  4. 測試 service 並檢查 SOAP 訊息:請在瀏覽器上,輸入 http://localhost:8080/axis/services/AdditionService?method=addNumbers&in0=7&in1=6。 剛剛輸入的 URL 有一個地方要注意一下:addNumbers 的兩個參數名稱為 in0 和 in1, 這兩個名稱是從 WSDL 內決定的。執行後,service 回傳的 SOAP 訊息如下:
    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <soapenv:Body>
        <addNumbersResponse xmlns="">
          <ns1:addNumbersReturn xmlns:ns1="http://localhost:8080/axis/services/AdditionService">13</ns1:addNumbersReturn>
        </addNumbersResponse>
      </soapenv:Body>
    </soapenv:Envelope>
    
  5. 利用 WSDL2Java 來產生所需要的 proxy 類別,並開發 client 程式如下:
    import java.rmi.*;
    import javax.xml.rpc.*;
    import javax.swing.*;
    
    import localhost.axis.services.AdditionService.*;
    
    public class AddClient {
      public static void main(String[] args) throws RemoteException, 
                                                    ServiceException {
        AdditionService service = new AdditionServiceLocator();
        Addition call = service.getAdditionService();
        
        String input = JOptionPane.showInputDialog("第一個整數");
        int num1 = Integer.parseInt(input);
        input = JOptionPane.showInputDialog("第二個整數");
        int num2 = Integer.parseInt(input);
    
        int result = call.addNumbers(num1, num2);
    
        System.out.println("總合 = " + result);
      }
    }
    



Written by: 國立中興大學資管系呂瑞麟



沒有留言:

張貼留言