2 Jahre Entwicklungszeit, ein hoher Reifegrad und mehr als 300 dokumentierte neue Features, Bugfixes und Verbesserungen.

Big 7 – Neues in Wicket 7

Martin Dilger

Wicket ist groß geworden. Die neue Version 7 gibt sich grundsolide und kommt mit wenigen bahnbrechenden Änderungen daher. Trotzdem wurde das Release von vielen sehnsüchtig erwartet – ein Upgrade lohnt sich wie immer, nicht zuletzt aufgrund der Menge an Bugfixes. In diesem Artikel betrachten wir einige der interessanten Neuerungen.

Wer mit Wicket 7 ein großes Feuerwerk an neuen Features erwartet, wird möglicherweise enttäuscht sein. Die Entwickler um den Kern des komponentenorientierten Webframeworks konzentrieren sich darauf, das Framework stabiler, flexibler und einfacher zu machen. Neben den obligatorischen Updates auf die schon längst überfällige Java 1.7 und die nun zwingend erforderliche Servlet-3.0-Spezifikation taucht eine der interessantesten Änderungen in den Changelogs gar nicht richtig auf.

Component Queuing

Seit jeher erzwingt Wicket die doppelte Pflege der Komponentenhierarchie im Markup und den Java-Komponenten. Ein Los mit dem sich die meisten Entwickler stillschweigend arrangiert haben. Mit Component-Queuing ist eine Vereinfachung in Sicht. Ein einfaches Beispiel.

<div wicket:id="features">
   Neue Features in Wicket 7:
   <div>
          <span wicket:id="queueing"></span>
   </div>
</div>
Im Javacode wird die identische Hierarchie gepflegt.
final WebMarkupContainer container = new WebMarkupContainer("features");
container.add(new Label("queueing", „Component Queueing"));
add(container);

Mit Component-Queueing erlaubt uns Wicket jetzt in engen Grenzen die Hierarchie auf der Javaseite aufzubrechen.

queue(new WebMarkupContainer("features"));
queue(new Label("queueing", "queueing"));

Wir arbeiten einfach mit der queue statt der altbekannten add-Methode. Die Komponenten werden nicht mehr direkt einer Komponente hinzugefügt, sondern in einer Komponenten-Queue gespeichert. Die Hierarchie kann am Ende (in der sogenannten Dequeue-Phase) automatisch aus der Markup-Hierarchie hergeleitet werden.

Um Wildwuchs in der Java-Komponentenhierarchie Sorge zu tragen, wurde das Interface IQueuerRegion eingeführt, das u.a. von der Klasse Panel und Page implementiert wird. Komponenten, die in einem Panel und damit innerhalb einer QueueRegion definiert sind, müssen auch innerhalb dieser QueueRegion gequeued werden und nicht außerhalb.

Eine etwas detailliertere Beschreibung und weiterführende Links zum Thema Component Queueing findet sich beispielsweise unter [1].

Data-URL Ressourcen

Zugegebenermaßen eine Kleinigkeit, trotzdem freue ich mich sehr, dass es diese Änderung endlich in den Core geschafft hat (auch verfügbar ab Wicket 6.20). Wicket bietet endlich standardmäßig Support für eingebettete Data-URL-Bilder.

add(new InlineImage("image", new PackageResourceReference(„apache-wicket.png“)));

Damit ermöglicht Wicket das Einbetten von Bildern Base64-kodiert und direkt in das Markup. Gerade im Hinblick auf mobile Endgeräte bringt das Einbetten von Ressourcen massive Einsparungen bei notwendigen Requests zum Laden einer Seite und somit Performance. Eine Beschreibung des Data-URL-Protokolls findet sich bei Wikipedia unter [2].

HTML5 Audio & Video

Wicket bietet jetzt auch endlich nativen Support für HTML5 Audio und Video. Das Einbinden einer m4v-Datei als HTML5-Video oder HTML5-Audio ist ganz einfach.

<video wicket:id="video"></video>
<audio wicket:id="audio"></audio>

Und im Quellcode analog.

add(new Video("video", new PackageResourceReference(getClass(), "test.m4v")));
add(new Audio("audio", new PackageResourceReference(getClass(), "test.m4v")));

Damit Wicket überhaupt erlaubt, eine m4v-Datei aus dem Classpath zu laden, müssen wir dies explizit im PackageResourceGuards in der init-Methode der Application aktivieren.

((SecurePackageResourceGuard)getResourceSettings().getPackageResourceGuard()).addPattern("+*.m4v");

Ein vollständiges Beispiel (inklusive Beispiel-Audio und Video für Experimente) für die Verwendung der Video- und Audiokomponenten findet sich in den Tests unter [3].

StringResourceModel Fluent-API

Das StringResourceModel ist wahrscheinlich das mächtigste und auch komplexeste Model in Wicket. Es erlaubt das dynamische Ersetzen von Platzhaltern aus Komponentenmodellen. Die typische Erzeugung eines StringResourceModels sah bisher meistens so ähnlich aus.

add(new Label("customer", new StringResourceModel("customerName", getPage(), new CustomerModel(), new String[]{„additional Parameter"}));

Der Konstruktor ist überladen, und viele Parameter sind standardmäßig fast immer mit null gefüllt.

Das StringResourceModel arbeitet für dieses Beispiel auf einer bestimmten Property „customerName“ in einer Propertydatei und ersetzt alle Platzhalter in der geladenen Property mit den Elementen aus dem hier übergebenen CustomerModel. Zusätzlich konnte ein String-Array mit Parametern übergeben werden, welche ebenfalls zum Ersetzen von Platzhaltern verwendet wurden.

Eine Property „customerName = Der Name lautet ${name} ${surname}“ wird so beispielsweise dynamisch zu „Der Name lautet Martin Dilger“.
Mit Hilfe der brandneuen Fluent-API des StringResourceModels wird die Initialisierung übersichtlicher, und die Null-Werte fallen weg.

add(new Label("customer", new StringResourceModel("customerName", getPage()).setModel(new CustomerModel()).setParameters(additionalParametersStringArray)));

Diese Umstellung wäre bei der Migration auf Wicket-7 relativ schmerzhaft geworden, gäbe es nicht die Klasse StringResourceModelMigration, die eine Brücke von der alten API auf die neue bietet und somit die Migration relativ schmerzlos über das Inlining-Feature der IDE möglich macht.

add(new Label("customer", StringResourceModelMigration.of("customerName", getPage(), new PropertyModel<>(this, "customer"), additionalParameters))));

Fazit

Wicket 7 ist keine Revolution, sondern eine konsequente Weiterentwicklung. Ich hätte mir vielleicht mehr neue Features erwartet und vielleicht schon ein wenig mehr Vorarbeit in Richtung Java 8 und einer möglichen Verwendung von Lambdas und Funktional Interfaces, aber das muss wahrscheinlich bis Wicket 8 warten.

Andererseits ist die Migration durch die gute Dokumentation und den Migrationspfad unter [4] relativ schmerzlos. Ich denke noch immer mit Schaudern an die Migration von Wicket 1.4 auf Wicket 1.5. Da ist der Weg auf die 7 geradezu ein Kinderspiel.

Wie sich neue Features wie Component Queueing auf unsere Arbeit auswirken werden, vermag ich derzeit noch nicht zu sagen. Ich denke, langfristig wird alles ein wenig einfacher. Einfach ist gut, daher begrüße ich Wicket in der neuen Version und freue mich über die gewonnene Stabilität und die vergleichsweise einfache Migration.

Aufmacherbild: 3d shiny red number 7 isolated white background / Urheberrecht: TotallyPic.com

Verwandte Themen:

Geschrieben von
Martin Dilger
Martin Dilger
Martin Dilger ist freiberuflicher Softwareentwickler, Consultant und Trainer. Er bewegt sich seit Jahren im Enterprise-Java- und JavaScript-Umfeld und unterstützt Unternehmen bei der Arbeit und beim Umstieg auf Git sowie dem Denken und Arbeiten in dezentralen Workflows.
Kommentare

Hinterlasse einen Kommentar

1 Kommentar auf "Big 7 – Neues in Wicket 7"

avatar
400
  Subscribe  
Benachrichtige mich zu:
Tobias Soloschenko
Gast

Vielleicht noch für Mobile Endgeräte erwähnenswert:

* Responsive Images (Picture / Source Tags)
* Einbinden von multiplen CSS / Javascript Kompressoren (unter anderem auch ein CssUrlReplacer
welcher Bilder so wie das InlineImage in die CSS einbetten kann)
* HTML5 Import HtmlImportHeaderItem

Und vieles mehr!