Renderer

Eine Komponente kann gleichzeitig mehrere Darstellungs- und Eingabekomponenten (so genannte Renderer) besitzen, die den Wert der Komponente auf unterschiedliche Weise darstellen aber auch unterschiedliche Formen der Eingabe ermöglichen. So kann ein Datum gleichzeitig in einem einfachen Textfeld oder über ein Kalender-Popup eingegeben oder aber aus einer Auswahlliste mit vorgegebenen Tagen ausgewählt werden. Nach Verwendung eines Renderers zur Eingabe eines Wertes, werden die anderen Ansichten dieser Komponente sofort mit dem neuen Wert aktualisiert, sodass alle Renderer denselben aktuellen Wert darstellen.

Durch die Kombinationsfähigkeit der Renderer lassen sich aus einfachen und autarken Renderer-Implementierungen komplexe GUI-Widgets zusammenstellen. Bedingung für die Anbindung eines Renderers ist, dass es eine passende Konverterklasse zwischen der Komponente und diesem Renderer gibt. Da der Datentyp einer Komponente nicht immer zum erforderlichen Datentyp des Renderers passt, werden automatisch Konverter zwischen die Komponente und den Renderer geschaltet. Auf Basis des Komponententyps und des generischen Typparameters des Renderers wird der Name der Konverterklasse ermittelt und eine Konverterinstanz geladen.

Die *FormEngine erzeugt ein XHTML-Code-Fragment, das an beliebiger Stelle innerhalb einer HTML-Seite eingebunden werden kann. Layout-Anpassungen am generierten XHTML-Code können über CSS vorgenommen werden. Außerdem können eigene Renderer implementiert und eingebunden werden, um die Funktionalität der Formulare zu erweitern. Diese müssen wie alle anderen Renderer thread-safe implementiert sein. Dadurch sind die beim Parsen einer Formulardefinition erzeugten Renderer-Instanzen von allen aus dieser Definition erzeugten Formularinstanzen verwendbar. Aus einer einmal erzeugten Formulardefinition können dann mit wenig Ressourcen- und Performance-Aufwand die Formularinstanzen erzeugt und dargestellt werden.