Suchen und Finden
Inhalt
6
1 Einführung
22
1.1 Motivation
22
1.2 Grundlage von J2EE: die 4-Tier- Architektur
24
1.2.1 2-Tier-Architekturen
24
1.2.2 3-Tier-Architekturen
25
1.2.3 4-Tier-Architektur einer webbasierten Anwendung
26
1.2.4 Webbasierte Anwendungen mit J2EE
28
1.3 Vorgehensweise im Buch
29
2 JBoss, Eclipse und XDoclet
32
2.1 JBoss
32
2.1.1 Download & Installation
32
2.1.2 Start des Servers
33
2.1.3 Die JMX-Console
34
2.1.4 Anhalten des Servers
35
2.1.5 Basis-Konfigurationen
35
2.2 Eclipse, XDoclet & die JBoss-IDE
38
3 JCA
42
4 JDBC
46
4.1 Datenbanktreiber
46
4.1.1 Laden des Treibers über den ClassLoader
47
4.1.2 Festlegen des Treibers über Systemparameter
48
4.2 Aufbau einer Verbindung
48
4.3 Einen SQL-Befehl ausführen
50
4.3.1 PreparedStatement: Einen vorbereiteten SQL-Befehl ausführen
50
4.3.2 Statement: Einen unvorbereiteten SQL-Befehl ausführen
55
4.4 Transaktionen
55
4.5 BLOBs auslesen
56
4.6 Metadaten auslesen
57
4.6.1 Metadaten einer Datenbank auslesen
57
4.6.2 Metadaten einer Tabelle auslesen
57
4.7 Datenbanken innerhalb eines Containers erfragen
58
5 JMX
60
5.1 Beispiel 1: TableCopyMBean
61
5.1.1 Das Interface
61
5.1.2 Die MBean-Klasse
62
5.1.3 Der Delegat
64
5.1.4 Der Deployment-Deskriptor
65
5.2 Beispiel 2: SimpleCacheMBean
66
5.2.1 Das Interface
66
5.2.2 Die MBean-Klasse
67
5.2.3 Der Deployment-Deskriptor
68
5.2.4 Ein MBean-Connector
69
5.3 Verpacken & Deployen der MBeans
70
6 Socketprogrammierung
72
6.1 Grundlagen
73
6.1.1 Zeichensatzgebundenes Lesen und Schreiben von Daten
73
6.1.2 Socket-Verbindungen herstellen
75
6.1.3 SocketTools: Eine Ansammlung nützlicher Socket- Routinen
78
6.1.4 Eine POST-Anfrage an eine Webseite senden
79
6.2 Eine einfache Client/Server- Applikation
81
6.2.1 Vorgehensweise
81
6.2.2 Der Client
82
6.2.3 Der Server
83
6.3 Ein Framework für eine Client/Server- Applikation
85
6.3.1 Die grundlegende Architektur
85
6.3.2 MultiClientServer
86
6.3.3 MultiClientNonBlockingServer
88
6.3.4 AbstractClientHandler
89
6.4 Anwendung des Frameworks am Beispiel
90
6.4.1 KursabfrageClient
91
6.4.2 KursabfrageHandler
92
6.4.3 StartKursabfrageClient & StartKursabfrageServer
94
6.5 Der C#/.NET-Client
95
7 RMI & CORBA
98
7.1 Was ist Middleware? Was ist RMI?
98
7.2 RMI mit JRMP
101
7.2.1 Schritt 1: Interface definieren
102
7.2.2 Schritt 2: Server schreiben
103
7.2.3 Schritt 3: Server am Broker anmelden
105
7.2.4 Der Client
106
7.3 RMI mit IIOP
107
7.3.1 Schritt 1: Interface definieren
107
7.3.2 Schritt 2: Server schreiben
109
7.3.3 Schritt 3: Server am Broker anmelden
111
7.3.4 Der Client
113
7.4 Implementierung einer RMI/JRMP&IIOPApplikation
115
7.4.1 Schritt 1: Interface definieren
115
7.4.2 Schritt 2: Servermethoden implementieren
115
7.4.3 Schritt 3: Erstellen der Delegaten
116
7.5 Performance-Vergleich RMI/IIOP <> RMI/JRMP
118
7.6 CORBA
119
7.6.1 Grundlagen
119
7.6.2 CORBA-IDL: Eine Sprache zur Definition von Interfaces
120
7.7 CORBA über RMI
127
7.7.1 Schritt 1: IDL in Java übersetzen
127
7.7.2 Schritt 2: Client schreiben
128
7.8 Ein RMI/IIOP-Server & ein .NET-Client
129
7.8.1 Übersetzung der IDL-Dateien
130
7.8.2 Der .NET-Client
130
8.1 Grundlagen
132
8.1.1 Was sind EJBs?
132
8.1.2 Welche Aufgaben übernimmt der Applicationserver?
134
8.2 Die einzelnen EJB-Typen im Überblick
136
8.2.1 Session Beans
136
8.2.2 Entity Beans
136
8.2.3 Message Driven Beans
138
8.3 Timer
140
8.4 Interfaces und Klassen
140
8.5 Deployment
143
8.5.1 Deployment-Verzeichnis des JBoss
143
8.5.2 Deployment-Deskriptoren
143
8.6 Client-Zugriff auf die EJBs
147
8.7 Lebenszyklen von EJBs
148
8.7.1 Session Beans
148
8.7.2 Entity Beans
149
8.7.3 Message Driven Beans
150
8.8 Namenskonventionen
151
8.9 Verpacken und Deployen des EJB- Archivs
151
8.9.1 Generierung der Deployment-Deskriptoren und Java- Dateien
151
8.9.2 Verpacken und Deployen des Archivs
153
9 Session Beans
156
9.1 Allgemeines
156
9.2 Vorüberlegung: MasterSessionBean
157
9.2.1 Remote-Interface
157
9.2.2 Local-Interface
158
9.2.3 EJB-Klasse
158
9.3 Erstellung einer Stateless Session Bean
161
9.3.1 Home-Interface
161
9.3.2 Remote-Interface
162
9.3.3 EJB-Klasse
162
9.3.4 ejb-jar.xml
165
9.3.5 jboss.xml
165
9.3.6 Ein geeigneter Client
166
9.4 Erstellung einer Stateful Session Bean
167
9.4.1 Home-Interface
168
9.4.2 Remote-Interface
168
9.4.3 EJB-Klasse
169
9.4.4 ejb-jar.xml
171
9.4.5 jboss.xml
171
9.4.6 Ein geeigneter Client
171
9.5 Erstellung einer lokalen Session Bean
172
9.5.1 LocalHome-Interface
173
9.5.2 Local-Interface
173
9.5.3 EJB-Klasse
174
9.5.4 ejb-jar.xml
174
9.5.5 jboss.xml
175
9.5.6 Ein geeigneter Client
175
9.6 Vorüberlegung: EJBEnv
175
9.7 Nutzung einer lokalen Session Bean
178
9.7.1 Home-Interface
178
9.7.2 Remote-Interface
178
9.7.3 EJB-Klasse
179
9.7.4 ejb-jar.xml
181
9.7.5 jboss.xml
181
9.8 Verwendung des IIOP-Protokolls
182
9.8.1 Generierung von Stub- und Tie-Klassen
182
9.8.2 Abänderung des Deployment-Deskriptors
183
9.8.3 Ein IIOP-Client
184
9.9 Konfigurationen
185
9.9.1 Standard-Konfigurationen
185
9.9.2 Individuelle Session Bean-Konfigurationen
187
9.9.3 Konfiguration mittels XDoclet
189
10 CMP Entity Beans
192
10.1 Vorbereitung
194
10.1.1 Vorstellung des Datenbankschemas
194
10.1.2 Zentrale Registrierung der Datenbank in JBoss
195
10.1.3 CMPs: Lokal oder Remote?
197
10.2 Vorüberlegung: CMPMasterBean
198
10.2.1 EJB-Klasse
199
10.2.2 Local-Interface
201
10.2.3 LocalHome-Interface
201
10.3 CMP: Kunde
202
10.3.1 EJB-Klasse
202
10.3.2 Local-Interface
206
10.3.3 LocalHome-Interface
206
10.3.4 ejb-jar.xml
207
10.3.5 jboss.xml
208
10.3.6 jbosscmp-jdbc.xml
209
10.3.7 Nutzung seitens eines lokalen Clients
210
10.4 CMP: Konto
212
10.4.1 Local-Interface
212
10.4.2 EJB-Klasse
212
10.5 Spezifikation der Datenbankanbindung
214
10.5.1 Standard-Datenbank
215
10.5.2 Individuelle Datenbank
217
10.6 Das
219
Value Object“-Pattern
219
10.6.1 Motivation
219
10.6.2 Kennzeichnung der Klasse
220
10.6.3 Kennzeichnung der Getter
220
10.6.4 Spezifikation des Clientzugriffs
221
10.6.5 Der Ant-Task
222
10.6.6 Die VO-Klasse
222
10.7 1:1 Relation: Kunde – Konto
223
10.7.1 Local-Interface: Kunde
223
10.7.2 Local-Interface: Konto
224
10.7.3 EJB-Klasse: Kunde
224
10.7.4 EJB-Klasse: Konto
227
10.7.5 ejb-jar.xml
228
10.7.6 jbosscmp-jdbc.xml
230
10.8 Die CMPs: Quote, Kategorie und Wette
231
10.8.1 Quote
231
10.8.2 Kategorie
232
10.8.3 Wette
233
10.9 1:N-Relationen: Quote-Wette-Kategorie
234
10.9.1 Local-Interfaces
234
10.9.2 EJB-Klassen
235
10.9.3 ejb-jar.xml
239
10.9.4 jbosscmp-jdbc.xml
241
10.10 CMP: Tipp
242
10.10.1 Primärschlüsselklasse
242
10.10.2 LocalHome-Interface
243
10.10.3 Local-Interface
243
10.10.4 EJB-Klasse
244
10.10.5 ejb-jar.xml
246
10.11 M:N-Relation: Konto-Tipp-Wette
247
10.11.1 Local-Interfaces
247
10.11.2 EJB-Klassen
248
10.11.3 ejb-jar.xml
252
10.11.4 jbosscmp-jdbc.xml
254
10.12 Die EJB-QL
255
10.12.1 Finder
256
10.12.2 Selektoren
261
10.13 Suchfunktionen mit EJB-QL
263
10.13.1 Beispiel 1: Login-Mechanismus
264
10.13.2 Beispiel 2: Alle Datensätze
266
10.13.3 Beispiel 3: Die wertgrößte Kundennummer
268
10.14 Suchfunktionen mit SQL
269
10.14.1 LocalHome-Interface
270
10.14.2 EJB-Klasse
270
10.14.3 ejb-jar.xml
271
10.14.4 jbosscmp-jdbc.xml
272
10.15 Optimierung des Datenbankzugriffs
272
10.15.1 Standardzugriff von JBoss
273
10.15.2 Load Groups
274
10.15.3 Read-Ahead-Strategien
275
10.15.4 Lazy Load Groups
278
10.15.5 Relationen
279
10.16 Automatische Primärschlüsselerzeugung
281
10.16.1 JBoss-spezifisch
281
10.16.2 Herstellerübergreifend
283
10.17 Konfigurationen
287
10.17.1 Standard-Konfigurationen
287
10.18 Konfiguration mittels XDoclet
290
11.1 Grundlagen einer BMP
292
11.2 BMP: Kunde
293
11.2.1 Kapselung der Datenbankzugriffe
293
11.2.2 EJB-Klasse
300
11.2.3 Local-Interface
308
11.2.4 LocalHome-Interface
309
11.2.5 ejb-jar.xml
309
11.2.6 jboss.xml
310
11.3 BMP: Konto
310
11.3.1 Kapselung der Datenbankzugriffe
311
11.3.2 EJB-Klasse
313
12 Timer
318
12.1 TimedObject
318
12.2 Timer
319
12.3 TimerService
319
12.4 Beispiele
321
12.4.1 Zusammenspiel der einzelnen Applikationsbestandteile
321
12.4.2 Session Bean: Auftragsloeschung
321
12.4.3 Singleton: TimerActivator
325
12.4.4 CMP: Auftrag
327
13 Message Driven Beans
332
13.1 Grundlagen
332
13.2 Hilfsklassen
334
13.2.1 MessageDrivenMasterBean
334
13.2.2 QueueConnection
335
13.2.3 QueueConnectorSingleton
336
13.3 Queue-Beispiel: UserdataChange
339
13.3.1 Architektonische Vorgehensweise
339
13.3.2 Interface: UserdataChangeOperations
339
13.3.3 Stub: UserdataChangeStub
341
13.3.4 Delegat: UserdataChangeDelegate
342
13.3.5 EJB-Klasse: UserdataChangeBean
344
13.3.6 Deployment-Deskriptoren
346
13.4 Topic-Beispiel: EMailService
348
13.4.1 Architektonische Vorgehensweise
348
13.4.2 Interface: EMailServiceOperations
349
13.4.3 Stub: EmailServiceStub
349
13.4.4 Delegat: EMailServiceDelegate
351
13.4.5 EJB-Klasse: EmailServiceBean
352
13.4.6 Deployment-Deskriptoren
355
13.4.7 Schwachstellen der Architektur
357
14 JTA
358
14.1 Beispiel-Szenarien
358
14.1.1 Szenario 1
359
14.1.2 Szenario 2
360
14.1.3 Szenario 3
360
14.1.4 Szenario 4
361
14.2 Container Managed Transactions (CMTs)
362
14.2.1 Architektur des Beispiels
363
14.2.2 Beispiel: CMP
364
14.2.3 Beispiel: Stateless Session Bean
367
14.3 Bean Managed Transactions (BMTs)
371
14.3.1 Beispiel 1
371
14.3.2 Beispiel 2
379
15 Gesamtapplikation: EJBs
386
15.1 CustomerService
386
15.1.1 Skelett der Stateful Session Bean „CustomerService“
387
15.1.2 Use Case: Login
392
15.1.3 Use Case: Nutzerdaten abfragen
393
15.1.4 Use Case: Logindaten ändern
393
15.1.5 Use Case: Wette abschließen
394
15.1.6 Use Case: Wettkonto anzeigen
396
15.1.7 Use Case: Nutzerdaten ändern
397
15.1.8 Deployment-Deskriptoren
399
15.2 AdminService
401
15.2.1 Architektur
402
15.2.2 Session Bean: AdminService
402
15.2.3 MDB: Gewinnermittlung
406
15.3 WebAppClient
410
16 Web Services mit AXIS und JBoss
412
16.1 Was ist AXIS?
412
16.2 Von AXIS nach JBoss
414
16.2.1 WS4EE alias JBossWS
414
16.3 Web Service Enabling einer EJB
416
16.3.1 Schritt 1: Implementation der EJB-Klasse
416
16.3.2 Schritt 2: ServiceEndpoint-Interface spezifizieren
419
16.3.3 Schritt 3: WSDL-Datei erstellen
419
16.3.4 Schritt 4: Deployment-Deskriptoren erstellen
421
16.3.5 Schritt 5: Verpacken & Deployen
425
16.4 Ant- Tasks
427
16.4.1 Classpath anpassen
427
16.4.2 Ant-Tasks bekannt machen
427
16.4.3 ejbdoclet-Task anpassen
428
16.4.4 Java2WSDL ausführen
428
16.4.5 ws4ee-Task anpassen
428
16.5 Generierung eines Web Service Clients
429
16.5.1 .NET Client
429
16.5.2 Java Client
431
16.6 Handler
434
16.6.1 Was sind Handler?
434
16.6.2 Wie funktionieren Handler?
435
16.6.3 LoggingHandler
436
16.6.4 AnalysingHandler
438
16.6.5 SigningHandler
440
16.7 Web Service Enabling eines Servlets
448
16.7.1 Schritt 1: ServiceEndpoint-Interface spezifizieren
448
16.7.2 Schritt 2: Servlet implementieren
448
16.7.3 Schritt 3: Java2WSDL ausführen
449
16.7.4 Schritt 4: Deployment-Deskriptoren erstellen
449
17 Clustering mit JBoss
452
17.1 Überblick
452
17.2 Ausfallbehandlung und Lastverteilung
453
17.2.1 HTTP und EJBs
453
17.2.2 JNDI
455
17.2.3 Proxies und Partitionen
457
17.3 Konfiguration von JBoss
458
17.3.1 Kennzeichnung der EJBs
458
17.3.2 Feintuning
460
17.4 Clustern der einzelnen EJB-Typen
463
17.4.1 Stateless Session Beans
463
17.4.2 Stateful Session Beans
463
17.4.3 Entity Beans
466
17.5 Der Client
466
18 JSPs und Servlets
468
18.1 Grundlagen webbasierter Anwendungen
468
18.1.1 Datenübertragung an die JSPs und Servlets
470
18.1.2 Übertragung mittels GET
471
18.1.3 Übertragung mittels POST
473
18.2 Laufzeitumgebung für JSPs und Servlets: Der Web- Container
476
18.3 Entwicklungsumgebung für JSPs und Servlets
476
18.4 Grundlagen: JSPs
477
18.4.1 Scriplets
477
18.4.2 Ausdrücke
478
18.4.3 Deklarationen
478
18.4.4 Kommentare
479
18.4.5 Schlüsselvariablen
479
18.4.6 HttpServletRequest: Auswertung der vom Browser gesendeten Daten
480
18.4.7 HttpServletResponse: Senden der Antwort an den Browser
481
18.4.8 Direktiven
482
18.4.9 Aktionen oder „BuildIn-Taglibs“
484
18.4.10 Codeseparation durch JavaBeans
485
18.4.11 Tag-Libs
487
18.5 Grundlagen: Servlets
489
18.6 Kombination von JSPs und Servlets
492
18.6.1 Ein Master-Servlet
493
18.6.2 Beispiel
494
18.7 Cookies
496
18.7.1 Cookies setzen
496
18.7.2 Cookies auslesen
496
18.7.3 Status eines Cookies ändern
497
18.8 Deployment-Deskriptoren
498
18.9 Verpacken und Deployen des Web- Archivs
500
18.9.1 Generierung der Deployment-Deskriptoren
501
18.9.2 Verpacken und Deployen des Archivs
501
19 Das Web-Framework „Struts“
504
19.1 Probleme bei der Realisierung des Web-Tiers mittels JSPs
504
19.2 Das MVC-Pattern
509
19.3 Was ist Struts?
509
19.3.1 Installation
509
19.3.2 Struts-Grundlagen
510
19.3.3 Implementierung des UseCases „Benutzerdaten ändern“ mit Struts
511
19.4 Das ActionForm
524
19.4.1 Map-backed / List-backed ActionForms
525
19.4.2 DynaActionForms
526
19.5 Der Validator
526
20 JavaServer Faces
528
20.1 Was sind JavaServer Faces?
528
20.1.1 Das MVC-Pattern
528
20.1.2 Internationalisierung
529
20.1.3 Events
529
20.2 Download und Installation
529
20.2.1 Mitgelieferte Beispiele
529
20.3 Eine einfache JSF- Applikation
530
20.3.1 Das Modell: Eine einfache JavaBean
530
20.3.2 View: Eine JSP zur Eingabe
532
20.3.3 Datenbindungs-Syntax
534
20.3.4 View: Eine Ausgabe-JSP
534
20.3.5 Aktionen
535
20.3.6 Der Controller: Ein Servlet
536
20.3.7 Einbinden in die Applikation
538
20.3.8 Erstellen einer Startseite
539
20.4 Navigationsregeln
540
20.4.1 Verwendung von Wildcards
541
20.4.2 Standard-Verhalten
542
20.4.3 Prioritäten der Verarbeitung
543
20.5 Internationalisierung
543
20.5.1 Erstellen der Ressourcen
543
20.5.2 Verwendung in JSPs
544
20.5.3 Verwendung in JavaBeans
546
20.6 Initialisieren von Managed Beans
547
20.6.1 String-Properties
547
20.6.2 Zahlen
548
20.6.3 Boolesche Properties
549
20.6.4 Map-Properties
549
20.6.5 Array- oder List-Properties
550
20.6.6 Initialisierung per Web Deployment-Descriptor
550
20.6.7 Initialisierung über Referenzen
551
20.7 Validieren von Daten
552
20.7.1 Standard-Validatoren
552
20.7.2 Pflichtfelder deklarieren
553
20.7.3 Validierungsfehler ausgeben
553
20.7.4 Überschreiben der vorgefertigten Fehlermeldungen
555
20.7.5 Validieren innerhalb der FormBean
557
20.7.6 Implementieren eines eigenen Validators
559
20.8 Arbeiten mit Events
562
20.8.1 ActionEvents
562
20.8.2 ValueChangeEvents
565
20.8.3 Events: Verwenden der JavaBean
565
20.9 Konverter
568
20.9.1 Das Converter- Attribut
569
20.9.2 Das Converter-Tag
569
20.10 Ein umfangreiches Beispiel
572
20.10.1 Die rudimentäre FormBean
572
20.10.2 Die Login-Seite
574
20.10.3 Die Methode processLogin()
575
20.10.4 Die Customer-Service-JSP
577
20.10.5 Ändern der Benutzerdaten
580
20.10.6 Ändern der Login-Informationen
583
20.11 Zusammenfassung
583
21 Java Message Service Grundlagen
586
21.1 Remote Procedure Calls vs. Messaging
586
21.1.1 Remote Procedure Calls (RPC)
586
21.1.2 Messaging
588
21.2 JMS Messaging-Modelle
589
21.2.1 Publish-Subscribe-Modell (one-to-many Messaging)
589
21.2.2 Point-to-Point-Modell (one-to-one) Messaging
590
21.3 Architektur von JMS- Applikationen
590
21.4 Basiskomponenten der JMS API
591
21.4.1 Administrierte Objekte
595
21.4.2 Connections
598
21.4.3 Sessions
599
21.4.4 Message Producer
599
21.4.5 Message Consumer
601
21.4.6 Messages
603
22 JMS Message: Typen und Struktur
606
22.1 Header
607
22.1.1 Automatisch gesetzte Header
607
22.1.2 Manuell gesetzte Header
613
22.2 Properties
618
22.2.1 Applikationsspezifische Properties
618
22.2.2 Durch JMS definierte Properties
619
22.2.3 Provider-spezifische Properties
620
22.2.4 Property-Beispiel
621
22.3 Message Selektoren
622
22.4 MessageTypen
625
22.5 Der ComplexChatClient
631
23 Verlässliche und performante Messaging- Applikationen
638
23.1 Acknowledgement & Persistenz
638
23.1.1 AUTO_ ACKNOWLEDGE
644
23.1.2 DUPS_OK_ ACKNOWLEDGE
645
23.1.3 CLIENT_ ACKNOWLEDGE
646
23.2 Weitere Mechanismen zum Aufbau verlässlicher Messaging- Applikationen
647
23.2.1 Dead Letter Queue
647
23.2.2 ExceptionListener
649
23.3 Transaktionen
651
23.3.1 Lokale Transaktionen
653
23.3.2 Verteilte Transaktionen
654
23.4 Performante und skalierbare Messaging- Applikationen
658
23.4.1 Wahl des Invocation Layers
658
23.4.2 Caching & Loadbalancing
659
24 Die JMS- Applikation
662
24.1 Der WettInfoService (Publish-and-Subscribe- Modell)
662
24.1.1 Interoperabilität/Schnittstelle
664
24.1.2 Architektur
664
24.1.3 Erweiterung des ValueObjects WetteVO
665
24.1.4 Die Hilfsklasse TopicConnectorSingleton
666
24.1.5 Der ObjectMessageDelegate
670
24.1.6 Der MapMessageDelegate
671
24.1.7 Der erweiterte AdminService
673
24.2 Die TippAnnahme (Point-to-Point-Modell)
676
24.2.1 Architektur der TippAnnahme
677
24.2.2 MessageDrivenMasterBean
677
24.2.3 Der TippAnnahmeDelegate
679
24.2.4 Das TippAnnahmeServiceBean
680
24.2.5 Der DeploymentDescriptor
682
25 Die JBossMQ Konfiguration
684
25.1 Initialisierung des JBossMQ
685
25.2 Der DestinationManager
687
25.3 Der SecurityManager
688
25.4 Der StateManager
690
25.5 Die Konfiguration von Destination
693
25.6 Der MessageCache
696
25.7 Der PersistenceManager
697
25.8 Konfiguration des Invocation Layers
699
25.8.1 Der JVM Invocation Layer
699
25.8.2 Der Unified Invocation Layer 2
700
25.8.3 Der HTTP Invocation Layer
702
Anhang
704
A. 1 Annotations
704
A. 2 EJB 3.0
705
A. 3 Implementation der Geschäftslogik
706
A. 3.1 Session Beans
706
A. 3.2 Message Driven Beans
711
A. 4 Implementation von MBeans
712
A. 5 Implementation der Persistenzschicht
715
A. 5.1 O/R-Mapping
715
A. 5.2 Zugriff auf Entities
719
A. 6 Deployment
722
Register
724
Mehr eBooks bei www.ciando.com
0
Alle Preise verstehen sich inklusive der gesetzlichen MwSt.