Sie sind hier
E-Book

GWT im Einsatz

AutorAdam Tacy, Robert Hanson
VerlagCarl Hanser Fachbuchverlag
Erscheinungsjahr2007
Seitenanzahl567 Seiten
ISBN9783446414068
FormatPDF
KopierschutzWasserzeichen/DRM
GerätePC/MAC/eReader/Tablet
Preis39,99 EUR
Das Google Web Toolkit (GWT) ist eine neue Technologie von Google, die Java automatisch in JavaScript übersetzt.

Damit wird das Erstellen und Deployen von Ajax-Anwendungen noch leichter. Mit dieser Entwicklung hat Google Ajax dahin gebracht, bestehende Tools zu nutzen - anstatt neue Tools für Ajax zu schaffen. Dieses Buch ist ein umfassendes Tutorial für Java-Entwickler, die die neue Generation von großen, webbasierten Applikationen bauen wollen. Die Autoren dieses Buches sind Robert Hanson, der Erfinder der beliebten GWT Widget Library, und Adam Tacy, der wichtige Beiträge zur GWT Widget Library geleistet hat. Sie zeigen anhand vieler Beispiele, wie man dieses begeisternde Tool vorteilhaft einsetzen kann. Der Leser steigt in das Thema ein, indem er mit Hilfe der Autoren eine funktionierende GWT-Anwendung erstellt. Das Buch deckt den ganzen Entwicklungszyklus vom Aufsetzen der Entwicklungsumgebung über das Erstellen der Applikation und das Deployment auf dem Web-Server ab. Der Kern der GWT Library wird ausführlich vorgestellt, Möglichkeiten der Erweiterung werden gezeigt. Im Internet: Der Sourcecode der Beispiele aus dem Buch.

Ein Buch für alle Java- und AJAX-Programmierer.

Kaufen Sie hier:

Horizontale Tabs

Leseprobe
9 Eine Anwendung modularisieren (S. 295-296)

Dieses Kapitel
behandelt die Konfiguration von GWT-Modulen,
erklärt das Einbinden externer Module,
beschreibt das Injizieren von CSS und JavaScript,
stellt das Packen von Modulen zu JAR-Dateien dar.


Nachdem Sie alle Komponenten für die Benutzeroberfläche erstellt haben, wollen wir nun damit beginnen, die Anwendung zu modularisieren. Ein Grundprinzip der Softwareentwicklung, das seit den 1960er-Jahren Gültigkeit hat, ist die Möglichkeit, Code in modularer Form zu entwickeln, um die Sicherheit und Wiederverwendbarkeit zu steigern. GWT unterstützt die modulare Entwicklung auf zweierlei Weise: Da Sie eine Java-Anwendung erstellen, haben Sie Zugriff auf alle Wohltaten der Java-eigenen Package-Struktur. Zweitens – das ist in GWT neu – gibt es das Konzept der XML-Module. Zwischen GWTModulen und Java-Packages besteht bis zu einem gewissen Grad ein synergistisches Zusammenwirken, aber trotzdem sind sie nicht dasselbe. Das Vorhandensein eines Java- Packages in Ihrem Klassenpfad bedeutet nicht automatisch, dass Ersteres für den GWTCompiler auch sichtbar ist. Keine Sorge: Weil dieses Thema eine Quelle der Verwirrung ist, behandeln wir den Sachverhalt im vorliegenden Kapitel.

Definition

Ein Modul ist eine logische Sammlung von Klassen und Ressourcendefinitionen, deren Verwaltung als Einheit sinnvoll ist.

Bislang haben Sie die Anwendung Dashboard wahrscheinlich als eine umfangreiche Softwareeinheit aufgefasst – eine Annahme, die durchaus zutreffend ist, ebenso gilt aber, dass sich eine Anwendung aus einer Anzahl von Modulen zusammensetzen kann und jedes dieser Module in einer Modul-XML-Datei definiert ist, die zudem eine Reihe ressourcenspezifischer Elemente definiert. Das Dashboard bietet sich naturgemäß zur Modularisierung an, da es eine Hauptanwendung und eine ganze Reihe von Komponentenanwendungen umfasst.

9.1 Modularisierungsstruktur erstellen

Wir erwähnten bereits, dass zwischen den GWT-Modulen und der Package-Struktur von Java eine Art Synergie besteht: Sie sind einander ähnlich, aber doch unterschiedlich. Ein Java-Package besteht aus einer Anzahl von Klassen, die – benutzerfreundlich – im selben Verzeichnis abgelegt sind. Ein GWT-Modul besteht aus einem Satz von Konfigurationsdaten, die sich auf ein bestimmtes GWT-Projekt beziehen. Es enthält Eintrittspunkte (sofern vorhanden), Verweise auf Stylesheets, andere Module, auf die dieses Modul angewiesen ist usw. All dies behandeln wir in Abschnitt 9.3, wo wir die Modularisierung des Dashboards beschreiben.

Ein warnendes Wort: Es ist nicht ungewöhnlich, dass sich ein Satz von Java-Packages auf ein bestimmtes Projekt bezieht – und damit auch auf ein GWT-Modul. So könnte man fälschlicherweise durchaus annehmen, dass ein GWT-Modul das Gleiche wie ein Satz Java-Packages darstellt, weil dies nicht immer der Fall sein muss. Außerdem sollten Sie sich der Tatsache bewusst sein, dass, nur weil Sie ein Modul referenzieren, die lose mit ihm verknüpften Java-Packages noch lange nicht für Ihren Code verfügbar sein müssen, Sie müssen sie nach wie vor zu Ihren Klassenpfaden hinzufügen – und zwar sowohl zum Klassenpfad der Hostmodus- als auch der Webmodustools (sowie – bei Verwendung von Eclipse – zur .launch-Konfiguration). Versäumen Sie dies, dann wird Ihr Java-Compiler (oder Ihre IDE) Ihnen mitteilen, dass der erforderliche Code nicht zu eruieren ist – was ein frustrierender Fehler sein kann, wenn Ihnen gerade entfallen ist, dass GWT-Module und Java-Packages nicht dasselbe sind!

9.1.1 Modularisierung in GWT

Wird die Modularisierung in der Praxis eingesetzt? Schon. Die GWT-Distribution selbst besteht aus einer Anzahl von Modulen: DOM, TextBox, History, JUnit, i18n, JSON usw. Abbildung 9.1 zeigt diese Module hierarchisch angeordnet.

Wenn Sie sich beispielsweise die Modul-XML-Datei für die Internationalisierung ansehen, werden Sie feststellen, dass diese die Standardeigenschaft locale definiert, den Java- Script-Code zur Bestimmung des verwendeten Webbrowsers angibt und zudem eine spezielle Java-Klasse namens Generator benennt, die für alle Internationalisierungsschnittstellen in Ihrer Anwendung ausgeführt werden sollte, um Java-Klassen zu generieren, die die Schnittstelle an die verschiedenen Eigenschaftsdateien binden. Module können durchaus leistungsfähig sein.

In diesem Abschnitt widmen wir uns zwei Dingen: Zunächst untersuchen wir alle Elemente, die im XML-Modul eines Moduls enthalten sein können, dieses XML-Modul sieht möglicherweise aus wie die in Listing 9.1 gezeigte, sehr umfassende Version. Dieses „erschöpfende" Listing enthält alle Aspekte. Im Laufe des Abschnitts werden wir Ersteres ebenso erschöpfend behandeln.
Inhaltsverzeichnis
Inhalt7
Vorwort15
Danksagung17
Zu diesem Buch19
Teil 1 Erste Schritte25
2 Die Standardanwendung erstellen59
2.1 Der Entwicklungslebenszyklus der GWTStandardanwendung60
2.2 Phase 1: Eine GWT- Anwendung erstellen64
2.2.1 Das Projekt erstellen68
2.2.2 Eine Anwendung erstellen70
2.2.3 Internationalisierung einrichten74
2.2.4 Internationalisierung implementieren76
2.2.5 Unit-Testfälle erstellen77
2.2.6 Import in ein IDE79
2.3 Zusammenfassung82
3 Zur eigenen Anwendung fortschreiten83
3.1 Beschreibung des Anwendungsbeispiels83
3.2 Phase 2: Die Anwendung entwickeln85
3.2.1 Internationalisierung implementieren87
3.2.2 Anwendung erstellen90
3.2.3 Formate anwenden100
3.3 Phase 3: Testen und Debuggen im Hostmodus103
3.3.1 Auf den Hostmodus vorbereiten104
3.3.2 Dashboard im Hostmodus ausführen107
3.3.3 Dashboard im Hostmodus mit Eclipse debuggen109
3.4 Phase 4: Code kompilieren111
3.4.1 Code kompilieren und für den Webmodus vorbereiten111
3.4.2 Kompilierungsergebnisse anzeigen113
3.5 Phase 5: Code bereitstellen115
3.5.1 Bereitstellung auf einem Webserver115
3.5.2 Bereitstellung auf einem Dateisystem115
3.6 Phase 6: Ausführung im Webmodus116
3.7 Anwendungsprotokollierung implementieren117
3.7.1 Informationen auf der Clientseite protokollieren117
3.7.2 Informationen auf der Serverseite protokollieren120
3.8 Zusammenfassung120
Teil 2 Benutzeroberflächen erstellen123
4 Mit Widgets arbeiten125
4.1 Was ist ein Widget?127
4.2 Die Standard-Widgets in GWT130
4.3 Neue Widgets erstellen155
4.4 Das Dashboard-Widget entwickeln164
4.5 Zusammenfassung169
5 Mit Panels arbeiten171
5.1 Was ist ein Panel?172
5.1.1 Panels als Java-Objekte verwenden172
5.1.2 Panels als DOM-Elemente betrachten173
5.2 Die Standard-Panels in GWT175
5.2.1 Mit einfachen Panels interagieren177
5.2.2 Komplexere Panels183
5.2.3 Auf HTML-Tabellen basierende Panels190
5.2.4 Zusammengesetzte Panels194
5.3 Neue Panels erstellen195
5.3.1 Panels von Grund auf neu erstellen195
5.3.2 Panels durch Erweiterung eines vorhandenen Panels erstellen198
5.4 Das Panel erstellen200
5.5 Zusammenfassung203
6 Ereignisbehandlung205
6.1 Ereignisse untersuchen206
6.1.1 Unterschiede bei browserspezifischen Ereignismodellen207
6.1.2 Das GWT-Ereignisbehandlungsmodell209
6.2 Auf Ereignisse horchen213
6.2.1 Ereignisse versenken213
6.2.2 Versenkte Ereignisse mit der Methode verwalten215
6.2.3 Versenkte Ereignisse mit der Methode verknüpfen218
6.2.4 Ereignisvorschau219
6.2.5 Ereignisse durch Erweiterung von Listener-Klassen behandeln221
6.2.6 Ereignisse in Ihren GWT-Code verschieben222
6.2.7 Ereignisbehandlung durch den Browser verhindern226
6.3 Browser-Standardereignisse behandeln226
6.3.1 Auf Änderungen reagieren228
6.3.2 Klick, klick231
6.3.3 Fokus erhalten und verlieren231
6.3.4 Tastatureingaben erfassen232
6.3.5 Bilder laden232
6.3.6 Mauseingaben verwalten233
6.3.7 Bildlauf234
6.3.8 Fenstergrößenänderung235
6.3.9 Schließ-Ereignisse236
6.4 Andere Ereignistypen behandeln240
6.4.1 Formulare behandeln240
6.4.2 Auf schließende Popup-Fenster reagieren240
6.4.3 Registerkarten-Ereignisse241
6.4.4 Tabellenereignisse242
6.4.5 Baumstruktur-Ereignisse243
6.5 Drag & Drop implementieren244
6.5.1 Ziehen implementieren244
6.5.2 Ablegen implementieren248
6.6 Zusammenfassung251
7 Zusammengesetzte Widgets erstellen253
7.1 Was ist ein zusammengesetztes Widget?254
7.2 Die Entwicklung zusammengesetzter Widgets255
7.3 Editierbare Beschriftungen erstellen256
7.3.1 Schritt 1: Komponenten ermitteln258
7.3.2 Schritt 2: Panel-Layout und Struktur auswählen260
7.3.3 Schritt 3: Die passenden GWT-Java-Schnittstellen implementieren262
7.3.4 Schritt 4: Das zusammengesetzte Widget erstellen265
7.3.5 Schritt 5: Das zusammengesetzte Widget formatieren273
7.4 Ein zusammengesetztes Widget aus anderen zusammengesetzten Widgets erstellen275
7.4.1 Schieberegler erstellen276
7.4.2 Das Composite278
erstellen278
7.5 Das Dashboard-Composite erstellen279
7.6 Zusammenfassung281
8 JSNI-Komponenten erstellen283
8.1 Einführung in JSNI285
8.1.1 JSNI im Überblick286
8.2 Kommunikation via JSNI295
8.2.1 Mit dem Browser via GWT-Java kommunizieren295
8.2.2 Mit dem Browser via JavaScript kommunizieren296
8.2.3 Über eine JavaScript- API mit einer GWT- Anwendung kommunizieren298
8.2.4 Kommunikation zwischen GWT- Anwendungen300
8.3 Eine JavaScript-Bibliothek laden302
8.3.1 Mit HTML eine JavaScript-Bibliothek laden303
8.3.2 Mit der Modul-XML-Datei eine JavaScript-Bibliothek laden303
8.4 Eine einfache JavaScript-Bibliothek kapseln304
8.4.1 Auf eine geladene JavaScript-Bibliothek zugreifen305
8.4.2 Das Widget in einer Anwendung einsetzen310
8.5 Eine komplexe JavaScript-Bibliothek kapseln311
8.5.1 Klassen erstellen312
8.5.2 JavaScript-Objekte als Java-Objekte belassen313
8.5.3 Benutzerdefinierten Code aus einer Bibliothek aufrufen314
8.5.4 Komplexes, gekapseltes Widget in einer Anwendung einsetzen316
8.6 Zusammenfassung317
9 Eine Anwendung modularisieren319
9.1 Modularisierungsstruktur erstellen320
9.1.1 Modularisierung in GWT320
9.1.2 Andere Module in eine Anwendung einbinden322
9.1.3 Quell- und andere Ressourcenpfade festlegen326
9.1.4 Serverressourcen einer Anwendung definieren327
9.1.5 Die GWT-Eigenschaften einer Anwendung verwalten328
9.1.6 Klassen basierend auf Eigenschaftswerten ersetzen332
9.1.7 Generatoren in der Modul-XML-Datei registrieren333
9.1.8 Ressourcen zur Laufzeit in eine Anwendung injizieren334
9.1.9 Den Eintrittspunkt einer Anwendung festlegen337
9.1.10 Die Modul-XML-Datei der Anwendung337
9.2 Drittanbietermodule einbinden339
9.3 Eigene Module packen341
9.4 Java-Package-Struktur erstellen343
9.5 Zusammenfassung344
Teil 3 Fortgeschrittene Techniken345
10 Kommunikation mit GWT-RPC347
10.1 Grundlegende RPC-Konzepte348
10.1.1 Überblick zur asynchronen Kommunikation349
10.1.2 Beschränkungen bei der Kommunikation mit Remoteservern350
10.1.3 Das Projekt352
10.2 GWT-RPC implementieren354
10.2.1 Überblick zu den serialisierbaren Datenobjekten355
10.2.2 Den GWT-RPC-Dienst definieren359
10.2.3 Vorbereitung der Clientseite eines GWT-RPC-Aufrufs363
10.2.4 Aufruf des entfernten Serverdienstes365
10.3 Zusammenfassung des Projekts367
10.3.1 Projektübersicht368
10.3.2 Serverseitige Dienstimplementierung369
10.3.3 Aufruf des Dienstes auf dem Client370
10.4 Zusammenfassung370
11 Die clientseitige RPC-Architektur371
11.1 Clientcode strukturieren371
11.1.1 Die Komponente kapseln372
11.1.2 Remoteaufrufe in einer Fassade kapseln376
11.1.3 Rückrufroutine mit dem Kommandomuster378
11.2 Verschiedene Abfragetechniken untersuchen385
11.2.1 Aspekte der Abfragetechnik386
11.2.2 Implementierung einer sich fortlaufend aktualisierenden Komponente387
11.2.3 Server-Pushs durch Blockieren von Server-Threads emulieren391
11.3 Benutzerdefinierte Feldserialisierer schreiben394
11.3.1 Klasse für einen benutzerdefinierten Feldserialisierer erstellen395
11.3.2 Benutzerdefinierte Feldserialisierung implementieren397
11.4 Zusammenfassung399
12 Klassisches Ajax und HTMLFormulare401
12.1 Klassisches Ajax mit402
12.1.1 HTTP-Methoden402
12.1.2 Einfaches RPC mit405
12.1.3 Mit XML-Daten laden408
12.2 Grundlagen zu415
12.2.1 Grundlagen zu415
12.2.2 Auf Ereignisse hören418
12.2.3 Ziel ändern419
12.2.4 Verschiedene Formularelemente verwenden422
12.3 Zusammenfassung429
13 Interoperabilität mit JSON erzielen431
13.1 Einführung in JSON432
13.1.1 Das JSON-Datenformat432
13.1.2 Mit JSONParser JSON-Nachrichten analysieren433
13.2 Die JSON-Datenobjekte in GWT434
13.2.1 Das Objekt434
13.2.2 Grundlegende JSON-Typen435
13.2.3 JSONValue-Objekte in einem JSONArray speichern436
13.2.4 JSONValue-Objekte in einem JSONObject sammeln438
13.3 Suchkomponente mit JSON erstellen439
13.3.1 Die Yahoo Search- API440
13.3.2 Suchkomponente implementieren441
13.3.3 JSON-Daten an den Server senden443
13.3.4 JSON-Serverantwort analysieren und validieren445
13.4 Proxy-Dienst für Yahoo Search implementieren448
13.4.1 JSON mit Java auf dem Server verwenden449
13.4.2 JSON mit Perl auf dem Server verwenden452
13.4.3 JSON mit Ruby auf dem Server verwenden454
13.5 Zusammenfassung456
14 Automatische Codegenerierung457
14.1 Neue Typen generieren458
14.2 GWT-Generatoren459
14.2.1 Grundlegender Generatorcode461
14.3 Generator für das Dashboard erstellen462
14.3.1 Auf die Eingabeklasse zugreifen463
14.3.2 Auf Kontexteigenschaften zugreifen464
14.3.3 Protokollierung für Generatoren465
14.3.4 Generieren der neuen Typenstruktur466
14.3.5 Die neue Klasse erstellen467
14.3.6 Generierte Klassen verwenden473
14.4 Zusammenfassung475
15 Anwendungen basierend auf GWTEigenschaften modifizieren477
15.1 Kurze Zusammenfassung zu den Eigenschaften478
15.2 Browserunterschiede verwalten479
15.2.1 Wie GWT Browserunterschiede verwaltet479
15.2.2 Das Flash-Widget erstellen480
15.2.3 Eigenschaftsersetzung einrichten483
15.3 Vollständige Unterstützung der Internationalisierung484
15.3.1 Die statische Internationalisierung485
15.3.2 Die dynamische Internationalisierung498
15.4 Anwendung gebietsschemaspezifisch ändern499
15.4.1 Standardkomponente implementieren500
15.4.2 Gebietsschemaspezifische Klassen500
15.5 Benutzerdefinierte Eigenschaften implementieren502
15.5.1 Benutzerdefinierte Eigenschaften definieren502
15.5.2 Benutzerdefinierten Eigenschaftsanbieter definieren502
15.5.3 Ermittelten Eigenschaftswert überprüfen503
15.5.4 Code erstellen504
15.6 Zusammenfassung504
Teil 4 Abschließende Ergänzungen505
16 GWT-Anwendungen testen und bereitstellen507
16.1 GWT-Code mit JUnit testen507
16.1.1 JUnit für GWT-Entwickler508
16.1.2 Testfall erstellen513
16.1.3 Asynchronen Code testen516
16.2 GWT- Anwendungen bereitstellen518
16.2.1 Projekt organisieren519
16.2.2 RPC-Servlets installieren526
16.3 Zusammenfassung532
17 Wie GWT funktioniert533
17.1 Der Kompilierungsprozess und die Ausgabe533
17.1.1 Der Kompilierungsvorgang534
17.1.2 Was der Compiler ausgibt536
17.2 Der Lademechanismus von GWT541
17.2.1 Altanwendungen541
17.2.2 Standardanwendungen542
17.2.3 Bootstrapping für die Standardanwendung543
17.2.4 Website-übergreifende Anwendungen548
17.3 Java in JavaScript kompilieren548
17.3.1 Das generierte JavaScript untersuchen548
17.3.2 Java-Standardobjekte: Das549
Objekt549
17.3.3 Programmcode als JavaScript untersuchen551
17.3.4 Überblick über das Initialisierungscodesegment552
17.4 Zusammenfassung554
Register555

Weitere E-Books zum Thema: Programmiersprachen - Softwareentwicklung

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

ASP.NET Shortcut

E-Book ASP.NET Shortcut
Format: PDF

Shortcut-Tipps für ASP.NET-Profis Die neue .NET-Version der Active Server Pages stellt eine Umgebung zur Entwicklung von Web-Applikationen im .NET-Framework bereit. Viele aus der Desktop-…

Programmieren lernen in PHP 5

E-Book Programmieren lernen in PHP 5
Format: PDF

Mit der Version 5 erreicht PHP einen bemerkenswerten Reifegrad, der PHP zu einer festen Größe in der Welt der Webprogrammierung macht. Gerade die leichte Erlernbarkeit macht PHP zur idealen…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Mathematik für Informatiker

E-Book Mathematik für Informatiker
Format: PDF

Die Informatik entwickelt sich in einer unglaublichen Geschwindigkeit. Häufig ist die Mathematik Grundlage von Neuerungen. Deshalb ist sie unverzichtbares Werkzeug jedes Informatikers und Pflichtfach…

Weitere Zeitschriften

FREIE WERKSTATT

FREIE WERKSTATT

Die Fachzeitschrift FREIE WERKSTATT berichtet seit der ersten Ausgaben 1994 über die Entwicklungen des Independent Aftermarkets (IAM). Hauptzielgruppe sind Inhaberinnen und Inhaber, Kfz-Meisterinnen ...

BEHINDERTEPÄDAGOGIK

BEHINDERTEPÄDAGOGIK

Für diese Fachzeitschrift arbeiten namhafte Persönlichkeiten aus den verschiedenen Fotschungs-, Lehr- und Praxisbereichen zusammen. Zu ihren Aufgaben gehören Prävention, Früherkennung, ...

Correo

Correo

 La Revista de Bayer CropScience para la Agricultura ModernaPflanzenschutzmagazin für den Landwirt, landwirtschaftlichen Berater, Händler und am Thema Interessierten mit umfassender ...

küche + raum

küche + raum

Internationale Fachzeitschrift für Küchenforschung und Küchenplanung. Mit Fachinformationen für Küchenfachhändler, -spezialisten und -planer in Küchenstudios, Möbelfachgeschäften und den ...

dental:spiegel

dental:spiegel

dental:spiegel - Das Magazin für das erfolgreiche Praxisteam. Der dental:spiegel gehört zu den Top 5 der reichweitenstärksten Fachzeitschriften für Zahnärzte in Deutschland (laut LA-DENT 2011 ...

SPORT in BW (Württemberg)

SPORT in BW (Württemberg)

SPORT in BW (Württemberg) ist das offizielle Verbandsorgan des Württembergischen Landessportbund e.V. (WLSB) und Informationsmagazin für alle im Sport organisierten Mitglieder in Württemberg. ...

e-commerce magazin

e-commerce magazin

e-commerce magazin Die Redaktion des e-commerce magazin versteht sich als Mittler zwischen Anbietern und Markt und berichtet unabhängig, kompetent und kritisch über ...