07.11.2014 Aufrufe

08/2008 - KaffeeKlatsch

08/2008 - KaffeeKlatsch

08/2008 - KaffeeKlatsch

MEHR ANZEIGEN
WENIGER ANZEIGEN

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>

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!