Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Generics, innere Klassen
10 Die Klassenbibliothek
11 Threads und nebenläufige Programmierung
12 Datenstrukturen und Algorithmen
13 Raum und Zeit
14 Dateien und Datenströme
15 Die eXtensible Markup Language (XML)
16 Grafische Oberflächen mit Swing
17 Grafikprogrammierung
18 Netzwerkprogrammierung
19 Verteilte Programmierung mit RMI und Web–Services
20 JavaServer Pages und Servlets
21 Applets
22 Midlets und die Java ME
23 Datenbankmanagement mit JDBC
24 Reflection und Annotationen
25 Logging und Monitoring
26 Sicherheitskonzepte
27 Java Native Interface (JNI)
28 Dienstprogramme für die Java-Umgebung
Stichwort

Download:
- ZIP, ca. 14,1 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel (8. Auflage) von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel (8. Auflage)

Java ist auch eine Insel (8. Aufl.)
8., aktual. Auflage, geb., mit DVD
1.475 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1371-4
Pfeil 19 Verteilte Programmierung mit RMI und Web–Services
Pfeil 19.1 Entfernte Objekte und Methoden
Pfeil 19.1.1 Stellvertreter helfen bei entfernten Methodenaufrufen
Pfeil 19.1.2 Standards für entfernte Objekte
Pfeil 19.2 Java Remote Method Invocation
Pfeil 19.2.1 Zusammenspiel von Server, Registry und Client
Pfeil 19.2.2 Wie die Stellvertreter die Daten übertragen
Pfeil 19.2.3 Probleme mit entfernten Methoden
Pfeil 19.2.4 Nutzen von RMI bei Middleware-Lösungen
Pfeil 19.2.5 Zentrale Klassen und Schnittstellen
Pfeil 19.2.6 Entfernte und lokale Objekte im Vergleich
Pfeil 19.3 Auf der Serverseite
Pfeil 19.3.1 Entfernte Schnittstelle deklarieren
Pfeil 19.3.2 Remote-Objekt-Implementierung
Pfeil 19.3.3 Stellvertreterobjekte
Pfeil 19.3.4 Der Namensdienst (RegistryRegistry)
Pfeil 19.3.5 Remote-Objekt-Implementierung exportieren und beim Namensdienst anmelden
Pfeil 19.3.6 Einfaches Logging
Pfeil 19.3.7 Aufräumen mit dem DGC
Pfeil 19.4 Auf der Clientseite
Pfeil 19.5 Entfernte Objekte übergeben und laden
Pfeil 19.5.1 Klassen vom RMI-Klassenlader nachladen
Pfeil 19.6 Weitere Eigenschaften von RMI
Pfeil 19.6.1 RMI und CORBA
Pfeil 19.6.2 RMI über HTTP getunnelt
Pfeil 19.6.3 Automatische Remote-Objekt-Aktivierung
Pfeil 19.7 Daily Soap
Pfeil 19.7.1 SOAP-Protokoll
Pfeil 19.7.2 Die technische Realisierung
Pfeil 19.7.3 SOAP-Implementierungen
Pfeil 19.7.4 @WebService in Java 6
Pfeil 19.7.5 Einen Web-Service definieren
Pfeil 19.7.6 Web-Services veröffentlichen
Pfeil 19.7.7 Einen JAX-WS-Client implementieren
Pfeil 19.8 Java Message Service (JMSJMS)
Pfeil 19.9 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

19.7 Daily Soap Zur nächsten ÜberschriftZur vorigen Überschrift

Für die Nutzung entfernter Ressourcen und zum Aufruf entfernter Methoden gibt es mehrere klassische Ansätze. Ein einfaches Verfahren ist die Anfrage mit Parametern an einen Webserver, der den Inhalt zurückliefert. Zur Verteilung von Programmen haben sich CORBA, RPC, aber auch RMI bewährt. Der Weg über HTML hat den Vorteil, dass das Protokoll HTTP verbreitet ist, aber den Nachteil, dass kaum Möglichkeiten zur verteilten Programmierung gegeben sind. CORBA und RMI haftet der Nachteil an, dass ihre Kommunikation einen offenen Port erfordert, den Sicherheitsbeauftragte nicht unbedingt tolerieren. Zudem sind CORBA-Lösungen nicht wirklich einfach zu implementieren und ist RMI nicht plattformunabhängig. Idealerweise verheiratet eine Technik beide Vorteile: einfache Übertragung über HTTP und keine Bindung an Betriebssysteme und Programmiersprache.


Galileo Computing - Zum Seitenanfang

19.7.1 SOAP-Protokoll Zur nächsten ÜberschriftZur vorigen Überschrift

Bei den Firmen DevelopMentor, IBM, Lotus Development Corp., Microsoft und UserLand Software entstand das XML-basierte SOAP-Protokoll (bis Version 1.2 die Abkürzung für Simple Object Access Protocol). Es wird seit 1998 entwickelt und bietet einen einfachen Zugriff auf Server-Ressourcen mit den etablierten Webstandards HTTP und XML. SOAP selbst beschreibt die Art und Weise, wie Inhalte (Serialisierung) und die XML-Daten übertragen werden. Die Übertragung hat mit SOAP aber eigentlich nichts zu tun, denn dafür sind andere Protokolle definiert. HTTP ist ein ideales Transportprotokoll, da es für Webseiten in der Regel keine Beschränkungen von Firewalls gibt. Die beiden Kommunikationsparteien regeln mit SOAP so einen entfernten Methodenaufruf, der die Parameter und Ergebnisse in XML kodiert und überträgt. Durch die unabhängigen und anerkannten Webstandards bietet SOAP gegenüber RMI oder CORBA den Vorteil, nicht an eine Programmiersprache gebunden zu sein. Da Microsoft federführend bei der Spezifikation war und das .NET-Framework seine Kommunikation vollständig auf SOAP aufbaut, kann ein Java-Client theoretisch auf in C# implementierte SOAP-Dienste zurückgreifen. Die Übertragung kommt auch Sun mit seinem Ziel einer betriebssystem- und plattformunabhängigen Schnittstelle entgegen.

Probleme von SOAP

Den Vorteilen stehen allerdings einige Nachteile gegenüber. Die XML-Repräsentation der Dokumente macht die Dokumente groß und ein Parsen der Parameter und Ergebnisse auf beiden Seiten erforderlich. In Umgebungen, die eine performante Übertragung fordern – etwa bei der Kommunikation zwischen mobilem Endgerät und Server –, wird sich SOAP nicht so schnell durchsetzen. Des Weiteren ist auch die Sicherheit von SOAP-Verbindungen noch nicht hinreichend gelöst. Ein Client könnte sich mit einem Server verbinden und einen Aufruf starten, obwohl die Berechtigung fehlt. Sicherheitseigenschaften müssten erst auf der Serverseite implementiert werden. Die in Klartext übertragenen Nachrichten bilden ein weiteres Problem, das SSL jedoch verhindern kann.


Galileo Computing - Zum Seitenanfang

19.7.2 Die technische Realisierung Zur nächsten ÜberschriftZur vorigen Überschrift

Ein Clientprogramm besorgt sich, wie bei entfernten Programmen üblich, eine Referenz auf das entfernte Objekt. Das ist eine URL auf einen RPC-Router. Dieser Router wird mittels einer normalen HTTP-POST-Anfrage aktiviert. Er bekommt über den Client eine XML-kodierte Nachricht (Content-Typ ist einfach text/html), in der die aufzurufende Methode und ihre Parameter kodiert sind. Der RPC-Router nimmt diese Nachricht entgegen, parst das empfangene XML-Dokument und leitet die Anfrage an die Methode weiter. Diese produziert die Ausgabe, die wiederum als XML-Dokument über die Antwort vom Server zum Client geschickt wird. Der Client nimmt das Ergebnis entgegen, und die Kommunikation ist beendet.

SOAP bietet für entfernte Methodenaufrufe einige Standarddatentypen an. Zu diesen gehören einfache Datentypen wie Ganzzahlen, Fließkommazahlen, Zeit- und Datumsangaben und Binärdaten. Außerdem unterstützt SOAP zusammengesetzte Datentypen wie Strukturen und Arrays. Wie diese Daten nun tatsächlich in eine XML-Nachricht umgesetzt werden, müssen wir glücklicherweise nicht wissen. Als Endanwender kommen wir mit der Nachricht nicht in Kontakt.


Galileo Computing - Zum Seitenanfang

19.7.3 SOAP-Implementierungen Zur nächsten ÜberschriftZur vorigen Überschrift

SOAP ist nur ein Standard zum Austausch von Daten, aber kein Framework. Für nahezu jede Programmiersprache gibt es Implementierungen und APIs – und auch für Java gleich mehrere. Populär sind:

  • JAX-WS 2.0 (Java API for XML-Based Web Services 2.0) – früher JAX-RPC – ist eine standardisierte API von Sun. Die letzten Versionen von Java 6 liefern eine Implementierung der aktuellen JAX-WS 2.1 Spezifikation mit aus.
  • Apache Axis (Apache extensible Interaction System) unter http://ws.apache.org/axis/java/ ist ein Klassiker im SOAP-Geschäft. Apache Axis ist der Nachfolger von Apache Soap. (Ob eine Applikation Apache Soap oder Axis nutzt, ist gut an den Versionsnummern zu erkennen. Die letzte Apache Soap-Version war 2.3.1, während die aktuelle Axis-Version 1.2 ist. [Zur Konvertierung siehe auch http://tutego.com/go/soap2axis.] )

Da JAX-WS Sun-Standard und seit Java 6 integriert ist, wollen wir die SOAP-Aufrufe im Folgenden über diese Implementierung wählen. Für die Java-Version 5 müssen weitere Bibliotheken in den Klassenpfad aufgenommen werden. Von Sun gibt »The Java EE 5 Tutorial« (http://java.sun.com/javaee/5/docs/tutorial/doc/) einen Überblick mit Beispielen.


Galileo Computing - Zum Seitenanfang

19.7.4 @WebService in Java 6 Zur nächsten ÜberschriftZur vorigen Überschrift

In Java 6 hat Sun viele interessante Techniken integriert, um Web-Services einfach zu definieren und anzusprechen. Im ersten Schritt wollen wir einen Web-Service definieren und implementieren sowie ihn automatisch am integrierten Mini-Webserver anmelden. Die zentrale statische Methode dazu heißt Endpoint.publish(). Im nächsten Schritt lassen wir uns über ein mitgeliefertes Tool wsimport Zugriffsklassen generieren, um auf unseren selbst definieren Web-Service sowie den existierenden Web-Service von »JavaPortal News« im Internet zuzugreifen.


Galileo Computing - Zum Seitenanfang

19.7.5 Einen Web-Service definieren Zur nächsten ÜberschriftZur vorigen Überschrift

Web-Services mit JAX-WS 2 sind einfache Java-Klassen, die mit speziellen Annotationen versehen sind. Die Annotationen aus dem Paket javax.jws sind im Einzelnen:

  • @WebService. Jede Web-Service-Implementierung muss diese Klassen-Annotation besitzen. Optionale Elemente sind zum Beispiel name (bestimmt den <wsdl:portType>, Standard ist der unqualifizierte Name der Klasse bzw. Schnittstelle), targetNamespace, serviceName oder portName.
  • @SOAPBinding. Setzt den Stil der Nachrichten auf Dokument oder RPC.
  • @WebMethod. Die Annotation macht eine Methode zur Web-Service-Operation. Der Standard-Name unter <wsdl:operation> ist der Name der Methode; er lässt sich mit dem Element operationName ändern.
  • @WebParam. Beschreibt die Parameter genauer. Das Element name überschreibt den Parameternamen, der sonst »argX« hieße, für das WSDL-Element <wsdl:part>.
  • @WebResult. Definiert die Rückgabe einer Web-Service-Methode genauer.
  • @OneWay. Wird für asynchrone Aufrufe genutzt.

Wirklich nötig sind nur @WebMethod, @SOAPBinding und @WebService.

Beispiel

Unser folgender Web-Service deklariert zwei Methoden zur Veröffentlichung:

Listing 19.5 com/tutego/insel/ws/MyWebServices.java

package com.tutego.insel.ws; 
 
import javax.jws.*; 
import javax.jws.soap.SOAPBinding; 
 
@WebService(name="ChrisWebServices") 
@SOAPBinding(style = SOAPBinding.Style.RPC) 
public class MyWebServices 
{ 
  @WebMethod 
  public String hello( String name ) 
  { 
    return "Hello " + name + "!"; 
  } 
 
  @WebMethod(operationName="body-mass-index") 
  @WebResult(name = "your-bmi") 
  public double bmi( @WebParam(name="height") double height, 
                     @WebParam(name="weight") double weight ) 
  { 
    return weight / ((height * height) / 10000); 
  } 
}

Galileo Computing - Zum Seitenanfang

19.7.6 Web-Services veröffentlichen Zur nächsten ÜberschriftZur vorigen Überschrift

Ein SOAP-Server muss die Anfragen entgegennehmen und an eine Java-Methode weiterleiten. In der Java-Welt realisieren üblicherweise Servlets eines Web-Containers die Annahme; sie nehmen die XML-Pakete entgegen, nehmen die Anfrage auseinander und leiten sie zur jeweiligen Implementierung weiter.

Die Veröffentlichung eines Web-Services ist sehr stark von der verwendeten Umgebung – sprich: dem Container und der Implementierung – abhängig. In Java 6 ist das Anmelden ein Einzeiler, denn ein kleiner eingebetteter Webserver veröffentlicht einen Web-Service unkompliziert. Im Mittelpunkt stehen die Klasse Endpoint und die statische Funktion publish(), die unter einer gegebenen URL eine Endpunkt-Implementierung anmeldet.

Listing 19.6 com/tutego/insel/ws/PublishWsOnServer.java

package com.tutego.insel.ws; 
 
import javax.swing.JOptionPane; 
import javax.xml.ws.Endpoint; 
public class PublishWsOnServer 
{ 
  public static void main( String[] args ) 
  { 
    Endpoint endpoint = Endpoint.publish( "http://localhost:8080/services", 
                                          new MyWebServices() ); 
    JOptionPane.showMessageDialog( null, "Server beenden" ); 
    endpoint.stop(); 
  } 
}

Der Server veröffentlicht unseren Web-Service und bietet die WSDL-Beschreibungsdatei unter der URL http://localhost:8080/services?wsdl an.


Galileo Computing - Zum Seitenanfang

19.7.7 Einen JAX-WS-Client implementieren topZur vorigen Überschrift

Da entfernte Web-Service-Aufrufe am besten wie lokale Aufrufe über eine Java-Schnittstelle statisch gebunden sind, soll ein Dienstprogramm aus einer gegebenen WSDL-Datei Hilfsklassen für den komfortablen Zugriff generieren. Je nach Implementierung gibt es diverse Generatoren, von Apache zum Beispiel Wsdl2Java und von Sun wsimport.

wsimport

Da bei jeder JDK-6-Installation das Hilfsprogramm wsimport sowie der Java-Compiler javac beiliegen, wenden wir es auf unsere eigene Implementierung sowie beim »Java Italian Portal« an, einem Web-Service, der zur Webseite http://www.javaportal.it/ mit Java-News eine Suche anbietet.

Listing 19.7 useWsimport.bat

$ wsimport -d src -keep -p com.tutego.insel.ws.gen.jipnews Zeilen-Umbruch 
http://services.javaportal.it/kservices/JIPNews.jws?wsdl 
$ wsimport -d src -keep -p com.tutego.insel.ws.gen.chrisws Zeilen-Umbruch 
http://localhost:8080/services?wsdl

Der Schalter -d bestimmt den Pfad für die Quellen. Die Option -keep legt fest, dass die Quellen überhaupt generiert werden, und -p bezeichnet das Paket.

Am Ende hat wsimport die gewünschten Pakete mit unterschiedlichen Typen generiert:

  • com.tutego.insel.ws.gen.chrisws.ChrisWebServices.java
  • com.tutego.insel.ws.gen.chrisws.MyWebServicesService.java
  • com.tutego.insel.ws.gen.jipnews.GiveMe*.java
  • com.tutego.insel.ws.gen.jipnews.JIPNews.java
  • com.tutego.insel.ws.gen.jipnews.JIPNewsService
  • com.tutego.insel.ws.gen.jipnews.JIPNewsTO
  • com.tutego.insel.ws.gen.jipnews.ObjectFactory.java

Hinweis Leider ist es blauäugig anzunehmen, dass für jede WSDL-Datei das Tool wsimport die Zugriffsklassen baut. Das Dienstprogramm ist sehr wählerisch, und vieles funktioniert nicht. Eine häufige Fehlermeldung – etwa auf Googles WSDL-Datei – wird sein:

error: rpc/encoded wsdls are not supported in JAXWS 2.0.

Client mit Service-Klassen

Wichtig sind jeweils die Klassen, die auf -Service enden, denn sie ermöglichen den Zugriff auf die entfernten Methoden.

Listing 19.8 com/tutego/insel/ws/ClientForGeneratedStubs.java

package com.tutego.insel.ws; 
 
import com.tutego.insel.ws.gen.chrisws.ChrisWebServices; 
import com.tutego.insel.ws.gen.chrisws.MyWebServicesService; 
import com.tutego.insel.ws.gen.jipnews.JIPNews; 
import com.tutego.insel.ws.gen.jipnews.JIPNewsService; 
 
public class ClientForGeneratedStubs 
{ 
  public static void main( String[] args ) 
  { 
    JIPNews news = new JIPNewsService().getJIPNews(); 
    System.out.println( news.giveMeEN( 100 ) ); 
 
    ChrisWebServices port = new MyWebServicesService().getChrisWebServicesPort(); 
    System.out.printf( "%s Dein BMI ist %.1f%n", 
                       port.hello( "Chris" ), 
                       port.bodyMassIndex( 183, 84 ) ); 
  } 
}

Mit gestartetem Server gibt der Client zum Beispiel die folgenden Ausgaben:

Brevetti, la battaglia di Bruxelles 
... 
17 February will be one manifestation to Brussels against the patent law of the  
software. 
... 
Hello Chris! Your BMI is 25,1


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück
  Zum Katalog
Zum Katalog: Java ist auch eine Insel





Java ist auch eine Insel
Jetzt bestellen


 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Tipp
Zum Katalog: Coding for Fun





 Coding for Fun


 Buchempfehlungen
Zum Katalog: Objektorientierte Programmierung





 Objektorientierte
 Programmierung


Zum Katalog: Einstieg in Eclipse 3.4






 Einstieg in
 Eclipse 3.4


Zum Katalog: Java 6 lernen mit Eclipse






 Java 6 lernen
 mit Eclipse


Zum Katalog: NetBeans Platform 6






 NetBeans
 Platform 6


Zum Katalog: Java und XML






 Java und XML


Zum Katalog: Visual C# 2008






 Visual C# 2008


Zum Katalog: IT-Handbuch für Fachinformatiker






 IT-Handbuch für
 Fachinformatiker


Zum Katalog: C++ von A bis Z






 C++ von A bis Z


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo




Copyright © Galileo Press 2009
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de