Spring Web Projekte. Wer schon einmal an einem solchen teilgenommen hat, weiß dass die meiste Arbeit oft im Setup der Applikation steckt. Basis Konfigurationen und Standardeinstellungen verschlingen in Summe einiges an Zeit. Dann das Model zusammenschreiben und die passende Persistence Schicht realisieren. Alles Standard Tasks die erstmal viel Zeit kosten und auch immer eine Quelle für kleine, nervige Fehler sind.

Spring Roo greift genau an diesem Punkt an und unterstützt den Entwickler mit Code und Test Generation.Das Framework ist inzwischen in der Version 1.1.5 erschienen und macht einen stabilen Eindruck. Roo basiert auf verschiedenen Frameworks, Tools und APIs. Die Konsole ist dabei das zentrale Steuerelement von Roo. Alle Scripte und Befehle werden dort abgesetzt. Mit Roo ist es möglich eine komplette Web Applikation mit allen CRUD Operationen zu erstellen ohne auch nur eine Zeile Code schreiben zu müssen. Dabei wird auf Wunsch auch die grafische Oberfläche generiert. Bei der Erstellung der Applikation hat der Entwickler immer wieder die Wahl zwischen verschiedenen Realisierungen spezieller Systemkomponenten. Dabei kann er zum Beispiel zwischen verschiedenen ORM Frameworks oder verschiedenen Weboberflächen wählen.

Installation & First Steps

Um mit Roo endlich durchzustarten brauchen wir die aktuelle Version von Roo , Maven und die Springsource Tool Suite STS. Alles gemäß den Anleitungen entpacken und installieren. Dabei nicht vergessen MAVEN_HOME und ROO_HOME Umgebungsvariablen zu erstellen und in die Variable PATH mit aufzunehmen.

Als erstes öffnen wir eine Konsole und wechseln in unser Workspace Verzeichnis. Zum Beispiel unter C:/workspace. Dort erstellen wir ein Verzeichnis “mkdir adressbook” und wechseln in dieses “cd adressbook “. Jetzt einfach “roo” eingeben. Hat man alles richtig gemacht erscheint unübersehbar die Roo Konsole.

Mein erstes Roo Projekt

Unser erstes Projekt soll ein Adressbuch werden. Dabei soll der Benutzer Personen und Adressen eingeben können. Eine Person hat dabei eine oder mehrere Adressen. Eine Adresse kann dabei natürlich von mehreren Personen benutzt werden. Eine Adresse ist hat einen Typen der anzeigt ob eine Adresse Privat oder Geschäftlich ist.

Los gehts. Die Konsole ist wie vorher erwähnt in unserem neu erzeugten Ordner gestartet. Ein Roo Projekt erzeugen wir mit dem Befehl

project –topLevelPackage com.modularthinkin.adressbook

Damit wird ein leeres Project mit einer Maven POM Datei erzeugt. Enthalten sind im ersten Schritt die Standard Dependencies wie Roo, Spring, Logging Komponenten und einiges anderes. Am besten mal direkt einen kurzen Blick rein werfen.

Hinweis: Roo verfügt über eine sehr gute Auto-complition die mit Tab angesteuert wird. Falls ihr also mal nicht weiterwisst könnt ihr es entweder mit Tab probieren oder den Befehl „hint“ in die Konsole eingeben. Dieser gibt euch dann Tipps was als nächstes zu tun ist. Tippen wir nach dem ausführen des Project Befehls „hint“ ein bekommen wir den Hinweis, das es an der Zeit ist ein Persistence Schicht zu erzeugen.

Persistence

Dem Hinweis wollen wir dann natürlich auch folgen. Es gibt wie schon erwähnt bei der Persistence einige Möglichkeiten zur Auswahl. Dabei sind alle Datenbank Klassiker wie MySQL, Oracle, PostGres, Hypersonic und noch einige mehr. Darunter sind aber auch Cloud Lösungen wie GoogleAppEngine oder VMForce. Als Persistence Frameworks stehen DATANUCLEUS, DATANUCLEUS_2, ECLIPSELINK, HIBERNATE und OPENJPA zur Verfügung. Der Einfachheit halber nehmen wir folgende Konfiguration

persistence setup –database HYPERSONIC_IN_MEMORY –provider HIBERNATE

Als nächstes müssen wir unsere Applikation mal mit einem Domain Model füllen. Falls man es sich etwas einfach machen will, kopiert man die folgenden Zeilen in eine neue leere Datei und speichert diese als *.roo ab. Zum Beispiel als domainSetup.roo. Diese kann man dann mit dem Roo Script Befehl aufrufen.

script –file c:/workspace/adressbook/domainSetup.roo

Roo arbeitet darauf hin alle Befehle ab die enthalten sind. Für alle die sich gerne etwas mehr arbeit machen, viel Spaß auf der Konsole. Ich kann aber empfehlen das ganze einmal durchzuarbeiten und sich die Optionen der einzelnen Befehle anzuschauen. Alle abgesetzten Befehle werden aber auch in der Roo Logdatei im Projekt Verzeichnis gespeichert.

Hinweis: Als topLevelPackage haben wir beim erzeugen des Projektes com.modularthinkin.adressbook angegeben. Damit man dieses nicht immer ausschreiben muss kann man es mit ~ abkürzen.

entity –class ~.domain.Person
field string –fieldName name –notNull
field string –fieldName vorname –notNull
field date –fieldName geburtstag –type java.util.Date
field string –fieldName email –regexp [a-zA-Z0-9_-.]+@[a-zA-Z0-9.]+[a-zA-Z]{2,4}

enum type –class ~.domain.AdressType
enum constant –name BUSINESS –class ~.domain.AdressType
enum constant –name PRIVAT –class ~.domain.AdressType
 
entity –class ~.domain.Adresse
field string –fieldName strasse –notNull
field string –fieldName ort
field string –fieldName plz –notNull –regexp ^[0-9]{5}$
field number –fieldName hausnummer –type java.lang.Integer
field enum –fieldName adresstype –type ~.domain.AdressType –notNull
field set –fieldName personen –type ~.domain.Person –cardinality MANY_TO_MANY
 

Fertig. Damit haben wir alle Klassen in unserem com.modularthinkin.adressbook.domain Package erzeugt. Zusätzlich zum Datentyp kann man noch Informationen wie eine RegExp oder NotNull angeben.

Roo erzeugt zum einen Plain Java Objects. Diese enthalten erstmal nur die Attribute. Für jede Entity werden noch die folgenden Dateien erzeugt.

 
Datei
Inhalt
*_Roo_Configurable.aj
Ermöglicht „Spring-driven configuration“ über die Annotation @Configurable
*_Roo_Entity.aj
Persistence Schicht mit allen CRUD Methoden
*_Roo_JavaBean.aj
Getter und Setter
*_Roo_ToString.aj
toString Implementation
 

Man sollte selber mal einen Blick in die Einzelnen Dateien werfen um sich einen genauren Überblick zu schaffen. Man kann diese Klassen zwar editieren, mit dem nächsten Start von Roo werden die Änderungen aber kommentarlos überschrieben. Dazu aber später mehr.

GUI

 

Der nächste Schritt ist die GUI. Auch diese wird von Roo auf Wunsch generiert. Es stehen mit dem Spring MVC mit JSP und dem GoogleWebtoolKit zwei interessante Varianten standardmäßig zur Verfügung. Wir wollen hier die Varianten MVC ausprobieren.

Spring MVC GUI

Die Spring MVC Variante erzeugt uns eine Weboberfläche mit Menü und allen Operationen für unsere Domain. Dazu einfach die folgenden 2 Befehle eingeben.

web mvc setup

Erzeugt uns die benötigte Ordner Struktur in unserem Projekt und die komplette Basis Konfiguration mit web.xml und Spring Web MVC Config. Dazu kommen die Standard Tag Libraries sowie Bilder, Menüs und andere Standard Items der Weboberfläche die Roo mitliefert. Als nächstes folgendes eingeben.

 
controller all –package ~.web
 

Der controller Befehl erzeugt im Package com.modularthinkin.adressbook.web für jedes einzelne Domain Objekt einen Controller und im srcmainwebappWEB-INFviews Ordner entsprechenden JSP’s. Sobald das Script durchgelaufen ist, können wir einen ersten Start von Roo wagen. Wir verlassen die Roo Konsole mit einem „exit“. Jetzt starten wir den über Maven mitgelieferten Tomcat einfach mit dem Befehl mvn tomcat:run.

Sobald der Tomcat meldet, dass er gestartet ist und läuft finden wir unter http://localhost:8080/adressbook unsere Webapplikation.

Damit sind wir für das erste fertig und können Adressen und Personen anlegen. Alle Formulare werden validiert und entsprechende Abhängigkeiten erzeugt. Da wir auf einer In Memory Datenbank arbeiten, gehen die Daten nach jedem Neustart verloren. Also nicht wunder wenn immer alles wieder weg ist. Durch entsprechende Konfiguration kann man das aber auch anpassen, oder von Anfang an eine richtige Datenbank verwenden.

Eclipse Integration

Als nächstes wollen unsere Anwendung mit Hilfe von Eclipse anpassen. Dafür stoppen wir den Tomcat mit CTRL+C und starten mit dem Befehl roo wieder unsere Konsole. Dort geben wir den Befehl

perform eclipse

ein. Sobald alle benötigten Dependencies aufgelöst sind, können wir das Projet in unser STS importieren. Dazu einfach unter “File-> Import -> Existing Project into Workspace“ den Ordner auswählen und dann mit Finish bestätigen. Das Projekt wird geladen und wir sehen alle Klassen und die Web-Part der Applikation. Was noch fehlt sind die angesprochenen AspectJ Dateien. Dafür einfach folgendes Kontext Menü öffnen und unter “Filters” den Punkt “Hide generated Spring Roo ITDs” deaktivieren. Danach sollten die Dateien zu sehen sein.

Wenn wir jetzt zum Beispiel die von Roo Generierte toString Methode durch eine eigene ersetzen wollen, können wir die Methode durch einen Rechtsklick auf die Klasse -> Refractor -> PushIn in die Java Klasse verschieben. Dort können wir diese dann nach Belieben anpassen. Roo erkennt automatisch das diese Methode existiert und generiert keine neue. Löschen wir unsere toString Methode, wird von Roo beim nächsten Start automatisch wieder eine Neue erzeugt.

Next Steps

Als nächstes kann man seine Application mit Spring Security sichern oder mit Spring WebFlow eigene Webflows implementieren. Das alles geht out of the box mit Roo. Eine spannende Alternative zu Spring MVC bietet Vaadin. Auf der Homepage kann man ein entsprechendes Plugin reunterladen und damit eine grafische Oberfläche mit Vaadin erzeugen lassen. https://vaadin.com/springroo

Fazit

Roo macht Neugierig! Die Idee und die Umsetzung sind sehr gut gelungen und auch die Tool Integration ist gut umgesetzt. Mit Hilfe von Roo erzielen auch unerfahrene Entwickler schnelle Ergebnisse. Die Herausforderung kommt eigentlich mit den ersten Anforderungen, die das Framework selber nicht abdeckt und der Frage “Was hat mir Roo eigentlich generiert?”. Wie und wo setzte ich jetzt mit meinen Änderungen an. Wie bei allen Code Generatoren ist das die große Herausforderung. Ansonsten kann ich Roo nur empfehlen und freue mich auf weitere Plugins die den Funktionsumfang des Frameworks noch bereichern.

Tagged with:
 

3 Responses to Rapid Application Development mit Roo

  1. Thomas says:

    Danke für das gute Tutorial und Deine Einschätzung zu Roo.

    Planst Du in Zukunft noch weitere Tutorials, die über diesen “First Glance” hinausgehen?

    • Andreas says:

      Hi,

      danke! Ja wollte das angesprochene Thema Vaadin noch vertiefen. Habe gerade auch in einem Projekt Spring Webflow in ein Roo Projekt integriert. Auch ein sehr spannendes Thema.

      Gruß
      andreas

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

About The Author

andreas