|
Liebe Leserin, lieber Leser, |
3 |
|
|
Auf einen Blick |
4 |
|
|
Inhalt |
6 |
|
|
Geleitwort des Fachgutachters |
18 |
|
|
Vorwort |
20 |
|
|
Grundlagen |
24 |
|
|
1 Einführung |
26 |
|
|
1.1 Was ist ein Algorithmus? |
26 |
|
|
1.2 Was haben Sie mit Algorithmen zu tun? |
28 |
|
|
1.3 Beispiele für Algorithmen |
28 |
|
|
1.4 Wie arbeitet ein Computer? |
30 |
|
|
1.5 Überblick über Java und den Entwicklungsprozess |
32 |
|
|
1.6 Ist Java der Weisheit letzter Schluss? |
33 |
|
|
1.7 Was bedeutet Objektorientierung? |
34 |
|
|
1.8 Das Wichtigste auf einen Blick |
36 |
|
|
1.9 Übungen |
37 |
|
|
2 Installation und Konfiguration von Java und BlueJ |
38 |
|
|
2.1 Java installieren |
38 |
|
|
2.2 BlueJ installieren |
40 |
|
|
2.3 BlueJ konfigurieren |
41 |
|
|
2.4 Erste Schritte mit BlueJ |
41 |
|
|
2.4.1 Das erste Projekt anlegen |
41 |
|
|
2.4.2 Die erste Klasse anlegen |
42 |
|
|
2.4.3 Quelltext einer Klasse bearbeiten |
43 |
|
|
2.5 Weitere Features von BlueJ |
46 |
|
|
2.5.1 Projekte dokumentieren |
46 |
|
|
2.5.2 Projekte drucken |
47 |
|
|
2.5.3 Programme weitergeben |
47 |
|
|
2.6 Übungen |
48 |
|
|
3 Erste Schritte in Java |
50 |
|
|
3.1 Der Rahmen einer Klasse |
50 |
|
|
3.2 Klassen in der Objektorientierung |
52 |
|
|
3.2.1 Attribute |
52 |
|
|
3.2.2 Methoden |
53 |
|
|
3.2.3 Optional: Parameter und Rückgabewert |
55 |
|
|
3.2.4 Abschließendes zu Methoden |
56 |
|
|
3.2.5 Blöcke |
57 |
|
|
3.3 Ein Objekt erzeugen |
58 |
|
|
3.4 Kommentare |
60 |
|
|
3.5 Das Wichtigste auf einen Blick |
63 |
|
|
3.6 Übungen |
64 |
|
|
4 Variablen, Datentypen und Operatoren |
66 |
|
|
4.1 Variablen deklarieren |
66 |
|
|
4.1.1 Bezeichner |
67 |
|
|
4.1.2 Datentypen |
69 |
|
|
4.2 Arten von Variablen |
81 |
|
|
4.2.1 Finale und variable Variablen |
82 |
|
|
4.2.2 Möglichkeiten der Deklaration |
83 |
|
|
4.3 Operatoren |
89 |
|
|
4.4 Arithmetische Operatoren |
90 |
|
|
4.4.1 Priorität und Assoziativität |
90 |
|
|
4.4.2 Anweisungen |
92 |
|
|
4.4.3 Ein Beispiel zur Wiederholung |
93 |
|
|
4.4.4 Codezeilen testen |
94 |
|
|
4.4.5 Inkrement und Dekrement |
95 |
|
|
4.4.6 Division und Rest |
98 |
|
|
4.5 Datentypen umwandeln |
102 |
|
|
4.6 Das Wichtigste auf einen Blick |
103 |
|
|
4.7 Übungen |
104 |
|
|
5 Bedingungen und Vergleiche |
108 |
|
|
5.1 Blöcke |
108 |
|
|
5.2 Die if-Anweisung |
109 |
|
|
5.3 Vergleichsoperatoren |
110 |
|
|
5.4 Mögliche Operanden bei Vergleichen |
111 |
|
|
5.5 Die Handlungsalternative else |
112 |
|
|
5.6 Logische Operatoren |
113 |
|
|
5.6.1 Die Und-Verknüpfung |
114 |
|
|
5.6.2 Die Oder-Verknüpfung |
116 |
|
|
5.6.3 Logische Negation |
117 |
|
|
5.7 Der ternäre Operator |
118 |
|
|
5.8 Die switch-Anweisung |
118 |
|
|
5.9 Beispiel: Bodymaßindex (BMI) berechnen |
121 |
|
|
5.10 Objekte vergleichen |
123 |
|
|
5.10.1 Für welche Objekte gelten die Aussagen? |
123 |
|
|
5.10.2 Warum können Objekte nicht mit dem Vergleichsoperator verglichen werden? |
126 |
|
|
5.10.3 Wie man Objekte stattdessen vergleicht |
128 |
|
|
5.11 Das Wichtigste auf einen Blick |
129 |
|
|
5.12 Übungen |
130 |
|
|
6 Schleifen und Wiederholungen |
134 |
|
|
6.1 Kopfgesteuerte Schleifen - while |
134 |
|
|
6.2 Fußgesteuerte Schleifen - do … while |
135 |
|
|
6.3 For-Schleifen |
135 |
|
|
6.3.1 Schleifen unterbrechen - break und continue |
138 |
|
|
6.3.2 Ein größeres Beispiel für for-Schleifen |
139 |
|
|
6.3.3 Schachteln von for-Schleifen |
142 |
|
|
6.3.4 Erweiterung - die for-each-Schleife |
147 |
|
|
6.4 Das Wichtigste auf einen Blick |
151 |
|
|
6.5 Übungen |
152 |
|
|
7 Anwendungsbeispiel: Geburtstagskalender |
154 |
|
|
7.1 Der erste Ansatz |
154 |
|
|
7.2 Der zweite Ansatz |
155 |
|
|
7.2.1 Die Datenbasis erstellen |
156 |
|
|
7.2.2 Die Datenbasis initialisieren |
157 |
|
|
7.2.3 Mehrere Geburtstagskinder an einem Tag |
158 |
|
|
7.2.4 Kalendereinträge ausgeben |
159 |
|
|
7.3 Fazit |
162 |
|
|
Objektorientierte Programmierung |
166 |
|
|
8 Grundlegende Aspekte der OOP |
168 |
|
|
8.1 Mit Objekten eigener Klassen arbeiten |
168 |
|
|
8.2 Inhalt einer Klasse - der Klassenentwurf |
171 |
|
|
8.3 Bestandteile einer Klasse |
174 |
|
|
8.3.1 Datenfelder und Referenzdatentypen |
174 |
|
|
8.3.2 Methoden |
178 |
|
|
8.3.3 Konstruktoren |
195 |
|
|
8.4 Das Konto-Projekt zum Abschluss bringen |
200 |
|
|
8.5 Pakete importieren und statische Importe |
202 |
|
|
8.5.1 Aufgabe von Paketen |
202 |
|
|
8.5.2 Klassen importieren |
203 |
|
|
8.5.3 Statische Importe |
205 |
|
|
8.5.4 Eine Eingabemöglichkeit schaffen |
209 |
|
|
8.6 Enumerations |
209 |
|
|
8.6.1 Lösungsansatz 1 |
210 |
|
|
8.6.2 Lösungsansatz 2 |
211 |
|
|
8.6.3 Lösungsansatz 3 |
213 |
|
|
8.7 UML und die Klassenkarte |
216 |
|
|
8.8 Annotations |
218 |
|
|
8.9 Das Wichtigste auf einen Blick |
219 |
|
|
8.10 Übungen |
221 |
|
|
9 Vererbung und Polymorphie |
224 |
|
|
9.1 Ihre Aufgabe in diesem Kapitel |
224 |
|
|
9.1.1 Der erste Entwurf |
224 |
|
|
9.1.2 Bewertung des Lösungsansatzes |
226 |
|
|
9.2 Mit Vererbung arbeiten |
226 |
|
|
9.2.1 Eine Superklasse entwerfen |
226 |
|
|
9.2.2 Vererbung testen |
228 |
|
|
9.2.3 Beziehungen zwischen Klassen |
230 |
|
|
9.3 Erweiterung der Aufgabe |
232 |
|
|
9.3.1 Eine neue Superklasse erstellen |
232 |
|
|
9.3.2 Die neue Superklasse testen |
234 |
|
|
9.4 Typen zuweisen |
235 |
|
|
9.4.1 Statischer und dynamischer Typ von Referenzvariablen |
236 |
|
|
9.4.2 Der Cast-Operator |
238 |
|
|
9.4.3 Prüfung der Typen |
239 |
|
|
9.5 Sichtbarkeit |
239 |
|
|
9.6 Konstruktoren |
241 |
|
|
9.7 Methoden überschreiben |
244 |
|
|
9.7.1 Wie Methoden überschrieben werden |
244 |
|
|
9.7.2 Wirkung des Überschreibens |
245 |
|
|
9.7.3 Unterschiedliche Typen |
246 |
|
|
9.7.4 Beispiele für Überschreiben und Überladen |
247 |
|
|
9.7.5 Zugriff auf Methoden der Superklasse |
249 |
|
|
9.8 Die letzte Erweiterung der Aufgabe |
250 |
|
|
9.9 Alle Klassen erben von der Klasse »Object« |
255 |
|
|
9.9.1 Die Methode »getClass()« |
255 |
|
|
9.9.2 Die Methode »toString()« |
256 |
|
|
9.9.3 Die Methode »equals()« |
258 |
|
|
9.9.4 Die Methode »hashCode()« |
263 |
|
|
9.10 Das Wichtigste auf einen Blick |
265 |
|
|
9.11 Übungen |
266 |
|
|
10 Erweiterte Konzepte der OOP |
268 |
|
|
10.1 Abstrakte Klassen |
268 |
|
|
10.1.1 Abstrakte Klassen erzeugen |
269 |
|
|
10.1.2 Abstrakte Methoden in abstrakten Klassen |
270 |
|
|
10.1.3 Ein Beispiel für abstrakte Klassen: Zeit- und Datumsfunktionen |
273 |
|
|
10.2 Schnittstellen |
276 |
|
|
10.2.1 Definition des Begriffes |
276 |
|
|
10.2.2 Ein Beispiel für die Arbeit mit Interfaces |
278 |
|
|
10.3 Wann nehmen Sie was? |
287 |
|
|
10.4 Entwurfsmuster |
287 |
|
|
10.4.1 Beispiel 1: das Observer-Pattern |
288 |
|
|
10.4.2 Beispiel 2: das Singleton-Pattern |
291 |
|
|
10.4.3 Patterns generieren lassen - der PatternCoder |
292 |
|
|
10.4.4 Sinn von Entwurfsmustern |
295 |
|
|
10.5 Innere Klassen |
296 |
|
|
10.5.1 Der erste Lösungsansatz: mit herkömmlichen Möglichkeiten |
296 |
|
|
10.5.2 Der zweite Lösungsansatz: statische innere Klasse |
299 |
|
|
10.5.3 Der dritte Lösungsansatz: nicht-statische Memberklasse |
302 |
|
|
10.5.4 Der vierte Lösungsansatz: lokale Klasse |
305 |
|
|
10.6 Exkurs: Fehler finden mit dem Debugger |
311 |
|
|
10.7 Das Wichtigste auf einen Blick |
315 |
|
|
10.7.1 Abstrakte Klassen und Schnittstellen |
315 |
|
|
10.7.2 Innere Klassen |
316 |
|
|
10.7.3 Entwurfsmuster |
316 |
|
|
10.7.4 Debugging |
317 |
|
|
10.8 Übungen |
317 |
|
|
Grafische Benutzeroberflächen |
318 |
|
|
11 Einführung in die GUI-Programmierung |
320 |
|
|
11.1 Von AWT zu Swing |
321 |
|
|
11.2 Die Vererbungshierarchie von AWT und Swing |
322 |
|
|
11.3 Das erste Fenster |
323 |
|
|
11.3.1 Ein Fenster erzeugen |
323 |
|
|
11.3.2 Ein Menü aufbauen |
324 |
|
|
11.3.3 Tastenkürzel für das Menü anlegen |
326 |
|
|
11.3.4 Ein Menü mit Auswahl von Optionen |
328 |
|
|
11.4 Event-Handling |
330 |
|
|
11.4.1 Hierarchie der Event-Klassen und Event-Typen |
330 |
|
|
11.4.2 Event-Empfänger |
334 |
|
|
11.4.3 Event-Quellen |
334 |
|
|
11.4.4 Zwei Beispiele für das Zusammenspiel |
335 |
|
|
11.4.5 Adapterklassen |
339 |
|
|
11.4.6 So sieht es praktisch aus |
340 |
|
|
11.5 Das Wichtigste auf einen Blick |
345 |
|
|
11.6 Übungen |
346 |
|
|
12 Steuerelemente und Layout |
348 |
|
|
12.1 Namenskonventionen und ungarische Notation |
348 |
|
|
12.2 Top-Level-Container |
349 |
|
|
12.2.1 Die Klasse »JFrame« |
349 |
|
|
12.2.2 Die Klasse »JDialog« |
351 |
|
|
12.2.3 Die Klasse »JWindow« |
353 |
|
|
12.2.4 Fazit zu Top-Level-Containern |
353 |
|
|
12.3 Weitere Container-Klassen |
354 |
|
|
12.3.1 Die Klassen »JComponent« und »JPanel« |
355 |
|
|
12.3.2 Die Klasse »JTabbedPane« |
357 |
|
|
12.3.3 Die Klasse »JSplitPane« |
358 |
|
|
12.3.4 Die Klasse »JScrollPane« |
360 |
|
|
12.4 Interaktionskomponenten (Teil 1) |
361 |
|
|
12.4.1 Die Klasse »JLabel« |
362 |
|
|
12.4.2 Die Klasse »AbstractButton« und ein paar ihrer Subklassen |
364 |
|
|
12.4.3 Die Klasse »JList« |
369 |
|
|
12.5 Das MVC-Pattern |
373 |
|
|
12.5.1 Allgemeine Beschreibung |
373 |
|
|
12.5.2 Wie sieht dieses Prinzip in Swing aus? |
383 |
|
|
12.5.3 Besonderheit der Swing-Modelle |
390 |
|
|
12.6 Interaktionskomponenten (Teil 2) |
391 |
|
|
12.6.1 Die Klasse »JTextField« |
391 |
|
|
12.6.2 Die Klasse »JComboBox« |
393 |
|
|
12.6.3 Die Klasse »JPasswordField« |
395 |
|
|
12.6.4 Die Klasse »JTextArea« |
396 |
|
|
12.6.5 Die Klasse »JEditorPane« |
397 |
|
|
12.6.6 Die Klasse »JSlider« |
398 |
|
|
12.6.7 Die Klasse »JSpinner« |
400 |
|
|
12.6.8 Die Klasse »JOptionPane« |
402 |
|
|
12.7 Das Wichtigste auf einen Blick |
405 |
|
|
12.8 Übungen |
406 |
|
|
13 Erweiterte Konzepte von Swing |
408 |
|
|
13.1 Layoutmanager |
409 |
|
|
13.1.1 Layoutmanager in der Praxis |
409 |
|
|
13.1.2 Das FlowLayout |
410 |
|
|
13.1.3 Das BorderLayout |
411 |
|
|
13.1.4 Das GridLayout |
413 |
|
|
13.1.5 Das GridBagLayout |
415 |
|
|
13.2 Look and Feel (LaF) |
420 |
|
|
13.3 Die Klasse »JTable« |
423 |
|
|
13.3.1 Umsetzung mit Arrays |
423 |
|
|
13.3.2 Datenbasis mit »TableModel« verwalten |
424 |
|
|
13.3.3 Realisierung mit »AbstractTableModel« |
429 |
|
|
13.3.4 Realisierung mit »DefaultTableModel« |
431 |
|
|
13.3.5 Darstellung der Daten (Rendering) |
431 |
|
|
13.3.6 Tabellen sortieren |
435 |
|
|
13.3.7 Zellen editieren |
438 |
|
|
13.3.8 Mehr über die Arbeit mit »JTable« |
442 |
|
|
13.4 Die Klasse »JTree« |
443 |
|
|
13.4.1 Ein erster Versuch |
443 |
|
|
13.4.2 Auf Ereignisse lauschen |
445 |
|
|
13.4.3 Selektionen und die Klasse »TreePath« |
447 |
|
|
13.4.4 Ein eigenes Modell entwickeln |
449 |
|
|
13.4.5 Die Anzeige ändern - das Rendering |
454 |
|
|
13.5 Das Interface »Action« |
456 |
|
|
13.6 Das Wichtigste auf einen Blick |
458 |
|
|
Fortgeschrittene Themen |
460 |
|
|
14 Ausnahmebehandlung - Exceptions |
462 |
|
|
14.1 Was bedeutet Fehlerbehandlung? |
462 |
|
|
14.1.1 Wie Fehler abgefangen werden können |
463 |
|
|
14.1.2 Nachteile des ersten Ansatzes |
463 |
|
|
14.2 Einführung von Exception-Handling |
464 |
|
|
14.2.1 Die Exception-Klassen |
465 |
|
|
14.2.2 Der try- und der catch-Block |
465 |
|
|
14.2.3 Der finally-Block |
467 |
|
|
14.3 Fangen oder Weiterreichen (Catch-or-Specify) |
468 |
|
|
14.4 Differenziert auf Ausnahmesituationen reagieren |
469 |
|
|
14.4.1 Eigene Exception-Typen definieren |
469 |
|
|
14.4.2 Exceptions differenziert fangen |
473 |
|
|
14.5 Runtime-Exceptions |
476 |
|
|
14.6 Error |
478 |
|
|
14.7 Die Methode »printStackTrace()« |
478 |
|
|
14.8 Assertions |
480 |
|
|
14.9 Neu in Java 7 |
481 |
|
|
14.10 Zusammenfassendes Beispiel |
482 |
|
|
14.10.1 Die bisherige Implementierung |
482 |
|
|
14.10.2 Die neue Implementierung |
483 |
|
|
14.10.3 Die neue Implementierung testen |
484 |
|
|
14.11 Das Wichtigste auf einen Blick |
487 |
|
|
15 Collections und Generics |
488 |
|
|
15.1 Ein eigenes Array entwickeln |
488 |
|
|
15.1.1 Die Datenbasis der Klasse »MyArray« |
489 |
|
|
15.1.2 Methoden der Klasse »MyArray« |
490 |
|
|
15.1.3 Weitere Methoden der Klasse »MyArray« |
490 |
|
|
15.2 Primitive Datentypen als Objekte - Wrapper-Klassen |
492 |
|
|
15.2.1 Autoboxing und Unboxing |
492 |
|
|
15.2.2 Hinweis zum Umgang mit Wrapper-Klassen |
493 |
|
|
15.3 Einführung in Generics - Typsicherheit |
494 |
|
|
15.4 Die Interfaces »List« und »Set« |
497 |
|
|
15.4.1 Das Interface »List« |
498 |
|
|
15.4.2 Das Interface »Set« |
504 |
|
|
15.4.3 Sammlungen mit »Comparable« und »Comparator« sortieren |
509 |
|
|
15.4.4 Verwendung der Klasse »TreeSet« |
514 |
|
|
15.5 Das Interface »Map« |
517 |
|
|
15.5.1 Eine Map erzeugen |
517 |
|
|
15.5.2 Einer Map Werte übergeben |
518 |
|
|
15.5.3 Interne Abbildung der Daten und Iteration |
519 |
|
|
15.6 Das Wichtigste auf einen Blick |
521 |
|
|
15.7 Übungen |
522 |
|
|
16 Nebenläufigkeit |
524 |
|
|
16.1 Ein erstes Beispiel |
524 |
|
|
16.1.1 Die Quellen des Beispieles |
525 |
|
|
16.1.2 Auswertung des Beispieles |
526 |
|
|
16.2 Zustandsänderungen eines Threads |
528 |
|
|
16.2.1 Zustände, die ein Thread einnehmen kann |
528 |
|
|
16.2.2 Änderungen des Zustandes |
528 |
|
|
16.2.3 Einen Thread beenden |
529 |
|
|
16.2.4 Die Methoden »sleep()« und »interrupt()« |
531 |
|
|
16.2.5 Prioritäten von Threads festlegen |
532 |
|
|
16.2.6 Eine Zeitschaltuhr - die Klasse »Timer« |
533 |
|
|
16.3 Synchronisieren von Threads |
534 |
|
|
16.3.1 Wo liegt die Fehlerquelle? |
534 |
|
|
16.3.2 Wie kann dieses Problem umgangen werden? |
538 |
|
|
16.4 Kommunikation zwischen Threads |
541 |
|
|
16.5 Das Wichtigste auf einen Blick |
543 |
|
|
16.6 Übungen |
544 |
|
|
17 Dateien, Datenströme, Serialisieren |
546 |
|
|
17.1 Dateibehandlung ab Java 7 |
546 |
|
|
17.1.1 Einstiegspunkte sind »FileSystem« und »Path« |
546 |
|
|
17.1.2 Eine Datei oder ein Verzeichnis bearbeiten |
549 |
|
|
17.2 Exkurs: Dateibehandlung bis Java 7 |
551 |
|
|
17.3 Was sind Ströme und was kann man damit machen? |
553 |
|
|
17.3.1 Mit Byte-Streams arbeiten |
554 |
|
|
17.3.2 Character-Streams und Brückenklassen |
557 |
|
|
17.3.3 BufferedReader und BufferedWriter einsetzen |
560 |
|
|
17.4 Kurze Zusammenfassung und Ausblick |
563 |
|
|
17.5 Objekte serialisieren und deserialisieren |
565 |
|
|
17.5.1 Die Klasse »Adressbuch« schreiben |
565 |
|
|
17.5.2 Die Klasse »Freund« schreiben |
566 |
|
|
17.5.3 Die Klasse »Verwaltung« schreiben |
566 |
|
|
17.5.4 Das Projekt testen |
569 |
|
|
17.5.5 Variablen von der Serialisierung ausnehmen |
570 |
|
|
17.6 Mit dem FileWhisperer das Dateisystem erkunden |
570 |
|
|
17.6.1 Die Oberfläche gestalten |
571 |
|
|
17.6.2 Verzeichnisse anzeigen |
572 |
|
|
17.6.3 Die Datei-Attribute anzeigen |
575 |
|
|
17.7 Das Wichtigste auf einen Blick |
581 |
|
|
18 Netzwerke |
584 |
|
|
18.1 Rechner verbinden |
584 |
|
|
18.2 Verbindung über Sockets |
585 |
|
|
18.2.1 IP-Adressen und Domain-Namen |
586 |
|
|
18.2.2 Ports |
587 |
|
|
18.3 Der Multifunktionsserver |
588 |
|
|
18.3.1 Schritt 1 - Grundversion |
588 |
|
|
18.3.2 Schritt 2 - mehrere Aufgaben an den Server richten |
594 |
|
|
18.3.3 Schritt 3 - Vorbereitung von Multithreading |
595 |
|
|
18.3.4 Schritt 4 - Einführung von Multithreading |
598 |
|
|
18.3.5 Schritt 5 - eigene Objekte statt Strings |
599 |
|
|
18.3.6 Schritt 6 - Einführung von Services |
604 |
|
|
18.3.7 Schritt 7 - Funktionen in HashMap speichern |
605 |
|
|
18.4 Anregung für eigene Projekte |
608 |
|
|
18.5 Das Wichtigste auf einen Blick |
609 |
|
|
19 Datenbanken |
610 |
|
|
19.1 Grundlagen |
610 |
|
|
19.1.1 Aufbau einer Datenbank |
611 |
|
|
19.1.2 Wichtige Begriffe |
613 |
|
|
19.2 Installation einer Datenbank |
613 |
|
|
19.2.1 Die Serversoftware installieren |
613 |
|
|
19.2.2 Einen Treiber installieren |
615 |
|
|
19.3 Eine Datenbank anlegen |
615 |
|
|
19.3.1 Die Verbindung herstellen |
616 |
|
|
19.3.2 Befehl an die Datenbank absetzen |
617 |
|
|
19.3.3 Überblick über den Quelltext |
619 |
|
|
19.4 Tabellen anlegen |
621 |
|
|
19.4.1 Treiber laden und Verbindung herstellen |
621 |
|
|
19.4.2 Tabellen anlegen und Verbindungen schließen |
622 |
|
|
19.5 Spalten anlegen |
624 |
|
|
19.5.1 Datentypen von Attributen |
625 |
|
|
19.5.2 Die Primärschlüssel der Tabellen anlegen |
625 |
|
|
19.6 Daten in die Tabellen eintragen |
627 |
|
|
19.7 Daten abfragen, ändern und löschen |
629 |
|
|
19.7.1 Daten abfragen |
629 |
|
|
19.7.2 Tabellen verbinden |
632 |
|
|
19.7.3 Die where-Klausel |
633 |
|
|
19.7.4 Daten löschen und Subabfragen definieren |
634 |
|
|
19.7.5 Daten ändern |
635 |
|
|
19.8 Prepared Statement |
636 |
|
|
19.9 Exkurs SQL-Injection |
637 |
|
|
19.10 Weitergehende Konzepte |
641 |
|
|
19.11 Das Wichtigste auf einen Blick |
642 |
|
|
A Lösungen |
644 |
|
|
A.1 Kapitel 1 |
644 |
|
|
A.2 Kapitel 2 |
645 |
|
|
A.3 Kapitel 3 |
645 |
|
|
A.4 Kapitel 4 |
645 |
|
|
A.5 Kapitel 5 |
646 |
|
|
A.6 Kapitel 6 |
647 |
|
|
A.7 Kapitel 8 |
647 |
|
|
A.8 Kapitel 9 |
648 |
|
|
A.9 Kapitel 15 |
648 |
|
|
Index |
650 |
|