Web Frameworks – JSF, Vaadin generativ anbinden an JPA

Dienstag, 27. Dezember 2011 von  
unter Fachartikel Architektur

Neulich fiel mir die Ausgabe des JavaMagazins vom Dezember 2010 in die Hände, wobei besonders der Artikel “JPA 2.0 – Objektpersistenz für Enterprise-Anwendungen“ von Dirk Weil meine gesamte Aufmerksamkeit auf sich zog. Die Anbindung an den Daten Provider der Wahl, wie z.B. JPA oder Implementierungen hiervon, z.B. Hibernate, ist nach der Auswahl des gewünschten Web Frameworks, wie z.B. JSF oder Vaadin, heutzutage denkbar einfach geworden, nicht zuletzt durch die vielfältige Tool Unterstützung. Über SeamGen gibt es schon einen sehr guten Blog-Eintrag in diesem Blog: http://www.binaris-informatik.de/?p=327 . Über SpringRoo wird in einem extra  Blog-Eintrag berichtet werden.

Nachdem die vorigen drei Blog-Einträge sich schwerpunktmäßig mit JPA befasst haben, soll dieser Blog-Eintrag von der generativen Anbindung von JPA DB Schnittstellen an verschiedene Web Frameworks handeln. Zielgruppe des Blog-Eintrags sind also Java Entwickler mit JSF oder Vaadin Kenntnissen, die bereits Erfahrungen mit JPA (und z.B. der zugehörigen Spring Unterstützung) haben, oder diese und ähnliche Erfahrung ergänzen möchten.

Den hierbei möglichen zusätzlichen Aufwand der Einführung eines zusätzlichen Data Facade Layers mit der zugehörigen Unit Testabdeckung zur Bereitstellung der für die Use Case Umsetzung erforderlichen C-R-U-D Operationen sollte man nicht scheuen, denn er rentiert sich, sobald die generierte DB Schnittstelle auch für beliebig auswechselbare Web Frameworks verwendet wird, also sowohl für ein JSF Frontend oder aber für eine Vaadin GUI.

Die Generierung der Entity Klassen – das Entity-Relationship-Diagramm

Von einem existierenden ER-Diagramm ausgehend können die Entity Klassen leicht mit dem open source Tool Object generation erzeugt werden, bevor sie im Generator, hier z.B. NetBeans 6.9.1, für die Erzeugung der benötigten DAOs und Controller Klasssen verwendet werden. NetBeans kann die Entities aus dem DB Schema aber auch direkt mitgenerieren. Betrachtet wird zunächst der häufigere Fall des existierenden E-R Diagramms (Entity-Relationship Diagramm). Hier ein Beispiel ER-Diagramm, welches nach Installation des Object generation PlugIns für Eclipse Indigo in der Hiber Objects Perspektive entworfen wurde und bei seiner Speicherung die resultierenden Entity Klassen generiert.


Es soll noch bemerkt werden, dass dieses Object generation Eclipse Design PlugIn auch noch mehr kann, wie z.B. für spezielle Anwendungsfälle Data Facade Klassen und auch Test-Klassen generieren, als auch über eine generierte HibernateUtil Klasse das resultierende DB Schema als SQL Output auszugeben. Dies nur für den Anwendungsfall, dass es keine Test DB gibt, man aber auch gerne auf eine existierende DB zugreifen möchte, anstatt exklusiv mit Mock Daten zu arbeiten.

Nun zur Generierung der weiteren DAOs, Controller und JSF Seiten. Es sollen bei den Erklärungen hierzu ausnahmsweise einfach Bilder für die zu beschreibenden Click-Pfade sprechen. Man benötigt zunächst irgendein JavaEE Projekt mit JPA Unterstützung, welches ebenfalls mittels NetBeans generiert wird. Hierzu ist der folgende Click-Pfad erforderlich: File/New Project/Samples/Java Web/JSF JPA CRUD (Java EE 5)/Next/Finish. Schon existiert ein voll funktionierendes JSF Projekt mit JPA Anbindung an die innerhalb von NetBeans sehr gut unterstützte lokale Derby DB (auch als In-memory DB erhältlich). Mit Wahl des Kontextmenü Eintrags Run auf dem Projekt kann das erzeugte Sample Projekt bei korrekter Installation des Sun/Oracle GlassFish J2EE Application Servers sofort auf dem GlassFish deployt und aufgerufen werden.

Wer sich nun das Beispiel Projekt näher besieht, um es als Template weiterzuverwenden, darf sich darüber freuen, was dieses von Haus aus schon alles mitbringt: siehe hierzu in der Projects View/Server Resources/sun-resources.xml die  jdbc-connection-pool Konfiguration, weiterhin die faces-config.xml, die persistence.xml und natürlich die web.xml, um der Servlet Engine zu ermöglichen das Faces Servlet zu laden und damit auch alle in der faces-config.xml aufgelisteten Bean Klassen und danach die JSF Applikation zu starten.

Die Generierung der DAOs

Die Weiterverwendung des Projekts zur Nutzung der eigenen DB bzw. der gewünschten Entities ist schnell erklärt. Zunächst entfernt man alle Sample Entities aus dem model Package und legt dort seine eigenen Entity Klassen an. Dann ist der folgende Click-Pfad erforderlich: Kontextmenü auf dem Projekt/New/Other/Persistence/JPA Controller Classes from Entity Classes/Next/Finish. Dadurch werden die JPA Controller zur Unterstützung der C-R-U-D Operationen generiert, welche auch als DAOs bezeichnet werden können. Nun noch die richtigen Entity Klassen mit ihren vollqualifizierten Klassennamen in die persistence.xml eintragen, damit diese vom Persistenz Provider JPA oder Hibernate auch gefunden werden.

Die Generierung der JSF Seiten

Die im Sample Projekt bereits vorher vorhandenen JPA Controller können also entfernt werden, da stattdessen nun die neu generierten JPA DAOs existieren. Das Package und die neu generierten JpaController sollten sinnvollerweise das Suffix Dao anstelle von Controller erhalten. Auch die neuen JSF Seiten sind per Click-Pfad aus den Entities generierbar: Kontextmenü/New/Other/JavaServer Faces/JSF Pages from Entity Classes/Next/Finish. Oder es können die bereits vorhandenen JSF Seiten zur Vorlage verwendet werden und entsprechend angepaßt werden bzw. mittels diesem Click-Pfad auch ganz neue JSF Seiten, JSF Managed Beans, JSF Composite Components oder Facelets Templates erstellt werden. Die JSF Applikation kann auf dem lokalen GlassFish gestartet werden und ist dann z.B. unter dem folgenden Pfad aufrufbar: http://localhost:45974/JsfJpaCrud/

Hier noch ein Diagramm zum JSF Lifecycle und auch detailliertere Informationen zum JSF Lifecycle.

Die Wiederverwendung der DAOs und Tests für die Vaadin Applikation

Wie sieht es nun mit der Wiederverwendbarkeit der generierten JPA Anbindung des Projekts und seiner Unit Tests bzw. eines vergleichbaren Projekts für eine Vaadin Applikation aus. Das Basisprojekt mit den Entities und den JpaControllern bzw. DAOs läßt sich genauso für Vaadin verwenden.

Was sich ändert, sind hauptsächlich die XML Konfigurationen für das Vaadin Projekt und natürlich der zusätzliche Code für die erforderliche Vaadin GUI. Also wird eine andere web.xml benötigt mit der entsprechenden Deklaration des  com.vaadin.terminal.gwt.server.ApplicationServlet, damit die Servlet Engine diesmal das ApplicationServlet der GWT Engine laden kann, denn nichts anderes ist Vaadin ja, eine Library mit vielen häufig benötigten Funktionalitäten unter Verwendung von GWT. Für die persistence.xml gibt es ebenfalls verschiedene Möglichkeiten, je nachdem, ob RESOURCE LOCAL Transaktionen verwendet werden oder eine JTA Implementierung des Persistenz Providers verwendet wird. Hier ein paar Erläuterungen dazu und hier das Beispiel für die web.xml. Die Basiskomponente der Vaadin Applikation leitet also von com.vaadin.Application ab und überschreibt üblicherweise die init Methode dieser Basisklasse, um eine erste Komponente aufzurufen, die zweckmäßigerweise wiederum von irgendeinem Layout, z.B. GridLayout, VerticalLayout oder HorizontalLayout ableitet. Nun können aus den vorhandenen Vaadin Komponenten die gewünschten ausgesucht und z.B. mit eigenen Komponenten gemäß dem Composite View Design Pattern zu dem erforderlichen User Interface kombiniert werden. Eine Vielzahl von Beispielen gibt es im frei verfügbaren Paket sampler.war, welcher zum Download hier verfügbar ist und sich einfach, z.B. auf einem lokal installierten apache-tomcat-6.0.32 deployen und z.B. unter http://localhost:8080/sampler/ aufrufen läßt, sobald der Tomcat JEE Server gestartet wurde. Oder einfach im Vaadin SVN Repository, welches sich mittels Subversion PlugIn auch z.B. innerhalb von Eclipse Indigo auschecken läßt, hier die Url: http://dev.vaadin.com/svn/

Hier die Projektstruktur der Vaadin Beispiel-Applikation mit EclipseLink als JPA Provider:

 

Und hier noch die von NetBeans generierte build.xml und die build-impl.xml mit allen benötigten Ant Tasks.

Die Generierung einer Vaadin JPAContainer Applikation mit Maven

Zu guter Letzt soll auch der Maven Archetype zur Generierung eines Maven Projekts mit JPA Anbindung mittels Vaadin JPA Container erwähnt werden, der jedoch lizenzabhängig ist, somit auf Dauer nicht kostenfrei bleibt. Der Click-Pfad hierzu lautet z.B. im Eclipse Indigo in der Java EE Perspektive: Kontextmenü/New/Other/Maven/Maven Project/Next/Next/vaadin-archetype-jpacontainer/Next/… Hier die erzeugte pom.xml und hier der entsprechende Screenshot:

Alle interessierenden Beispiele, Diagramme, Konfigurationen dieses Blog-Eintrags finden sich hier.

Als sehr empfehlenswertes Einsteigerbuch darf noch das Buch „Java EE Development using GlassFish Application Server“ von David R. Heffelfinger aus dem PACKT PUBLISHING Verlag genannt werden.

Allen interessierten Leserinnen und Lesern einen angenehmen Jahreswechsel und einen guten Start ins Jahr 2012.

 

Kommentare

12 Kommentare zu “Web Frameworks – JSF, Vaadin generativ anbinden an JPA”

  1. Von Web Frameworks – GWT Apps an Hibernate anbinden : binaris informatik GmbH am Montag, 20. Februar 2012 15:03

    […] zu persistieren, muß die HSQL DB, die per default auch beim Einsatz des bereits einmal in einem anderen Blog-Eintrag erwähnten Hiber Objects Eclipse PlugIns verwendet wird, gestartet sein und der sich im […]

  2. Von Eclipse RCP – EMF und Eclipse Modeling Project : binaris informatik GmbH am Sonntag, 28. Oktober 2012 20:03

    […] mittels Domain-spezifischer Models und einer DSL, sowie mittels generativen Techniken. Hierüber gibt es bereits einen Blog-Eintrag in diesem Blog (“Web Frameworks – JSF, Vaadin generativ anbinden an JPA“). Andererseits der […]

  3. Von Eclipse RCP – Datenbank Viewer mit Swing, JPA : binaris informatik GmbH am Freitag, 30. November 2012 17:38

    […] dazu in diesem Blog bereits mehrere Artikel bzw. Blog-Einträge, z.B. hier, hier, hier, und hier, weshalb hier nur auf das sehr gute “Pro JPA 2“-Buch aus dem apress-Verlag verwiesen werden […]

  4. Von Services – mit Hibernate 4, Vaadin 6, JBoss 7 : binaris informatik GmbH am Freitag, 28. Februar 2014 22:06

    […] handelt es sich dabei um Hibernate 4.x.x auf dem JBoss 7 (Brontes). Da es bereits einen Blog-Eintrag über eine Vaadin-Beispiel-App auf dem GlassFish Application Server in diesem Blog gibt, welche mit NetBeans entwickelt wurde, soll in diesem Blog-Eintrag mit dem […]

  5. Von WebApps – mit JSF 2.2, Primefaces 5, REST, JPA 2, JEE7, JBoss WildFly 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 28. Februar 2016 19:32

    […] hier erklärt wird. Über die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  6. Von WebApps – Migration JSF 2.2 MyFaces, RichFaces zu Primefaces, REST, JPA 2, JEE7 auf JBoss WildFly 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 27. März 2016 22:56

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  7. Von WebApps – Migration mit JSF 2.2 Primefaces, REST, JPA 2, JEE7 auf JBoss WildFly 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 1. Mai 2016 11:56

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  8. Von WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2, JBoss WildFly 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 29. Mai 2016 16:54

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  9. Von WebApps – mit JPA 2, JSF 2.2, Primefaces 6, REST, JEE7, Java 8 auf JBoss WildFly 9 und WildFly 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 25. September 2016 22:32

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  10. Von WebApps – mit JSF 2, Primefaces 6, REST, JPA 2, EJB 3, JEE7, Java 8 auf JBoss WildFly : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Sonntag, 27. November 2016 18:30

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  11. Von WebApps – mit JSF 2, RichFaces 4, Primefaces 6, REST, JPA 2, EJB 3, JEE7, JBoss WildFly : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Samstag, 28. Januar 2017 12:17

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

  12. Von WebApps – Primefaces 6, FileUploads, JSF 2, JPA 2, EJB 3, JEE7, REST, AngularJS, WildFly : Karriere als Software Entwickler | binaris informatik GmbH am Mittwoch, 22. Februar 2017 16:03

    […] die JSF Technologie gibt es bereits einen Blog-Eintrag in diesem Blog hier, worin die Generierung einer JSF 1.2-Applikation auf Basis der JPA-Entities für den JPA-Provider […]

Einen Kommentar hinzufügen...

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