Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 » SQL Anywhere サーバ プログラミング » HTTP Web サービス » HTTP Web サービスの例 » チュートリアル:JAX-WS を使用した SOAP/DISH Web サービスへのアクセス

 

レッスン 2:Web サーバと通信するための Java アプリケーションの作成

このレッスンでは、DISH サービスで生成された WSDL ドキュメントを処理し、WSDL ドキュメントで定義されたスキーマに基づいてテーブルデータにアクセスする Java アプリケーションを作成します。

前提条件

このレッスンの内容は、レッスン 1 で行われたステップによって異なります。 レッスン 1:SOAP 要求を受信し SOAP 応答を送信する Web サーバの設定を参照してください。

このレッスンでは、このチュートリアルの開始時に、権限のセクションで一覧されているロールと権限を持っていることを前提としています。 チュートリアル:JAX-WS を使用した SOAP/DISH Web サービスへのアクセス

内容と備考

本書作成時点では、JAX-WS は JDK 1.7.0 に含まれており、JAX-WS の最新バージョンは 2.2.7 でした。次のステップはそのバージョンによって決まります。JDK に JAX-WS が存在するかどうかを確認するには、JDK bin ディレクトリで wsimport アプリケーションをチェックしてください。存在しない場合、[external link] http://jax-ws.java.net/ にアクセスし、最新バージョンの JAX-WS をダウンロードしてインストールします。

このレッスンには、localhost への複数の参照が含まれています。Web クライアントを Web サーバと同じコンピュータで実行していない場合は、localhost の代わりにレッスン 1 の Web サーバのホスト名または IP アドレスを使用します。

 ♦ タスク
  1. コマンドプロンプトで、Java コードと生成ファイル用に新しい作業ディレクトリを作成します。この新しいディレクトリに移動します。

  2. 次のコマンドを使用して、DISH Web サービスを呼び出し WSDL ドキュメントをインポートするインタフェースを生成します。

    wsimport -keep "http://localhost:8082/demo/WSDish"

    wsimport アプリケーションは、特定の URL から WSDL ドキュメントを取得します。WSDL ドキュメント用のインタフェースを作成するために .java ファイルを生成して、.class ファイルにコンパイルします。

    keep オプションは、クラスファイルの生成後に .java ファイルを削除しないことを示します。生成された Java ソースコードを使用すると、生成されたクラスファイルについて理解できます。

    wsimport アプリケーションは、現在の作業ディレクトリに localhost\_8082\demo\ws という新しいサブフォルダを作成します。次に、ディレクトリ ws の内容のリストを示します。

    • EmployeeList.class

    • EmployeeList.java

    • EmployeeListDataset$Rowset$Row.class

    • EmployeeListDataset$Rowset.class

    • EmployeeListDataset.class

    • EmployeeListDataset.java

    • EmployeeListResponse.class

    • EmployeeListResponse.java

    • FaultMessage.class

    • FaultMessage.java

    • ObjectFactory.class

    • ObjectFactory.java

    • package-info.class

    • package-info.java

    • WSDish.class

    • WSDish.java

    • WSDishSoapPort.class

    • WSDishSoapPort.java

  3. 生成されたソースコードに定義されるデータセットオブジェクトに基づいて、データベースサーバからテーブルデータにアクセスする Java アプリケーションを作成します。

    次に、これを実行するサンプル Java アプリケーションを示します。ソースコードを、現在の作業ディレクトリに SASoapDemo.java として保存します。現在の作業ディレクトリには、localhost サブフォルダが含まれている必要があります。



    // SASoapDemo.java illustrates a web service client that
    // calls the WSDish service and prints out the data.
    
    import java.util.*;
    import javax.xml.ws.*;
    import org.w3c.dom.Element;
    import org.w3c.dom.Node;
    import javax.xml.datatype.*;
    import localhost._8082.demo.ws.*;
    
    public class SASoapDemo
    {
      public static void main( String[] args )
      {
        try {
          WSDish service = new WSDish();
    
          Holder<EmployeeListDataset> response = 
              new Holder<EmployeeListDataset>();
          Holder<Integer> sqlcode = new Holder<Integer>();
                
          WSDishSoapPort port = service.getWSDishSoap();
    
          // This is the SOAP service call to EmployeeList
          port.employeeList( response, sqlcode );
    
          EmployeeListDataset result = response.value;
          EmployeeListDataset.Rowset rowset = result.getRowset();
    
          List<EmployeeListDataset.Rowset.Row> rows = rowset.getRow();
    
          String fieldType;
          String fieldName;
          String fieldValue;
          Integer fieldInt;
          XMLGregorianCalendar fieldDate;
          
          for ( int i = 0; i < rows.size(); i++ ) {
            EmployeeListDataset.Rowset.Row row = rows.get( i );
    
            fieldType = row.getEmployeeID().getDeclaredType().getSimpleName();
            fieldName = row.getEmployeeID().getName().getLocalPart();
            fieldInt = row.getEmployeeID().getValue();
            System.out.println( "(" + fieldType + ")" + fieldName + 
                                "=" + fieldInt );
            
            fieldType = row.getSurname().getDeclaredType().getSimpleName();
            fieldName = row.getSurname().getName().getLocalPart();
            fieldValue = row.getSurname().getValue();
            System.out.println( "(" + fieldType + ")" + fieldName + 
                                "=" + fieldValue );
            
            fieldType = row.getGivenName().getDeclaredType().getSimpleName();
            fieldName = row.getGivenName().getName().getLocalPart();
            fieldValue = row.getGivenName().getValue();
            System.out.println( "(" + fieldType + ")" + fieldName + 
                                 "=" + fieldValue );
            
            fieldType = row.getStartDate().getDeclaredType().getSimpleName();
            fieldName = row.getStartDate().getName().getLocalPart();
            fieldDate = row.getStartDate().getValue();
            System.out.println( "(" + fieldType + ")" + fieldName + 
                                "=" + fieldDate );
            
            if ( row.getTerminationDate() == null ) {
              fieldType = "unknown";
              fieldName = "TerminationDate";
              fieldDate = null;
            } else {
              fieldType = 
                row.getTerminationDate().getDeclaredType().getSimpleName();
              fieldName = row.getTerminationDate().getName().getLocalPart();
              fieldDate = row.getTerminationDate().getValue();
            }
            System.out.println( "(" + fieldType + ")" + fieldName + 
                                "=" + fieldDate );
            System.out.println();
          }
        }
        catch (Exception x) {
          x.printStackTrace();
        }
      }
    }

    このアプリケーションは、サーバが提供するすべてのカラムデータを標準のシステム出力に表示します。

    注意

    このアプリケーションでは、レッスン 1 で指示すように、SQL Anywhere Web サーバがポート 8082 で受信することを前提としています。import localhost._8082.demo.ws.* コード行の 「8082」 部分を、SQL Anywhere Web サーバを起動したときに指定したポート番号に置き換えます。

    このアプリケーションで使用される Java メソッドの詳細については、[external link] http://docs.oracle.com/javase/にある javax.xml.bind.JAXBElement クラス API のマニュアルを参照してください。

  4. 次のコマンドを使用して、Java アプリケーションをコンパイルします。

    javac SASoapDemo.java
  5. 次のコマンドを使用して、アプリケーションを実行します。

    java SASoapDemo
  6. アプリケーションは、Web サーバに要求を送信し、いくつかのローエントリが含まれたローセットを持つ EmployeeListResult で構成される XML 結果セット応答を受信します。

結果

次に、実行中の SASoapDemo からの出力例を示します。



(Integer)EmployeeID=102
(String)Surname=Whitney
(String)GivenName=Fran
(XMLGregorianCalendar)StartDate=1984-08-28
(unknown)TerminationDate=null

(Integer)EmployeeID=105
(String)Surname=Cobb
(String)GivenName=Matthew
(XMLGregorianCalendar)StartDate=1985-01-01
(unknown)TerminationDate=null
.
.
.
(Integer)EmployeeID=1740
(String)Surname=Nielsen
(String)GivenName=Robert
(XMLGregorianCalendar)StartDate=1994-06-24
(unknown)TerminationDate=null

(Integer)EmployeeID=1751
(String)Surname=Ahmed
(String)GivenName=Alex
(XMLGregorianCalendar)StartDate=1994-07-12
(XMLGregorianCalendar)TerminationDate=2008-04-18

TerminationDate カラムは、その値が NULL でない場合にのみ送信されます。この Java アプリケーションは、TerminationDate カラムが存在しない場合、それを検出するように設計されています。この例では、終了日に NULL 以外の値が設定され、Employees テーブルの最後のローが変更されました。

次の例は、Web サーバからの SOAP 応答を示します。応答には、クエリの実行結果の SQLCODE が含まれます。



<tns:EmployeeListResponse>
 <tns:EmployeeListResult xsi:type='tns:EmployeeListDataset'>
  <tns:rowset>
    <tns:row> ... </tns:row>
    .
    .
    .
    <tns:row>
      <tns:EmployeeID xsi:type="xsd:int">1751</tns:EmployeeID>
      <tns:Surname xsi:type="xsd:string">Ahmed</tns:Surname>
      <tns:GivenName xsi:type="xsd:string">Alex</tns:GivenName>
      <tns:StartDate xsi:type="xsd:dateTime">1994-07-12</tns:StartDate>
      <tns:TerminationDate xsi:type="xsd:dateTime">2010-03-22</tns:TerminationDate>
    </tns:row>
  </tns:rowset>
 </tns:EmployeeListResult>
 <tns:sqlcode>0</tns:sqlcode>
</tns:EmployeeListResponse>

各ローセットには、カラム名とデータ型が含まれます。