Apps generieren – mit Spring Roo und AspectJ

Sonntag, 27. Januar 2013 von  
unter Fachartikel Architektur

Seit knapp drei Dekaden machen sich Forscher, Entwickler und nahezu alle Projektbeteiligen eines Software-Projekts immer wieder Gedanken über die Generierung von Quellcode, oder bevorzugt gar ganzer Projekte aus verschiedenen Eingaben, aus Objektmodellen, oder mit Hilfe von Wizards unter Verwendung bewährter Entwurfsmuster (“Design Patterns“), z. B. innerhalb einer Integrierten Entwicklungsumgebung (IDE). Spring bietet für alle Spring Versionen mit Spring Roo eine ausgereifte Lösung an, weshalb es in diesem Blog-Eintrag anhand eines kleinen Beispiels und einiger Beispiel-Klassen kurz vorgestellt werden soll. Zielgruppe des Artikels sind also Java Entwickler mit Spring Kenntnissen, die bereits Erfahrungen mit Spring und Spring Roo haben, oder diese und ähnliche Erfahrung ergänzen möchten.

Spring Roo ist ein erweiterbares, text-basiertes “Rapid Application Development“ (RAD) Tool für Java und generiert unter Verwendung von AspectJ, Spring Roo PlugIns, z. B. für die Springsource ToolSuite (STS), für Eclipse und andere Derivate in wenigen Sekunden in seiner Roo Shell komplette Java/JEE-Projekte, die danach, z.B. mittels Maven Build compiliert und gebaut werden können. Hierbei gibt es Unterstützung durch Commands wie “hint“, “help“, und Tasten-Kombinationen wie Strg-Leertaste in der Roo Shell. Die Infrastruktur und Anbindung von Roo kann schematisch dargestellt werden.

Spring Roo integriert sich daher problemlos mit folgenden erfolgreich etablierten Open Source Technologien:

• Java
• Spring Framework
• Java Persistence API und Hibernate
• Java Server Pages
• Spring Security
• Spring MVC, Spring Web Flow, Vaadin
• Log4J, Maven, AspectJ, Eclipse/STS

Roo kann als hybrider Code Generator bezeichnet werden unter Verwendung der Vorteile passiver und aktiver Generierungsmodelle unter Verwendung von Use Case-spezifischen Design Entscheidungen. Hierbei können passiv mit der Roo Shell entweder einmalig Quellcode-Dateien, wie XML oder .java-Dateien generiert werden (diese werden nicht mehr aktualisiert, sondern müssen stets neu generiert werden), oder aktiv die generierten bzw. mit @Roo… annotierten Sourcecode-Dateien (z. B. .aj, .jsp) inkrementell aktualisiert werden. Die aktive Code-Generierung der AspectJ (.aj) Dateien kann auch schematisch dargestellt werden.

Die .aj Dateien sollten nicht editiert werden, da sie komplett unter der Kontrolle von Spring Roo stehen und manuelle Änderungen bei jedem inkrementellen Update überschrieben werden. Der Code in den .aj – Dateien, welcher beibehalten werden soll, kann mit Hilfe eines Refactorings, z.B. innerhalb der IDE in .java Dateien verlagert werden, welche ja bekanntlich von Spring Roo nach der Generierung nicht mehr modifiziert werden.

Beispielprojekt

Der Einstieg in die Arbeit mit dem auf AspectJ basierenden Spring Roo wird in diesem Artikel anhand der mit einer der @Roo… Annotationen annotierten Beispiel-Klassen, die in der Roo Shell durch Eingabe spezieller Commands generiert wurden, veranschaulicht. Die Beispiele sind aus einfachen Entities einer bereits entworfenen Anwendung, welche z.B. als Java Web App läuft, nach dem Bottom Up-Prinzip von der Datenbankschicht zum User Interface (UI) mittels Spring Roo generiert worden. Für das Erstellen des Beispielprojekts wurden die folgenden Pakete und Komponenten verwendet: Es wurde als flexible Entwicklungsumgebung die Spring Source Tool Suite 2.6.0. SR1 in der JEE 64bit Version [Download von: http://www.springsource.com/downloads/sts], weiterhin als Buildsystem Maven mindestens in der Version 2.2.1 verwendet. Es darf dabei nochmals bemerkt werden, dass der Spring Roo Generator selbst kein Maven benötigt.

Erste Schritte

Ein Projekt als Beispielapplikation kann schnell mittels Dashboard (Spring Roo Project), z.B. mit dem Namen “TestRoo” per Klick auf „Roo Project“ angelegt werden. Oder in der IDE über den Klick-Pfad File/New/Roo Project.


Nach erfolgreichem Anlegen befindet sich innerhalb des Workspaces dann ein konfigurierbares und ausführbares Projekt mit den erforderlichen Maven Dependencies.

Erklärungen zum Thema Installation und Setup von Spring Roo finden sich z.B. auch auf der Projektseite von Spring Roo. Es darf an dieser Stelle noch erwähnt werden, dass Spring Roo auch ganz ohne IDE funktioniert, also direkt auf der Kommandozeile durch Eingabe der entsprechenden Commands komplette Projekte generiert.

Die folgenden Commands wurden in der Roo Shell eingegeben, um den entspechenden Sourcecode zu generieren. Dabei erhält man prinzipiell die folgenden, zusätzlich angegebenen Ausgaben:

roo> hint

Roo requires the installation of a JPA provider and associated database.

Type ‚persistence setup‘ and then hit CTRL+SPACE three times.

We suggest you type ‚H‘ then CTRL+SPACE to complete „HIBERNATE“.

After the –provider, press CTRL+SPACE twice for database choices.

For testing purposes, type (or CTRL+SPACE) HYPERSONIC_IN_MEMORY.

If you press CTRL+SPACE again, you’ll see there are no more options.

As such, you’re ready to press ENTER to execute the command.

Once JPA is installed, type ‚hint‘ and ENTER for the next suggestion.

// Setup JPA persistence using EclipseLink and H2

roo> persistence setup –provider ECLIPSELINK –database H2_IN_MEMORY

Created SRC_MAIN_RESOURCES\META-INF\persistence.xml

Created SRC_MAIN_RESOURCES\META-INF\spring\database.properties

Managed SRC_MAIN_RESOURCES\META-INF\spring\applicationContext.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

roo>

// Create domain entities

entity –class ~.domain.Base –activeRecord false –testAutomatically

Created SRC_MAIN_JAVA\de\binaris\domain

Created SRC_MAIN_JAVA\de\binaris\domain\Base.java

Created SRC_TEST_JAVA\de\binaris\domain

Created SRC_TEST_JAVA\de\binaris\domain\BaseDataOnDemand.java

Created SRC_TEST_JAVA\de\binaris\domain\BaseIntegrationTest.java

Created SRC_MAIN_JAVA\de\binaris\domain\Base_Roo_Entity.aj

Created SRC_MAIN_JAVA\de\binaris\domain\Base_Roo_ToString.aj

Created SRC_MAIN_JAVA\de\binaris\domain\Base_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\BaseDataOnDemand_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\BaseDataOnDemand_Roo_DataOnDemand.aj

Created SRC_TEST_JAVA\de\binaris\domain\BaseIntegrationTest_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\BaseIntegrationTest_Roo_IntegrationTest.aj

~.domain.Base roo>

field string –fieldName name –sizeMin 2 –notNull

Managed SRC_MAIN_JAVA\de\binaris\domain\Base.java

Created SRC_MAIN_JAVA\de\binaris\domain\Base_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\Base_Roo_ToString.aj

Managed SRC_TEST_JAVA\de\binaris\domain\BaseDataOnDemand_Roo_DataOnDemand.aj

~.domain.Base roo>

entity –class ~.domain.Topping –activeRecord false –testAutomatically

Created SRC_MAIN_JAVA\de\binaris\domain\Topping.java

Created SRC_TEST_JAVA\de\binaris\domain\ToppingDataOnDemand.java

Created SRC_TEST_JAVA\de\binaris\domain\ToppingIntegrationTest.java

Created SRC_MAIN_JAVA\de\binaris\domain\Topping_Roo_Entity.aj

Created SRC_MAIN_JAVA\de\binaris\domain\Topping_Roo_ToString.aj

Created SRC_MAIN_JAVA\de\binaris\domain\Topping_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\ToppingIntegrationTest_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\ToppingDataOnDemand_Roo_DataOnDemand.aj

Created SRC_TEST_JAVA\de\binaris\domain\ToppingIntegrationTest_Roo_IntegrationTest.aj

Created SRC_TEST_JAVA\de\binaris\domain\ToppingDataOnDemand_Roo_Configurable.aj

~.domain.Topping roo>

field string –fieldName name –sizeMin 2 –notNull

Managed SRC_MAIN_JAVA\de\binaris\domain\Topping.java

Created SRC_MAIN_JAVA\de\binaris\domain\Topping_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\Topping_Roo_ToString.aj

Managed SRC_TEST_JAVA\de\binaris\domain\ToppingDataOnDemand_Roo_DataOnDemand.aj

~.domain.Topping roo>

entity –class ~.domain.Pizza –activeRecord false –testAutomatically

Created SRC_MAIN_JAVA\de\binaris\domain\Pizza.java

Created SRC_TEST_JAVA\de\binaris\domain\PizzaDataOnDemand.java

Created SRC_TEST_JAVA\de\binaris\domain\PizzaIntegrationTest.java

Created SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_Entity.aj

Created SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_ToString.aj

Created SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaDataOnDemand_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaDataOnDemand_Roo_DataOnDemand.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaIntegrationTest_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaIntegrationTest_Roo_IntegrationTest.aj

~.domain.Pizza roo>

field string –fieldName name –notNull –sizeMin 2

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza.java

Created SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_ToString.aj

Managed SRC_TEST_JAVA\de\binaris\domain\PizzaDataOnDemand_Roo_DataOnDemand.aj

~.domain.Pizza roo>

field number –fieldName price –type java.math.BigDecimal

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza.java

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_ToString.aj

Managed SRC_TEST_JAVA\de\binaris\domain\PizzaDataOnDemand_Roo_DataOnDemand.aj

~.domain.Pizza roo>

field set –fieldName toppings –type ~.domain.Topping

You must specify option ‚element‘ for this command

~.domain.Pizza roo>

field reference –fieldName base –type ~.domain.Base

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza.java

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\Pizza_Roo_ToString.aj

~.domain.Pizza roo>

entity –class ~.domain.PizzaOrder –testAutomatically –activeRecord false

Created SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder.java

Created SRC_TEST_JAVA\de\binaris\domain\PizzaOrderDataOnDemand.java

Created SRC_TEST_JAVA\de\binaris\domain\PizzaOrderIntegrationTest.java

Created SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_Entity.aj

Created SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_ToString.aj

Created SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaOrderDataOnDemand_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaOrderDataOnDemand_Roo_DataOnDemand.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaOrderIntegrationTest_Roo_Configurable.aj

Created SRC_TEST_JAVA\de\binaris\domain\PizzaOrderIntegrationTest_Roo_IntegrationTest.aj

~.domain.PizzaOrder roo>

field string –fieldName name –notNull –sizeMin 2

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder.java

Created SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_ToString.aj

Managed SRC_TEST_JAVA\de\binaris\domain\PizzaOrderDataOnDemand_Roo_DataOnDemand.aj

~.domain.PizzaOrder roo>

field string –fieldName address –sizeMax 30

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder.java

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_ToString.aj

~.domain.PizzaOrder roo>

field number –fieldName total –type java.math.BigDecimal

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder.java

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_ToString.aj

Managed SRC_TEST_JAVA\de\binaris\domain\PizzaOrderDataOnDemand_Roo_DataOnDemand.aj

~.domain.PizzaOrder roo>

field date –fieldName deliveryDate –type java.util.Date

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder.java

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_JavaBean.aj

Managed SRC_MAIN_JAVA\de\binaris\domain\PizzaOrder_Roo_ToString.aj

~.domain.PizzaOrder roo>

~.domain.PizzaOrder roo>

field set –fieldName pizzas –type ~.domain.Pizza

You must specify option ‚element‘ for this command

// manually add long id and default serialVersionUID afterwards

entity –class ~.domain.PizzaOrderPk –activeRecord false

field string –fieldName shopCountry –class ~.domain.PizzaOrderPk

field string –fieldName shopCity

field string –fieldName shopName

~.domain.PizzaOrderPk roo>

controller all –package ~.web

Created SRC_MAIN_JAVA\de\binaris\web\ToppingController.java

Managed SRC_MAIN_WEBAPP\WEB-INF\web.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Managed ROOT\pom.xml

Created SRC_MAIN_JAVA\de\binaris\web\PizzaOrderController.java

Managed SRC_MAIN_WEBAPP\WEB-INF\web.xml

Managed ROOT\pom.xml

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx

Created SRC_MAIN_JAVA\de\binaris\web\ToppingController_Roo_Controller.aj

Created SRC_MAIN_WEBAPP\WEB-INF\views\topping

Created SRC_MAIN_WEBAPP\WEB-INF\views\topping\list.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\topping\show.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\topping\create.jspx

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\topping\update.jspx

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\topping\views.xml

Created SRC_MAIN_JAVA\de\binaris\web\PizzaOrderController_Roo_Controller.aj

Created SRC_MAIN_WEBAPP\WEB-INF\views\pizzaorder

Created SRC_MAIN_WEBAPP\WEB-INF\views\pizzaorder\list.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\pizzaorder\show.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\pizzaorder\create.jspx

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\pizzaorder\update.jspx

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx

Created SRC_MAIN_WEBAPP\WEB-INF\views\pizzaorder\views.xml

Created SRC_MAIN_JAVA\de\binaris\web\PizzaOrderPkController_Roo_Controller.aj

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\i18n\application.properties

Managed SRC_MAIN_WEBAPP\WEB-INF\views\menu.jspx

~.web roo>

Daraus erhält man das TestRoo-Projekt mit den generierten Spring MVC-Controllern und entsprechenden .jspx Views. Dieses Projekt kann auch leicht mittels Spring WebFlow (einem Struts-ähnlichen Spring-Framework) und .xhtml-Views erweitert werden. Hierüber gibt es bereits einen Beitrag in diesem Blog.

Natürlich gibt es für moderne Javascript-generierende Frameworks, wie z. B. das auf dem GWT basierende Vaadin (eine Untermenge von GWT), auch entsprechende Spring Roo PlugIns, sowie die erforderliche Roo- und Maven-Unterstützung. Hierbei sollte jedoch auf die Verwendung einer Spring Roo Version von mindestens der Spring Roo Version 1.1.5 geachtet werden, ab der die Vaadin-Unterstützung funktioniert. Über die generative Anbindung von Vaadin an ein JPA-Backend gibt es hier bereits einen Eintrag in diesem Blog. Weitere Informationen über die Verwendung von Vaadin mit Spring Roo gibt es hier und im Kapitel 14 im „Book of Vaadin“ (für Vaadin 6).

Hier ein Screenshot zur Maven-Unterstützung für Vaadin:

Auch für GWT gibt es seit der Version Spring Roo 1.1.0 entsprechende Unterstützung. Über die Anbindung von GWT Apps an Hibernate gibt es bereits einen Artikel in diesem Blog.

Einige .roo Eingabe-Dateien der Beispiele gibt es auch immer in der jeweiligen Spring Roo Distribution, z. B.:

– pizzashop.roo
– vote.roo
– wedding.roo
– bikeshop.roo
– clinic.roo
– expenses.roo (GWT-Beispiel)

Hier einmal alle verfügbaren Spring Roo Commands der Version Spring Roo 1.2.3.

Obwohl Spring Roo keine andere Roo-Runtime mitbringt oder benötigt als die JVM, möchten vielleicht einige Leute hinterher die .aj-Dateien im Speziellen oder sogar Spring Roo im Allgemeinen aus dem generierten Projekt wieder entfernen, ohne die Funktionalität des erstellten Projekts zu mindern. Auch hierfür bietet Spring Roo einen simplen Lösungsansatz in wenigen Schritten:

– Verwendung des AJDT-Refactorings, um die Roo .aj Dateien in .java Dateien zu konvertieren
– Entfernen der Roo-Annotationen-Jar Datei aus dem Maven Build (pom.xml)
– Entfernen der @Roo…- Annotationen aus den .java Dateien

Allerdings gibt es einige sehr vernünftige Argumente, um Spring Roo, nach einem erfolgreich generierten Projekt nicht sofort wieder zu entfernen:

– Inkrementelles schnelles Neu-Generieren des gesamten Projekts mit Spring Roo in wenigen Sekunden, selbst bei gravierenden Änderungen am Datenbank-Modell

– Kein manuelles Nachziehen von Änderungen an den generierten Klassen durch alle Schichten hindurch mehr erforderlich, selbst wenn häufig verwendete Klassen geändert werden müssen

– Schneller Support und Antworten auf Fragen in den Springsource.com-Foren durch eine aktive, lebendige Open Source Community und bei Stackoverflow bzw. auf stackoverflow.com.

Hier dafür noch die Spring Roo Links zu

Forum: http://forum.springsource.org und

JIRA: http://jira.springframework.org/browse/ROO

Fazit: Spring Roo ist ein, wie von springsource.com gewohnt, effektives, sehr professionelles, modernes  Code-Generierungs- und Refaktorisierungs-Werkzeug zur Erstellung beliebiger Java/JEE-Applikationen im Rahmen des Rapid Application Development, z.B. mit Anbindung an JPA-implementierende Persistenz Layer (mit JPA, Hibernate, oder EclipseLink), welches sich hervorragend in bestehende Software-Systemarchitekturen integriert.

Als Standard-Buch zum Thema Spring Roo und den Möglichkeiten, die Spring Roo wirklich bietet, empfiehlt sich weiterhin das folgende Standardwerk “Spring Roo in Action“: http://www.manning.com/rimple.

Weitere empfehlenswerte Bücher sind das Buch von Eberhard Wolff mit dem Titel “Spring 3″aus dem dpunkt Verlag, das Buch “SPRING im Einsatz” von Craig Walls aus dem HANSER Verlag, sowie das Buch “springframework 2″ aus dem WROX Verlag, um nur einige zu nennen.

Über Spring AOP und AspectJ gibt es hier bereits einen Artikel in diesem Blog.

Dieser Artikel hat als Quelle das offiziell, frei verfügbaren Quick Time Movie “Spring Roo in 5 Minuten” sowie die Spring Roo Online Dokumentation und Informationen aus den genannten Büchern als auch eigene Erfahrungen mit Spring Roo , dem Spring Framework, mit AspectJ, Eclipse, der Springsource Tool Suite und Maven zur Grundlage.

Allen interessierten Leserinnen und Lesern noch einen schönen Rosenmontag, einen fröhlichen Veilchendienstag, sowie eine angenehme und verantwortungsvolle Karnevals-Session.

Kommentare

Ein Kommentar zu “Apps generieren – mit Spring Roo und AspectJ”

  1. Von Web Frameworks – Selbstdefinierte Tags mit Spring Roo : binaris informatik GmbH am Montag, 4. Februar 2013 21:45

    […] Wie beschrieben, verwendet Spring Roo die .jspx – XML-konformen JSP Dateien und, um deren Code möglichst übersichtlich zu gestalten, wiederverwendbare, selbstgenerierte .tagx Dateien als Tags. Hier als Beispiel die mit Spring Roo generierten .tagx Dateien im WEB-INF Verzeichnis und deren aufrufende .jspx Document Dateien, welche im Document Header die richtigen Namespaces includieren. Spring Roo wird allerdings in einem eigenen Blog Eintrag besprochen. […]

Einen Kommentar hinzufügen...

Sie müssen registriert und angemeldet sein um einen Kommentar zu schreiben.