Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Java EE 7: Web Services

Komplexe Objekte austauschen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Per WebSockets können komplexe Inhalte ausgetauscht werden. Wie dies geht und welche Rolle dabei Encoder- und Decoder-Klassen auf Java-Seite spielen, verdeutlicht dieses Video.

Transkript

WebSockets eignen sich nicht nur dafür, einfache Textobjekte auszutauschen sondern wir können auch komplexere Daten von A nach B schicken. In diesem Video werden wir uns damit auseinandersetzen, wie wir eine JSON-Nachricht vom Server an die Clients per WebSocket schicken können und wie die Clients sowohl auf Java-Ebene wie auch auf Javascript-Ebene diese Nachricht dann verarbeiten könnten. Und auf der anderen Seite werden wir ebenfalls klären, wie Clients JSON-Nachrichten an den Server so senden können, dass der Server in der Lage ist, diese Nachrichten zu verarbeiten und als Java-Objekte zu interpretieren. Wenn wir komplexere Objekte verarbeiten wollen, dann ist es so, dass wir grundsätzlich sowohl auf Client als auch auf Serverseite beliebige textuelle Informationen austauschen können. Das heißt, wir sind in der Wahl eines Formats eigentlich frei. Das einzige Problem ist, dass diese Nachrichten gegebenenfalls konvertiert werden müssen, beispielsweise nach und von JSON. Diese Konvertierung dieser eingehenden Nachrichten kann beispielsweise in der onMessage- Funktion eines Serverhandlers geschehen. Aber es gibt einen wesentlich effizienteren Ansatz, nämlich die Verwendung von Encodern beziehungsweise Decodern. Encoder und Decoder sind Komponenten, die in der Lage sind, textuelle oder binäre Nachrichten in Java-Objekte zu konvertieren und auch wieder zurück. Der Gedanke beim Einsatz von Encodern und Decodern ist der Gedanke, The separation of concerns, also der Trennung der Zuständigkeiten. Die eigentlich Applikation kann sich nämlich auf ihre Kernaufgaben konzentrieren und im Endpoint, beispielsweise mit einer Java-Klasse arbeiten. Sie muss sich nicht darum kümmern, wie diese Java-Klasse dann beispielsweise nach JSON konvertiert wird oder aus JSON erzeugt wird und die mit Hilfe von Encodern und Decodern definierte Funktionalität ist wieder verwendbar, das heißt sie kann sowohl auf der Client-Ebene als auch auf der Server-Ebene eingesetzt werden und das an mehren und verschiedenen Stellen. Encoder und Decoder sind immer Implementierungen der Interfaces Encoder.Text beziehungsweise Decoder.Text oder Encoder.Binary oder Decoder.Binary . Und der Einsatz dieser Encoder wird auf der Ebene der Endpoints des WebSocket-Servers wie auch von eventuellen Java-Clients notiert. Sehen wir uns nun an, wie wir Encoder und Decoder implementieren können und diese auf Ebene von Java-Endpoints beziehungsweise Java-Clients verwenden können auf der einen Seite und auf der anderen Seite, wie wir die so erzeugten JSON-Daten dann auf Ebene einer Javascript- Applikation verarbeiten können, sodass eine nahtlose Zusammenarbeit zwischen den Welten gewährleistet bleibt. Wir sehen hier die Klasse ChatMessage. Diese Klasse ChatMessage soll eine Nachricht repräsentieren, die von einem WebSocket-Client an den Server gesandt wird und die dann vom Server weiter verteilt wird. Zu diesen Zweck verfügt sie über drei Felder: message, Sender und color samt den entsprechenden Gettern und hat einen überladenen Constructor, der die Verwendung etwas erleichtern soll. Als Besonderheit verfügt sie über zwei Methoden, einmal die Methode toJSON, die mithilfe einer JSON-Objektinstanz die Klasse als JSON repräsentiert und es gibt die statische Methode fromJSON, die es erlaubt, aus einer Zeichenkette eine Instanz dieser Klasse zu erzeugen. Diese Klasse soll nun mithilfe der Client-Endpoints beziehungsweise des Server-Endpoints genutzt werden können. Statt dass wir also textuelle Nachrichten übertragen, wollen wir nun ChatMessage-Instanzen entgegennehmen und auch wieder an die Clients versenden. Dies können wir erreichen, indem wir sowohl Decoder als auch Encoder definieren. Um einen Decoder anzulegen, definieren wir zunächst eine neue Klasse. Die befindet sich im Package de.video2brain.websockets.decoders und heißt ChatMessageDecoder. Ihre Aufgabe besteht darin, eine eingehende Nachricht in eine ChatMessage umzuwandeln. Zu diesem Zweck implementiert sie die Schnittstelle Decoder.Text vom Typ ChatMessage. Dabei müssen vier Methoden bereitgestellt werden, wobei für uns von diesen vier Methoden eigentlich nur eine wirklich interessiert. Die Methode destroy und die Methode init können wir leer lassen, die Methode willDecode ändern wir so ab, dass sie den Wert true zurückgibt und uns interessiert die Methode decode als solches, indem wir eine Zeichenkette übergeben und die dann ihrerseits eine ChatMessage-Instanz aus dieser Zeichenkette erzeugen lässt und zurückgibt. Damit ist die Implementierung dieses Decoders bereits abgeschlossen und wir können uns nun der Implementierung des Encoders widmen, dessen Aufgabe darin besteht, eine ChatMessage-Instanz in eine json-Repräsentation umzuwandeln. Zu diesem Zweck legen wir eine weitere Java-Klasse an im Package de.video2brain.websockets.encoders und sie heißt ChatMessageEncoder. Auch das ist eine ganz normale Java-Klasse. Sie implementiert die Schnittstelle Encoder.Text für die ChatMessage-Klasse. Wir müssen hier ebenfalls einige Methoden hinzufügen. Die Methode destroy interessiert uns nicht, die Methode init interessiert uns auch nicht. Uns interessiert lediglich die Methode Encode, in der wir die textuelle Repräsentation der ChatMessage, die uns übergeben worden ist, abrufen und zwar mit Hilfe von deren Methode toJSON. Damit ist der Encoder auch fertig implementiert und nun können wir diesen Encoder auf Ebene der Endpoints bekanntgeben. Wir machen diese Bekanntgabe auf Ebene der @Server-Endpoint-Annotation, indem wir das Attribut encoders nehmen und dort ChatMessageEncoder bekanntgeben und dem Attribut decoders geben wir bekannt, das als decoder eine Instanz der ChatMessageDecoder-Klasse genutzt werden soll. Damit ist der Server-Endpoint fertig implementiert und wir können uns nun dem Client-Endpoint widmen, bei dem wir dieselben Informationen setzen. Wir geben an, welche encoder zu benutzen sind, eine Instanz der ChatMessageEncoder-Klasse und wir geben an, welcher decoder zu benutzen ist, eine Instanz der ChatMessageDecoder-Klasse. Damit ist auch dieser Client-Endpoint fertig konfiguriert und wir können nun Nachrichten versenden, die zusätzliche Informationen beinhalten, nämlich eine Farben und einen Namen. Bevor wir dies allerdings machen, sollten auch noch einen kleinen Blick auf die Javascript-Implementierung werfen. Auf Ebene des Javascripts können wir nun ebenfalls mit JSON-Nachrichten arbeiten. Zum einen beim Versenden einer Nachricht hier erzeugen wir ein JSON-Objekt und konvertieren das in seine Zeichenkettenrepräsentation und versenden die dann über den WebSocket. Und wenn wir eine Nachricht erhalten, dann wandeln wir die eingehende Nachricht, die eine Zeichenkette ist, auch auf Javascript-Seite in ein Objekt wieder um und können dann auf die Felder dieser Nachricht zugreifen und diese entsprechend ausgeben. Das passt also alles problemlos zueinander. Lassen Sie uns nun zunächst die serverseitige Applikation starten. Zu diesem Zweck mache ich einen Rechtsklick darauf und lass sie auf dem Server ausführen. Dies wird nun einige Zeit in Anspruch nehmen. bis der Server gestartet und die Applikation deployed ist. Nun kann ich den Chat auf der Webseite bereits einmal ausprobieren. Gebe hier einen Namen an und eine Farbe, zum Beispiel rot und eine Nachricht. Wenn ich das absende, sehe ich, dass sowohl Name als auch Farbe zusammen mit der Nachricht übermittelt worden sind. Dasselbe gilt für den Client, den wir vorhin definiert haben. Wenn ich den starte, dann kann ich auch über diesen einen Namen angeben und eine Nachricht. Und auch hier werden die komplexeren Informationen übertragen und das kann ich nun so lange hin- und hermachen bis ich die Lust verliere. In diesem Video haben wir uns angeschaut, wie wir komplexere Nachrichten austauschen können. Diese komplexeren Nachrichten sind JSON-Nachrichten. Diese werden mit Hilfe von Encodern und Decodern so aufbereitet, dass wir auf Java-Ebene mit Klassen arbeiten können und die Nachrichten dennoch als textuelle Nachrichten von A nach B übertragen werden können. Wir haben uns ebenfalls angeschaut, wie wir auf der Javascript-Ebene mit solch komplexen Nachrichten umgehen können und wie wir sie auch generieren können.

Java EE 7: Web Services

Steigen Sie ein in die Java-Enterprise-Welt und lernen Sie, wie Nachrichten ausgetauscht und Dienste definiert werden.

5 Std. 13 min (30 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!