08/2008 - KaffeeKlatsch
08/2008 - KaffeeKlatsch
08/2008 - KaffeeKlatsch
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Verhext!<br />
Einspruch, Euer Ehren..!<br />
Web-Anwendungen sollen dem Anwender unter anderem<br />
auch Schnittstellen bieten, über die Daten eingesehen,<br />
erstellt oder manipuliert werden können. Damit dies<br />
nicht willkürlich geschieht, gibt uns Wicket sogenannte<br />
Validatoren an die Hand. Mit diesen lässt sich z. B. prüfen,<br />
ob ein Anwender in einem Porto-Kalkulator für sein<br />
Paket auch kein negatives Gewicht angegeben hat, oder<br />
ob die Straße, unter der er sich bei uns anmelden will,<br />
auch in der von ihm angegebenen Stadt existiert. Die<br />
beiden genannten Fälle unterscheiden sich grundlegend<br />
dadurch, dass der erste Fall nur ein isoliertes Formularfeld<br />
betrifft, während der zweite ein Formular als Ganzes<br />
bewertet.<br />
Für den ersten Anwendungsfall bietet Wicket einfache<br />
Validatoren, von denen es sowohl vordefinierte Implementierungen<br />
gibt (z. B. den MinimumValidator),<br />
also auch die Option eigene Ableitungen der Klasse<br />
AbstractValidator zu implementieren.<br />
Der zweite Anwendungsfall wird in Wicket durch<br />
Ableitungen von AbstractFormValidator abgedeckt.<br />
Diese Ableitungen müssen in einer überschriebenen<br />
Methode getDependentComponents() deklarieren, welche<br />
Formularfelder validiert werden müssen, um das komplette<br />
Formular als valide einstufen zu können.<br />
Wanderer zwischen den Welten<br />
Eine Problematik, die einem Web-Entwickler hinlänglich<br />
bekannt ist, ist das Verpacken eines komplexen Objekts in<br />
seine String-Repräsentation für ein HTTP-Request, um<br />
es an den Browser zu senden, oder auch das Auspacken,<br />
um die Antworten serverseitig wieder als Objekt weiterverwenden<br />
zu können.<br />
Das Hilfsmittel, das zur Lösung dieses Problems eingesetzt<br />
werden kann, ist ein Konvertierungs-Mechanismus,<br />
über den die Server-seitigen Objekte nach einem<br />
definierten Vorgehen in Strings für den HTTP-Request<br />
umgewandelt und beim Eintreffen der Antwort auch<br />
wieder aus den Strings hergestellt werden.<br />
Um dieses Vorgehen bei Wicket einsetzen zu<br />
können, wird für jede Klasse, die als Datum an ein<br />
Ein-/Ausgabefeld geknüpft ist – z. B. das im letzten<br />
Abschnitt erwähnte Ge wicht eines Päckchens –,<br />
eine Konverter-Klasse geschrieben, die das Interface<br />
org.apache.wicket.util.convert.IConverter implementieren<br />
muss. Zur Konvertierung dienen dabei die beiden<br />
Methoden convertToObject(String, Locale) und<br />
convertToString(Object, Locale) des Interfaces. Ein auf<br />
diese Weise erzeugter Konverter muss nun noch mit der<br />
Klasse verbunden werden, die er zu konvertieren hat. Dies<br />
kann auf zweierlei Arten geschehen. Zum einen kann der<br />
Konverter direkt an die Komponente, welche die zu konvertierende<br />
Klasse in einem Modell beherbergt, geknüpft<br />
werden. Diese geschieht durch Überschreiben der Methode<br />
getConverter(), wie in folgendem Beispiel zu sehen ist.<br />
TextField input = new TextField("gewicht",<br />
new PropertyModel(gewicht.getValue())) {<br />
@Override<br />
public IConverter getConverter(Class type) {<br />
return WeightConverter();<br />
}<br />
};<br />
Der zweite Weg ist, die zu konvertierende Klasse applikationsweit<br />
mit dem Konverter zu verknüpfen. Diese<br />
Einstellung kann beim Implementieren der Applikationsklasse<br />
durch das Überschreiben der Methode new-<br />
ConverterLocator() erreicht werden. Der Converter-<br />
Locator ist eine Map, die für die gesamte Applikation<br />
Key/Value-Paare für Klassen mit zugehörigen Konverter-Instanzen<br />
enthält. Ein Überschreiben der Methode<br />
könnte folgendermaßen aussehen:<br />
protected IconverterLocator newConverterLocator() {<br />
ConverterLocator locator =<br />
new ConverterLocator();<br />
locator.set(Weight.class, new WeightConverter());<br />
return locator;<br />
}<br />
Wicket Links<br />
Verweise zwischen einzelnen Seiten können in Wicket<br />
grundsätzlich auf verschiedene Weisen implementiert<br />
werden. Neben der einfachen Klasse org.apache.wicket.<br />
markup.html.link.Link gibt es noch Implementierungen<br />
für externe Links (ExternalLink), sowie die Klasse<br />
PageLink im gleichen Paket. Diese Implementierung<br />
sorgt automatisch dafür, dass Verweise auf aktuell angezeigte<br />
Seiten inaktiv werden.<br />
Haben Sie beispielsweise ihr Webmail-Postfach geöffnet,<br />
und auf der linken Seite befinden sich Links für<br />
alle Ordner in Ihrem Postfach (Eingang, Ausgang, Spam,<br />
ect.), sorgt der PageLink automatisch dafür, dass Sie<br />
nicht nochmal auf die Ausgangs-Ordner-Schaltfläche<br />
klicken können, wenn Sie aktuell den Ausgangs-Ordner<br />
geöffnet haben.<br />
Viel wichtiger als die oben genannte Implementierung<br />
ist allerdings der BookmarkablePageLink. Reguläre<br />
Wicket-URLs sind recht umfangreich und enthalten auch<br />
Paket- und Klassennamen der aktuell angezeigten Wicket-<br />
Seite. Als Anbieter oder Entwickler möchten wir solche<br />
Seite 8 <strong>KaffeeKlatsch</strong> Jahrgang 1 / Nr. 8 / August 20<strong>08</strong>