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 (Deutsch) » SQL Anywhere Server - Programmierung » HTTP-Webdienste » Beispiele für HTTP-Webdienste » Praktische Einführung: Verwenden von JAX-WS für den Zugriff auf einen SOAP/DISH-Webdienst

 

Lektion 2: Java-Anwendung für die Kommunikation mit dem Webserver erstellen

In dieser Lektion verarbeiten Sie das aus dem DISH-Dienst generierte WSDL-Dokument und erstellen eine Java-Anwendung für den Zugriff auf Tabellendaten, basierend auf dem im WSDL-Dokument definierten Schema.

Voraussetzungen

Diese Lektion hängt von den in Lektion 1 ausgeführten Schritten ab. Siehe Lektion 1: Einrichten eines Webservers für den Empfang von SOAP-Anforderungen und das Senden von SOAP-Antworten.

In dieser Lektion wird davon ausgegangen, dass Sie die Rollen und Privilegien haben, die im Abschnitt "Privilegien" am Anfang dieser praktischen Einführung aufgeführt sind: Praktische Einführung: Verwenden von JAX-WS für den Zugriff auf einen SOAP/DISH-Webdienst.

Kontext und Bemerkungen

Zum Zeitpunkt des Erstellens dieser Dokumentation war JAX-WS in JDK 1.7.0 enthalten und die neueste Version von JAX-WS war 2.2.7. Die nachstehenden Schritte basieren auf dieser Version. Um zu ermitteln, ob JAX-WS in Ihrem JDK vorhanden ist, suchen Sie nach der Anwendung wsimport im JDK-Verzeichnis bin. Wenn sie dort nicht vorhanden ist, gehen Sie zu [external link] http://jax-ws.java.net/, um die neueste Version von JAX-WS herunterzuladen und zu installieren.

Diese Lektion enthält mehrere Verweise auf localhost. Verwenden Sie statt localhost den Hostnamen oder die IP-Adresse des Webservers aus Lektion 1, wenn der Webclient nicht auf demselben Computer ausgeführt wird wie der Webserver.

 Aufgabe
  1. Erstellen Sie an einer Eingabeaufforderung ein neues Arbeitsverzeichnis für Ihren Java-Code und die zugehörigen generierten Dateien. Wechseln Sie zu diesem neuen Verzeichnis.

  2. Erstellen Sie mit dem folgenden Befehl die Schnittstelle, die den DISH-Webdienst aufruft und das WSDL-Dokument erstellt:

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

    Die Anwendung wsimport ruft das WSDL-Dokument von der angegebenen URL ab. Sie generiert .java Dateien, um dafür eine Schnittstelle zu erstellen, und kompiliert sie dann in .class-Dateien.

    Die Option keep gibt an, dass die .java-Dateien nach dem Generieren der Klassendateien nicht gelöscht werden sollen. Der generierte Java-Quellcode ermöglicht es Ihnen, die generierten Klassendateien zu verstehen.

    Die Anwendung wsimport erstellt in Ihrem aktuellen Arbeitsverzeichnis eine neue Unterverzeichnisstruktur namens localhost\_8082\demo\ws. Im Folgenden finden Sie eine Liste der Inhalte im Verzeichnis 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. Schreiben Sie eine Java-Anwendung, die anhand des im generierten Quellcode definierten DataSet-Objektschemas auf Tabellendaten vom Datenbankserver zugreift.

    Im Folgenden finden Sie ein Beispiel einer Java-Anwendung, die dies ausführt. Speichern Sie den Quellcode als Datei SASoapDemo.java im aktuellen Arbeitsverzeichnis. Ihr aktuelles Arbeitsverzeichnis muss das Verzeichnis sein, das das Unterverzeichnis localhost enthält.



    // 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();
        }
      }
    }

    Diese Anwendung gibt alle vom Server gelieferten Spaltendaten in der Standardsystemausgabe aus.

    Hinweis

    Diese Anwendung geht davon aus, dass Ihr SQL Anywhere-Webserver entsprechend der Anweisungen in der ersten Lektion Port 8082 überwacht. Ersetzen Sie den Teil 8082 der Codezeile import localhost._8082.demo.ws.* durch die von Ihnen beim Start des SQL Anywhere-Webservers angegebene Portnummer.

    Weitere Hinweise zu den in dieser Anwendung verwendeten Java-Methoden finden Sie in der API-Dokumentation der javax.xml.bind.JAXBElement-Klasse unter [external link] http://docs.oracle.com/javase/.

  4. Kompilieren Sie Ihre Java-Anwendung mit dem folgenden Befehl:

    javac SASoapDemo.java
  5. Führen Sie die Anwendung mit dem folgenden Befehl aus:

    java SASoapDemo
  6. Die Anwendung sendet ihre Anforderung an den Webserver. Sie empfängt eine Antwort mit einer XML-Ergebnismenge, die aus einem EmployeeListResult mit einer Zeilengruppe mit mehreren Zeileneinträgen besteht.

Ergebnisse

Im Folgenden finden Sie ein Beispiel für die Ausgabe aus 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

Die Spalte TerminationDate wird nur gesendet, wenn ihr Wert nicht NULL ist. Die Java-Anwendung ist dafür konzipiert, zu erkennen, wenn die Spalte TerminationDate nicht vorhanden ist. Bei diesem Beispiel wurde die letzte Zeile in der Employees-Tabelle geändert, um ein Nicht-NULL-Beendigungsdatum festzulegen.

Im Folgenden finden Sie ein Beispiel für eine SOAP-Antwort vom Webserver. Das SQLCODE-Ergebnis der ausgeführten Abfrage ist in der Antwort enthalten.



<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>

Spaltennamen und Datentypen sind in jeder Zeilengruppe enthalten.