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

SQL Anywhere 12.0.1 (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 3: Erstellen einer Java-Anwendung für die Kommunikation mit dem Webserver

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

 Importieren eines WSDL-Dokuments vom Datenbankserver
  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 -Xendorsed "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. Mithilfe dieser Dateien können Sie den generierten Quellcode besser verstehen.

    Die Option Xendorsed ermöglicht die Verwendung der in einer früheren Lektion überschriebenen unterstützten Standards.

Die Anwendung wsimport erstellt in Ihrem aktuellen Arbeitsverzeichnis eine neue Unterverzeichnisstruktur mit dem Namen localhost\_8082\demo\ws. Nachstehend finden Sie eine Liste der Verzeichnisinhalte:

  • 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

 Zugriff auf Datenbankinformationen vom Server
  1. Schreiben Sie eine Java-Anwendung, die basierend auf dem in der generierten API definierten DataSet-Objektschema auf Tabellendaten vom Datenbankserver zugreift.

    Speichern Sie den folgenden Java-Quellcode als SASoapDemo.java im aktuellen Arbeitsverzeichnis. Beachten Sie, dass Ihr aktuelles Arbeitsverzeichnis das Verzeichnis sein muss, dass 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 Dokumentation der Klasse javax.xml.bind.JAXBElement unter [external link] http://docs.oracle.com/javaee/6/api/.

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

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

    java SASoapDemo
  4. Die Anwendung sendet ihre Anforderung an den Webserver. Sie ruft eine Antwort mit einer XML-Ergebnismenge ab, die aus einem EmployeeListResult mit einer Zeilengruppe mit mehreren Zeileneinträgen besteht. Das SQLCODE-Ergebnis der ausgeführten Abfrage ist in der Antwort enthalten.

Im Folgenden finden Sie ein Beispiel für die generierte Ausgabe:



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



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

Hinweis

Sie können die oben angezeigte Antwort verfolgen, indem Sie eine Proxy-Software verwenden, die das XML-Nachrichtenaufkommen protokolliert. Der Proxy steht zwischen Ihrer Clientanwendung und dem Webserver.