next up previous
Nächste Seite: Objekte Aufwärts: Beispielprogramme Vorherige Seite: Software

Quelltexte

Sobald Tomcat oder ein anderer JSP-Server läuft ist ein Service schnell geschrieben. Man muß nur die gewünschten Prozeduren schreiben. Ergebnisse an den Client werden einfach per ,,return`` zurückgegeben.

Die Umgebung für den richtigen Aufruf, die SOAP Codierung und Decodierung sowie die Kommunikation übernimmt der rpcclient aus dem Apache SOAP Paket.

Folgendes Beispielservice liefert einen übergebenen String gespiegelt wieder zurück.

//ein Beispiel für ein Webservice
package demo;       

public class DemoService {
    public String mirror(String text) {
        String erg = new String();
        for(int n=0; n<text.length(); n++) {
            erg = text.charAt(n) + erg; 
        }
        return erg;
    }
}

Natürlich muß die Klasse im CLASSPATH von Tomcat (oder des sonst verwendeten Servers) stehen. Damit man nicht jedes Testprojekt neu eintragen muß bietet sich an, mit Packages zu arbeiten. Die Packages kommen dann jeweils in einen eigenen Unterordner in einem im CLASSPATH stehenden Arbeitsverzeichniss.

Damit der rpcrouter das neue Service auch kennt muß es bekannt gemacht werden. Das geht über eine Maske im SOAP-Admin Client. Diese Maske ist mit einem Browser erreichbar unter http://greg.local:8080/soap/admin/index.html wobei hier greg.local der Rechner ist, auf dem der Server läuft. \epsfig{file=deploydemo.eps,width=16cm} Das Apache SOAP Admintool ermöglicht die Verwaltung der Services per Browser. In die Maske muß die ID des Services sowie die Methoden, die es anbietet eingetragen werden. Als ID wird ,,urn:demo`` verwendet, die einzige Methode, die das Service anbietet ist ,,mirror``. ,,Provider Typ`` ist Java, da das Beispiel in Java geschrieben wurde. ,,Scope`` bestimmt die Lebenszeit einer Instanz der aufzurufenden Klasse.

Mögliche Werte für ,,Scope`` sind:

Beim Scope auf ,,Session`` wird das Cookie aus dem HTTP-Header verwendet um die einzelnen Sitzungen zu unterscheiden.

Nun ist noch die Javaklasse anzugeben, die das Service bereitstellt im Beispiel ,,demo.DemoService``.

Anstatt das Formular zu verwenden kann man die benötigten Daten auch über ein Kommandizeilenprogramm übergeben, dazu mehr im nächsten Beispiel.

Um auf das angebotenen Service zugreifen zu können braucht man einen Client.

package demo;       
import java.net.URL;
import java.util.Vector;
import org.apache.soap.SOAPException;
import org.apache.soap.Constants;
import org.apache.soap.Fault;
import org.apache.soap.rpc.Call;
import org.apache.soap.rpc.Parameter;
import org.apache.soap.rpc.Response;

public class DemoClient {
    public static void main(String[] args) {
    String text = new String();    
    URL url;
    if(args.length != 2) {  //stimmt die Zahl der Argumente?
        System.err.println("Aufruf: java demo.DemoClient \
                   [SOAP-router-URL] [text]");
        System.exit(1);
    }    
    try {
        url = new URL(args[0]);
        text = args[1];
    //den Aufruf vorbereiten
    Call call = new Call();
    call.setTargetObjectURI("urn:demo"); //ID des aufzurufenden Services   
    call.setMethodName("mirror"); //Name der Prozedur
    call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC); //standard 
                                                     //SOAP Codierung
    Vector myParameter = new Vector();
    myParameter.addElement(new Parameter("text", String.class, text, null)); 
    call.setParams(myParameter);

    //der Aufruf
    Response resp = null;
    try {
        resp = call.invoke(url, "");
    }
    catch( SOAPException e )
    {
        System.err.println("SOAP Exception (" + e.getFaultCode() + "): " \
                                                         + e.getMessage());
        System.exit(1);
    }
        //Ergebniss auswerten
        if( !resp.generatedFault()) {
            Parameter ret = resp.getReturnValue();
            Object value = ret.getValue();
            System.out.println(value);
        }
        else {
            Fault fault = resp.getFault();
            System.err.println("zurückgelieferter Fehler:");
            System.err.println (" Fault Code = " + fault.getFaultCode());
            System.err.println (" Fault String = " + fault.getFaultString()); 
        }
       }
         catch(Exception e) {
            System.err.println("Sonstige Exception");
            e.printStackTrace();
        }
     }
}

Um das Beispiel nicht all zu groß zu machen wurde die Fehlerbehandlung sehr einfach gehalten: wenn ein Feher auftritt wird der ausgegeben und dann abgebrochen.

Bei Programmaufruf ist der erste parameter die URL des Servers, der den Dienst anbietet. der zweite Parameter ist der zu bearbeitende Text.

Zunächst wird der Aufruf vorbereitet, also ein neuere Aufruf (Call) angelegt. Mit setTargetObjectURI wird das aufzurufende Service ausgewählt. Dann legt setMethodName die gewünschte Prozedur fest. Die ausgewählte codierung ist die standard SOAP Codierung. Für die Parameterübergabe wird ein Vektor benötigt, in dem die Parameter in der richtigen Reihenfolge stehen müssen. Der erste Parameter der aufzurufenden Funktion ist das erste Vektorelement.

Jetzt kommt der eigentliche Aufruf. Die Bibliotheksfunktion liefert für alle möglichen Fehler die dabei auftreten können eine passende Exception auf die dann entsprechend reagiert werden kann. Im Beispiel wird bei Fehlern einfach abgebrochen.

Nach erfolgreichem Aufruf gilt es nun, die Antwort auszuwerten. Sie kann das gewünschte Ergebniss oder eine Fehlermeldung enthalten. Auch die könnte man sehr viel genauer auswerten.

Wenn alles klappt sieht das ganze so aus:

$ java demo/DemoClient \
> http://greg.local:8080/soap/servlet/rpcrouter 'Hallo Sie da!'
!ad eiS ollaH
$


next up previous
Nächste Seite: Objekte Aufwärts: Beispielprogramme Vorherige Seite: Software
Wolfgang Becker 2002-01-22