このレッスンでは、DISH サービスで生成された WSDL ドキュメントをインポートし、WSDL ドキュメントで定義されたスキーマに基づいてテーブルデータにアクセスする Java アプリケーションを作成します。
コマンドプロンプトで、Java コードと生成ファイル用に新しい作業ディレクトリを作成します。この新しいディレクトリに移動します。
次のコマンドを使用して、DISH Web サービスを呼び出し WSDL ドキュメントをインポートするインターフェイスを生成します。
wsimport -keep -Xendorsed "http://localhost:8082/demo/WSDish" |
wsimport アプリケーションは、特定の URL から WSDL ドキュメントを取得します。WSDL ドキュメント用のインターフェイスを作成するために .java ファイルを生成して、.class ファイルにコンパイルします。
keep オプションは、クラスファイルの生成後に .java ファイルを削除しないことを示します。これらのファイルにより、生成されたソースコードを理解できるようになります。
Xendorsed オプションを指定すると、前のレッスンでオーバーロードされた承認済みの標準を使用できるようになります。
wsimport アプリケーションは、現在の作業ディレクトリに localhost\_8082\demo\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
生成された API に定義されるデータセットオブジェクトに基づいて、データベースサーバーからテーブルデータにアクセスする 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 メソッドの詳細については、 http://docs.oracle.com/javaee/6/api/ にある javax.xml.bind.JAXBElement クラスのマニュアルを参照してください。
次のコマンドを使用して、Java アプリケーションをコンパイルします。
javac SASoapDemo.java |
次のコマンドを使用して、アプリケーションを実行します。
java SASoapDemo |
アプリケーションは、Web サーバーに要求を送信し、いくつかのローエントリが含まれたローセットを持つ EmployeeListResult で構成される XML 結果セット応答を受信します。応答には、クエリの実行結果の SQLCODE が含まれます。
次の例は、生成される出力を示します。
(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 応答を示します。
<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> |
各ローセットには、カラム名とデータ型が含まれます。
XML メッセージトラフィックを記録するプロキシソフトウェアを使用して、上記の応答を確認することができます。プロキシは、クライアントアプリケーションと Web サーバーの間に挿入されます。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |