Praktische Einführung in die Datenhaltung von Vaadin

Der GUI-Stack von Vaadin mag hilfreich sein. Wirklich nützlich ist das Framework zum Entwickeln von Rich Internet Applications jedoch erst, wenn Programmierer beim Aufsetzen der Steuerelemente Zeit sparen. Vaadin bietet eine vollwertige Datenhaltungs-Engine an, die aber durch merkwürdige Designentscheidungen etwas eigen ist.

Werkzeuge  –  2 Kommentare

Zum Verständnis des Datenmodells empfiehlt es sich, eine Tabellenkalkulation zu implementieren. Ein Container ist dabei eine Tabelle, die eine Vielzahl hier an Zeilen enthält, die hier über die Item-Klasse realisiert sind. Die einzelnen Attribute der Zeilen werden sodann über Properties abgebildet, womit das Datenmodell komplett wäre.

Container, Item und Property sind keine vollwertigen Klassen. Im Interesse der Flexibilität setzt das Vaadin-Team an der Stelle auf Interfaces, die Entwickler beleben können und so das Realisieren mehr oder weniger beliebiger Funktionen ermöglichen. Der Lohn dieser auf den ersten Blick unorthodoxen Vorgehensweise ist, dass Entwickler das Vaadin-Datenmodell mit beliebigen Inhalten beladen können. Zum Beispiel können sie gewöhnliche Beans, aber auch beliebig komplexe Klassen verwenden. Implementieren sie das jeweilige Interface, so ist alles in Ordnung.

Das Diagramm gehört eigentlich umgedreht (Abb. 1). (Bild: Vaadin)

Ein erstes Modell

Nach den einführenden Überlegungen sei ein kleines Programm zusammengebastelt, das Steuerelemente mit Modellinformationen anreichert. Zur Beruhigung eine Anmerkung vorweg: Vaadin wird mit einer Vielzahl fertiger Implementierungen ausgeliefert – Entwickler müssen demnach nicht immer bei Null anfangen.

Das in einem vorherigen Artikel verwendete Programmbeispiel soll dabei im Großen und Ganzen weitergenutzt werden. Zu Beginn öffnet man die Klasse EnterView und passt den Korpus folgendermaßen an, um die für die Anzeige erforderlichen Elemente einzufügen:

public class EnterView extends VerticalLayout implements View
{
ObjectProperty myDS;

ObjectProperty dient als eine Art vorgefertigter Container. Die Klasse ist als eine Erweiterung von AbstractProperty aufgebaut – wer ein eigenes Property erzeugen möchte, kann das unter anderem durch Implementieren beziehungsweise Erweitern der folgenden Klasse tun:

public class ObjectProperty<T> extends AbstractProperty<T> {
private T value;
private final Class<T> type;
...

Dieses Snippet ist primär für diejenigen relevant, die später eigene Datenklassen um die Möglichkeit erweitern möchten, als Property zu agieren. An der Stelle ist das Errichten des neuen Formulars interessanter, was folgendermaßen aussieht:

@Override
public void enter(ViewChangeEvent event) {
removeAllComponents();
setSizeFull();
myDS=new ObjectProperty<String>("Textfeld eins", String.class);

ObjectProperty ist eine generische Klasse: Im Rahmen der Bevölkerung der Member-Variable müssen Entwickler den Datentyp festlegen, den die Klasse vorhalten soll. Zudem geben sie einen Initialwert an, der nach dem Erzeugen der Klasse als "Default" angenommen wird. Das Erzeugen der eigentlichen Textbox erfolgt – im Großen und Ganzen – so, wie man es erwarten würde:

     TextField myField=new TextField();
myField.setImmediate(true);
myField.setPropertyDataSource(myDS);
addComponent(myField);
Label myLabel=new Label();
myLabel.setPropertyDataSource(myDS);
addComponent(myLabel);
}

Beide Steuerelemente bekommen über die Methode setPropertyDataSource einen Verweis auf die Datenquelle eingeschrieben. Das bedeutet, dass sie ihre Inhalte zur Laufzeit aus der Datenquelle beziehen und ihr lokaler Speicher deaktiviert wird.

Das Setzen des Attributs setIntermediate weist Vaadin darauf hin, Änderungen im Inhalt der Textbox so schnell wie möglich weiterzuschreiben. Insbesondere im Fall einer Textbox kann zwischen Eingabe eines Zeichens und der Aktualisierung des Code Behind etwas Zeit verstreichen: Es handelt sich hierbei um eine Optimierungsmaßnahme.