Naked Objects kann sowohl als Rich Client, dem so genannten Drag and Drop Client, als auch als Webapplikation betrieben werden, wobei in beiden Fällen das komplette User Interface zur Laufzeit generiert wird. Der Entwickler kann dabei auf das User Interface nur über die vom Framework bereitgestellten Möglichkeiten Einfluss nehmen. Gerade beim Rich Client ist dies äußerst problematisch, da sich die Oberfläche nicht an bestehende UI-Standards hält und dadurch die Applikation einige Einarbeitung benötigt. Gerade dieser Aspekt kann daher zu einem Ausschlusskriterium für Naked Objects werden, vor allem wenn die Applikation nicht für Power User vorgesehen ist. Einen tabellarischen Vergleich mit einigen anderen UI-Technologien bietet der FAQ-Bereich auf der Metawidget-Website.
Let's go, Metawidget!
Nachdem wir jetzt einige alternative Technologien kennengelernt haben, wollen wir uns endlich in die Materie hineinstürzen und uns ansehen, wie die Formularerstellung mit Metawidget funktioniert. Sehen wir uns zuerst die Domänenklasse von Listing 2 an. Was dem aufmerksamen Leser dieses Artikels natürlich gleich auffällt, ist die Ähnlichkeit zu Naked Objects. Genau wie dieses verwendet Metawidget Annotationen, um die Domänenklassen mit Informationen anzureichern, die für das User Interface benötigt werden. Analog zu @MemberOrder gibt es daher die @UiComesAfter, die angibt, an welcher Stelle im Formular das Eingabefeld angezeigt werden kann. Der Unterschied ist jedoch, dass bei @UiComesAfter eine relative Positionierung stattfindet, da der Name des vorhergehenden Properties angegeben wird. Dadurch erspart man sich, sämtliche Annotationen nochmals zu korrigieren, wenn man nachträglich weiter vorne im Formular ein Eingabefeld positionieren will. @UiLabel ist wiederum analog zu @Named, wobei Metawidget auch die Internationalisierung über Ressourcendateien erlaubt. Der erste bedeutende Unterschied sind Annotationen wie @NotEmpty, @Pattern oder @Length, die zwar die gleiche Semantik wie ihre Pendants in Naked Objects haben, allerdings nicht wie bei Naked Objects von Metawidget zur Verfügung gestellt werden. Stattdessen wurden in diesem Beispiel die Annotationen von Hibernate Validator verwendet, wobei Metawidget nicht darauf festgelegt ist. Tabelle 2 listet die wichtigsten Annotationen von Metawidget auf.
Tabelle 2: Metawidget-Annotationen| Annotation | Beschreibung |
|---|---|
| UiComesAfter | Bestimmt die Reihenfolge, in der die Eingabefelder angezeigt werden |
| UiLarge | Vergrößert das Eingabefeld für längere Texte |
| UiHidden | Zeigt das Eingabefeld nicht an |
| UiReadOnly | Markiert das Eingabefeld als schreibgeschützt |
| UiMasked | Maskiert die Eingabefelder für die Eingabe von Passwörtern |
| UiLookup | Gibt die Eingabewerte in einer Combo-Box zur Auswahl vor |
| UiDontExpand | Komplexe Typen werden nicht als Subformular angezeigt |
| UiSection | Beginnt eine neue Sektion im Formular und setzt dessen Titel |
Nicht jeder Entwickler ist darüber glücklich, dass immer mehr Annotationen eingesetzt werden. Nachdem die Verwendung von Annotationen immer mehr zunimmt, wird hierfür teilweise schon der Begriff "Annotationshölle" verwendet. Daher bietet Metawidget als Alternative auch die gute, alte Konfiguration per XML-Dateien an. Listing 3 zeigt dieselbe Domänenklasse wie Listing 2, diesmal jedoch in XML definiert. Der Vorteil: Die Reihenfolge der Eingabefelder wird durch die Reihenfolge in der XML-Datei bereits festgelegt.
package de.javamagazin.mwd;import java.util.*;import org.hibernate.validator.*;import org.metawidget.inspector.annotation.*;public class Project{private String name = null;private String codeName = null;private String description = null;@UiLabel("Projektname")@NotEmpty(message="Der Projektname muss angegeben werden")@Pattern(regex="[A-Za-z]\\w+",message="Der Projektname muss mit einem Buchstaben beginnen")public String getName() {return name;}@UiComesAfter("codename")@UiLabel("Beschreibung")@UiLargepublic String getDescription() {return this.description;}@UiComesAfter("name")@UiLabel("Codename")@Length(max=10,message="Der Codename darf maximal 10 Zeichen lang sein")public String getCodeName() {return codeName;}// Setter-Methoden}
<?xml version="1.0"?><inspection-result xmlns="http://metawidget.org/inspection-result"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://metawidget.org/inspection-resulthttp://metawidget.org/inspection-result-1.0.xsd "><entity type="de.javamagazin.mwd.Project"><property name="name" /><property name="codeName" /><property name="description" large="true"/></entity></inspection-result>















