Inhalt | 8 |
Vorwort | 14 |
1 Einleitung | 16 |
1.1 Warum Wicket? | 18 |
1.1.1 Einfach, Konsistent, Offensichtlich | 19 |
1.1.2 Wiederverwendbarkeit | 19 |
1.1.3 Sauber getrennt | 20 |
1.1.4 Sicher | 20 |
1.1.5 Effizient und skalierbar | 21 |
1.1.6 Komplett | 21 |
1.1.7 Eine gute Wahl | 21 |
1.2 Vorbereitung und Installation | 22 |
1.2.1 Java, Maven und Eclipse | 22 |
1.2.2 Versionskontrolle mit Subversion | 22 |
1.3 Grundlagen einer Webanwendung | 23 |
1.3.1 Anwendungsschichten | 23 |
1.3.2 Verzeichnis und Paketstruktur | 26 |
1.3.3 Unit-Tests | 27 |
2 Aufsetzen der Teilprojekte | 30 |
2.1 Nomenklatur der Teilprojekte | 30 |
2.2 Aufsetzen der Teilprojekte | 31 |
2.2.1 Projektbasis ParentPom | 31 |
2.2.2 Teilprojekt Base | 35 |
2.2.3 Teilprojekte Datenbankkonfiguration | 35 |
2.2.4 Teilprojekt Persistenz | 37 |
2.2.5 Teilprojekt Applikationsschicht | 39 |
2.2.6 Teilprojekt Webapp | 39 |
2.2.7 Teilprojekt ParentPom – Abschluss | 41 |
2.3 Erstellen von Eclipse-Projektdateien | 42 |
3 Mit Leben füllen | 44 |
3.1 Konfiguration mit Spring | 44 |
3.2 Datenbankkonfiguration | 45 |
3.2.1 Teilprojekt dbconfig | 45 |
3.2.2 Teilprojekt dbconfig-test | 46 |
3.2.3 Teilprojekt dbconfig-schema-update | 46 |
3.2.4 Schemagenerierung mit Hibernate | 47 |
3.3 Persistenz | 48 |
3.3.1 Datenbankzugriff – Allgemeine Schnittstellendefinition | 48 |
3.3.2 Datenbankzugriff – Hilfsklassen | 49 |
3.3.3 Datenbankzugriff – User | 50 |
3.3.4 Datenbankzugriff – Konfiguration | 52 |
3.3.5 Persistenz-Tests | 53 |
3.3.6 Schema-Update | 55 |
3.4 Anwendungsschicht | 56 |
3.5 Präsentationsschicht | 56 |
3.5.1 Hilfsklasse für Maven-Projekte | 56 |
3.5.2 Wicket Web Application | 57 |
3.5.3 Servlet-Konfiguration | 59 |
3.5.4 Spring-Konfiguration | 61 |
3.5.5 Start der Anwendung | 61 |
4 Die Wicket-Architektur | 64 |
4.1 Wicket und das HTTP-Protokoll | 64 |
4.2 Struktur | 64 |
4.2.1 WebApplication | 65 |
4.2.2 Session | 65 |
4.2.3 PageMap | 65 |
4.2.4 Page | 65 |
4.2.5 PageStore | 66 |
4.2.6 Component | 66 |
4.3 Request-Behandlung | 66 |
4.3.1 Komponentenphasen | 67 |
4.3.2 Nebenläufigkeit – Threads | 67 |
4.4 Komponenten, Modelle, Markup | 68 |
4.4.1 Komponenten | 68 |
4.4.2 Modelle | 68 |
4.4.3 Markup | 68 |
5 Modelle | 70 |
5.1 Konverter | 70 |
5.2 Einfache Modelle | 72 |
5.2.1 Modelle verändern | 73 |
5.3 Modell-Hilfsklassen | 75 |
5.4 Modelle und Serialisierung | 76 |
5.4.1 DetachableModel – Dynamische Modelldaten | 76 |
5.4.2 Kaskadierung von Modellen | 77 |
5.4.3 Automatische Kaskadierung von Modellen | 80 |
5.4.4 Datenbankzugriffsmodelle | 81 |
5.5 Komplexe Modellklassen | 84 |
5.5.1 Zugriff auf Bean-Properties | 84 |
5.5.2 Die Klasse PropertyModel | 87 |
5.5.3 CompoundPropertyModel | 89 |
5.6 Ausgelagerte Informationen | 91 |
5.6.1 Einfacher Zugriff auf Ressourcen | 91 |
5.6.2 ResourceModel | 91 |
5.6.3 StringResourceModel | 93 |
6 Komponenten | 96 |
6.1 Basisklasse Component | 96 |
6.1.1 Komponentenbaum | 96 |
6.1.2 Darstellungsphasen | 98 |
6.1.3 Page, Session und Application | 99 |
6.1.4 Komponentenpfad | 99 |
6.1.5 Modelle | 99 |
6.1.6 Feedback | 100 |
6.2 Grundlagen der Vererbung | 100 |
6.2.1 Eine Seite mit eigenen Komponenten | 100 |
6.2.2 Vererbung für Fortgeschrittene | 106 |
6.3 Style, Locale und Variation | 109 |
6.3.1 Markup-Variationen | 109 |
6.4 Sichtbarkeit | 114 |
6.4.1 wicket:enclosure | 115 |
6.4.2 Empfehlung zur Anwendung | 116 |
6.5 Ajax | 117 |
6.5.1 Ajax-Events | 118 |
6.5.2 Einfache Event-Behandlung | 119 |
6.5.3 Automatische Event-Behandlung | 120 |
7 Basiskomponenten | 124 |
7.1 Gruppierende Komponenten | 124 |
7.1.1 Seiten | 124 |
7.1.2 Panel | 132 |
7.1.3 Fragment | 134 |
7.1.4 Border | 135 |
7.1.5 ComponentBorder | 140 |
7.1.6 WebMarkupContainer | 141 |
7.2 Inhaltselemente | 142 |
7.2.1 Label und MultiLineLabel | 142 |
7.2.2 Lokaler Konverter | 144 |
7.2.3 XML | 145 |
7.2.4 Das wicket:message-Tag | 146 |
7.2.5 Image | 147 |
7.3 Links | 152 |
7.3.1 Von A nach B | 152 |
7.3.2 Ajax und Links | 153 |
7.3.3 Link-Tricks | 155 |
7.3.4 Externe Links | 156 |
7.3.5 Popups | 156 |
7.3.6 ResourceLink | 158 |
7.3.7 Formularlinks | 159 |
7.4 Behavior | 159 |
7.4.1 Darf es etwas JavaScript sein? | 159 |
7.4.2 Attribute anpassen | 160 |
7.4.3 Attribute erweitern | 162 |
7.4.4 Ajax und Formulare | 163 |
8 Listen und Tabellen | 164 |
8.1 Darstellung von Listen | 164 |
8.1.1 RepeatingView | 164 |
8.1.2 RefreshingView | 165 |
8.1.3 ListView | 167 |
8.1.4 PropertyListView | 168 |
8.1.5 ColumnListView | 169 |
8.2 DataProvider | 171 |
8.2.1 DataView | 171 |
8.2.2 GridView | 173 |
8.2.3 DataGridView | 174 |
8.2.4 DataTable | 176 |
8.2.5 DefaultDataTable | 177 |
9 Formulare | 184 |
9.1 Voraussetzungen | 184 |
9.2 Feedback | 185 |
9.3 Basisklasse für alle Beispiele | 186 |
9.4 Formulare absenden | 187 |
9.4.1 Absenden mit Submit-Button | 187 |
9.4.2 Button-Komponente | 188 |
9.4.3 Submit per Ajax | 189 |
9.4.4 POST und GET | 190 |
9.5 Textfelder | 191 |
9.5.1 Typangabe | 193 |
9.5.2 Automatische Typermittlung | 194 |
9.6 Label | 196 |
9.7 CheckBox | 197 |
9.8 RadioButton | 200 |
9.9 Auswahlfelder | 201 |
9.9.1 Select | 201 |
9.9.2 DropDownChoice | 203 |
9.9.3 ListMultipleChoice | 205 |
9.10 Dateien hochladen | 207 |
9.10.1 FileUpload | 207 |
9.10.2 MultiFileUpload | 209 |
9.11 Gültigkeitsprüfung | 210 |
9.11.1 StringValidator | 211 |
9.11.2 Minimum und Maximum | 212 |
9.11.3 E-Mail | 212 |
9.11.4 URL | 214 |
9.11.5 Eigene Validatoren | 214 |
9.12 FormValidator | 216 |
9.12.1 Passwortprüfung | 216 |
9.12.2 Eigene Prüfung | 218 |
9.13 Ajax | 220 |
9.13.1 AjaxFormSubmitBehavior | 220 |
9.13.2 AjaxFormValidatingBehavior | 222 |
9.13.3 AjaxComponentUpdatingBehavior | 222 |
9.13.4 OnChangeBehavior | 224 |
9.13.5 AutoCompleteTextField | 225 |
9.14 AjaxEditableLabel | 227 |
9.15 Erweitertes Feedback | 229 |
9.15.1 Feedback zum Formular | 229 |
9.15.2 Feedback für die Komponente | 230 |
9.15.3 Feedback als Rahmen | 231 |
9.15.4 Feedback als Indikator | 232 |
9.15.5 Feedback per CSS | 233 |
9.16 Generierte Formulare | 235 |
9.17 Verschachtelte Formulare | 237 |
10 Sessions und Security | 240 |
10.1 Einfache Variante | 240 |
10.1.1 Eine eigene Session-Klasse | 240 |
10.1.2 Geschützte Seiten | 241 |
10.1.3 Strategie | 241 |
10.1.4 WebApplication | 242 |
10.1.5 Seiten | 243 |
10.2 Marker an Komponenten | 246 |
10.3 Elemente ausblenden | 248 |
11 Wicket in der Praxis | 250 |
11.1 Die Integration von Spring | 250 |
11.2 Navigation | 252 |
11.3 CSS einbinden | 259 |
11.4 Eigene Basiskomponenten | 265 |
11.5 Komponententausch | 268 |
11.5.1 AjaxFallbackConfirmLink | 269 |
11.5.2 Wizard | 271 |
11.6 Suchmaschinenoptimierung | 273 |
11.6.1 Pfad für BookmarkablePages | 273 |
11.6.2 SessionTimeoutPage | 277 |
11.6.3 SEO-Links | 279 |
11.6.4 Servlet-Filter | 283 |
11.6.5 Tracking mit Google Analytics | 286 |
11.7 Ressourcen | 289 |
11.7.1 Dynamisch erzeugte Grafiken | 289 |
11.7.2 Automatisch generierte Thumbnails | 291 |
11.7.3 Download durch Formular | 292 |
11.7.4 Shared Resources | 293 |
11.7.5 RSS-Feed | 295 |
11.8 Links auf Seiten und Ressourcen | 297 |
11.9 Optimierungen | 299 |
11.9.1 Applikation | 299 |
11.9.2 Konverter | 299 |
11.9.3 Debug | 299 |
11.9.4 Ressource | 300 |
12 Fehlersuche | 302 |
12.1 Häufige Fehlerquellen | 302 |
12.1.1 Komponenten fehlen | 302 |
12.1.2 Komponente ist bereits vorhanden | 302 |
12.1.3 Ajax funktioniert nicht | 303 |
12.2 Unit-Tests | 303 |
13 Anfang oder Ende? | 308 |
Register | 310 |