WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2, JBoss WildFly 10

Sonntag, 29. Mai 2016 von  
unter Fachartikel Architektur

Die Motivation

Im vorigen Blog-Eintrag hier wurde die Migration der Beispiel-Applikationen MyFaces JSF 2.2 Beispiel-Applikation greetingcardsadmin auf die sehr vorteilhafte Primefaces-Technologie beschrieben. In diesem Blog-Eintrag soll nun einmal beschrieben werden, wie leicht es ist, mit dem Datenmodell eine Beispiel-Webapplikation zu erstellen. Dabei werden als Basis-Frontendtechnologien JSF 2.2, Angular JS und Primefaces verwendet.

Ü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 EclipseLink mittels der NetBeans IDE für das Deployment auf dem GlassFish 3 Application Server erklärt wurde. Die in diesem Blog-Eintrag hier mittels JBoss Forge Eclipse PlugIn erstellte Applikation greetingcardsadmin wurde bereits zur Primefaces-Applikation greetingcardsadmin-primefaces migriert und unterstützt den Einsatz der robusten, aber stets elegant gestylten, etablierten, optimalen Primefaces Frontend-Technologie.

Die Beispiel-Applikation greetingcardsadmin-primefaces wurde dann auf dem neusten JBoss WildFly 10 Final deployt. Dabei ist die Verwendung der beiden neuen JBoss WildFly JEE7-Application Server in diesem Blog-Eintrag hier bereits beschrieben worden. Hatten die MyFaces-Beispiel-Applikationen noch extra Suchfelder und Schwächen bei der Sortierung der Ergebnislisten, so bieten nach der Umstellung die Primefaces-Views das Durchsuchen, Sortieren und eine wählbare Pagination der Ergebnisliste bereits als Komfortfunktionen der Standard Primefaces-Funktionalitäten an.

Erstellung der Beispiel Applikation aus dem Datenmodell

Hier das mittels Eclipse-PlugIn Umlet erstellte UML-Diagramm der Entities und Datenbank-Objekte:
 
Entity-Relationship Diagramm Recipe AdminWie die Applikationen recipeadmin und recipeadmin-angularjs mittels JBoss Forge erstellt werden können, ist bereits analog in diesem Blog-Eintrag hier für die Applikationen greetingcardsadmin und greetingcardsadmin-angularjs beschrieben worden, und wie in der pom.xml des jeweiligen Beispielprojekts nach erfolgtem Download erkennbar ist, wurden auch in den Applikationen recipeadmin, recipeadmin-primefaces und recipeadmin-angularjs die folgenden JEE 7 Artefakte für den JBoss WildFly identifiziert, verwendet und importiert:

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

WildFly JBoss Java EE 7 Specification APIs with Tools:
– jboss-javaee-7.0-with-tools
WildFly JBoss Java EE 7 Specification APIs with Resteasy:
– jboss-javaee-7.0-with-resteasy
WildFly JBoss Java EE 7 Specification APIs with Hibernate:
– jboss-javaee-7.0-with-hibernate

Weiterhin werden die folgenden JEE Dependencies (für das Servlet API, Annotationen, JAX-RS Implementierungen, JBoss RESTEasy, Jackson, Hibernate, JPA und EJB) verwendet:

– jboss-annotations-api_1.1_spec
– jboss-jaxrs-api_2.0_spec
– resteasy-jackson2-provider

– hibernate-jpa-2.1-api
– jboss-ejb-api_3.2_spec
– hibernate-jpamodelgen
– jboss-servlet-api_3.1_spec

Einsatz von CDI

Und ebenfalls die CDI 1.1 Dependency:

– cdi-api_1.1

Über CDI und JavaEE gibt es bereits Blog-Einträge in diesem Blog hier und hier. Die Aktivierung von CDI erfolgt, wie beschrieben, mittels beans.xml im WEB-INF Verzeichnis.

Auch über die Architektur und verwendeten Design Patterns der Beispiel-Applikationen gibt es bereits Informationen in einem Blog-Eintrag hier und bereits vorausgegangenen Blog-Einträgen.

Primefaces:

Hat man erst einmal die JPA 2.2 Entities definiert und mittels JBoss Forge die Beispiel-Webapplikationen für die ausgewählte Frontend-Technologie (Angular JS oder Faces) erzeugt und rebrandet, ist die Migration der Faces Beispiel-Applikation leicht durchführbar und wurde bereits im vorigen Blog-Eintrag hier beschrieben.

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-5.2.jar erfolgt dabei ganz simpel übers Hinzufügen der entsprechenden Maven Primefaces Dependency in der pom.xml.

    <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>primefaces</artifactId>
      <version>5.2</version>
    </dependency>

Allein durch Änderung dieses Eintrags in der pom.xml kann jederzeit auch auf die gewünschte Primefaces-Version umgestellt werden. Bei der Umstellung der ca. 30 XHTML-Views von MyFaces auf Primefaces sind der Primefaces Showcase und der Primefaces Users Guide (PDF) sehr hilfreich. Der größte Aufwand der Migration besteht hierbei im Austausch der Standard MyFaces-Tags (h: Präfix) durch die Primefaces-Tags (p: Präfix) ist also für die simplen Beispiel-Applikationen leicht umsetzbar. Ebenfalls wurde das sehr gute bei DZone erhältliche PDF zur JSTL (Java Server Pages Template Library) verwendet und zwei weitere Dokumente über genauere Details zum JSF 2-Lifecycle, die sich hier und hier zum Download finden.

Aktiviert werden die Primefaces-Tags in der gewünschten XHTML-Seite mittels folgendem Eintrag im Dokumenten-Kopf der XHTML-View xmlns:p=“http://primefaces.org/ui und die zusätzliche Funktionalität der JSTL-Tags wird entsprechend, wie in den MyFaces-Views auch, per xmlns:c=“http://java.sun.com/jsp/jstl/core verfügbar gemacht.

Durch die Verwendung von CDI 1.1 haben die JSF ManagedBeans stattdessen die Annotation @Named und bleiben, bis auf ein paar Helper-Methoden zur Ausgabeformatierung, nahezu identisch zu den ManagedBeans der MyFaces-Applikation recipeadmin. Weitere Informationen zu JSF 2.2, CDI und Primefaces finden sich auch hier im Blog von Balus C.

forge.taglib.xml:

Die in den Beispiel-Applikationen verwendete, moderne Forge TagLib kann sehr einfach erweitert werden, indem eine zusätzlich benötigte Methode in der ViewUtils-Klasse ergänzt wird und deren Signatur in der forge.taglib.xml im Verzeichnis src/main/webapp/WEB-INF/classes/META-INF/ bekanntgemacht wird. Die TagLib wird in der entsprechenden .xhtml-View über den Eintrag xmlns:forgeview=“http://jboss.org/forge/view“ mit dem Prefix forgeview unter der DOCTYPE-Definition im ui:composition eingebunden und mittels forgeview-Prefix per Expression Language (EL) an der gewünschten Stelle mit den richtigen Input-Parametern aufgerufen. Hier die forge.taglib.xml für die Beispiel-Applikationen recipeadmin-primefaces und recipeadmin:

<?xml version=„1.0“ encoding=„UTF-8“?>
<!DOCTYPE facelet-taglib PUBLIC „-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN“ „http://java.sun.com/dtd/facelet-taglib_1_0.dtd“>
<facelet-taglib xmlns=„http://java.sun.com/JSF/Facelet“>
   <namespace>http://jboss.org/forge/view</namespace>
   <function>
               <function-name>asList</function-name>
               <function-class>de.binaris.recipeadmin.view.ViewUtils</function-class>
               <function-signature>
                              java.util.List asList(java.util.Collection)
               </function-signature>
   </function>
  
   <function>
       <function-name>display</function-name>
       <function-class>de.binaris.recipeadmin.view.ViewUtils</function-class>
       <function-signature>
           java.lang.String display(java.lang.Object)
       </function-signature>
   </function>
               
   <function>
               <function-name>count</function-name>
               <function-class>de.binaris.recipeadmin.view.ViewUtils</function-class>
               <function-signature>
                              int count(java.util.Collection)
               </function-signature>
   </function>
               
   <function>
               <function-name>listExcludingSelectedOne</function-name>
               <function-class>de.binaris.recipeadmin.view.ViewUtils</function-class>
               <function-signature>
                              java.util.List listExcludingSelectedOne(java.util.Collection,java.lang.Object)
               </function-signature>
   </function>  
</facelet-taglib>

Hier auch die ViewUtils-Klasse unter Verwendung generischer Typen T und Collections List<T>:

package de.binaris.recipeadmin.view;
 
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
 
import javax.persistence.Id;
 
/**
* Utilities for working with Java Server Faces views.
*/
public final class ViewUtils {
 
   public static <T> List<T> asList(Collection<T> collection) {
 
     if (collection == null) {
         return null;
     }
     return new ArrayList<T>(collection);
   }
 
   public static String display(Object object) {
     if (object == null) {
         return null;
     }
     try {
         // Invoke toString if declared in the class. If not found,
         // the NoSuchMethodException is caught and handled
         object.getClass().getDeclaredMethod(„toString“);
         return object.toString();
     }
     catch (NoSuchMethodException noMethodEx) {
         try {
           for (Field field : object.getClass().getDeclaredFields()) {
               // Find the primary key field and display it
               if (field.getAnnotation(Id.class) != null) {
                 // Find a matching getter and invoke it to display the key
                 for (Method method : object.getClass().getDeclaredMethods()) {
                     if (method.equals(new PropertyDescriptor(field.getName(),                    
                                         object.getClass()).getReadMethod()))
                     {
                       return method.invoke(object).toString();
                     }
                 }
               }
           }
           for (Method method : object.getClass().getDeclaredMethods()) {
               // Find the primary key as a property instead of a field, and display it
               if (method.getAnnotation(Id.class) != null) {
                 return method.invoke(object).toString();
               }
           }
         } catch (Exception ex) {
           // Unlikely, but abort and stop view generation if any exception is thrown
           throw new RuntimeException(ex);
         }
     }
     return null;
   }
 
   public static <T> int count(Collection<T> collection) {
     if (collection == null) {
               return 0;
     }
     return collection.size();
   }
 
   public static <T> List<T> listExcludingSelectedOne(Collection<T> collection, T selected) {
     if (collection == null) {
         return null;
     }
     if (selected == null) {
       return new ArrayList<T>(collection);
     }
     List<T> list = new ArrayList<T>(collection);
     list.remove(selected);
     return list;
   }
 
   private ViewUtils() {
     // Can never be called, only by getInstance – Singleton pattern
   }
}

Über Tags, TagLibs und die Erweiterung bestehender und die Definition eigener Tags gibt es bereits einen Blog-Eintrag in diesem Blog hier und durch die soeben gezeigten Beispiele ist erkennbar, wie simpel es ist, eigene Tags für die .xhtml-Views heutiger JSF-Applikationen zu definieren.

Alle XML und XHTML-Dateien der Primefaces-Beispielapplikation finden sich im Deployment-Archiv recipeadmin-primefaces.war im /target-Unterverzeichnissen des Projekts recipeadmin-primefaces.

Die Konfiguration des JBoss WildFly Application Servers 10 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2 und 9 Final und betrifft die Datasource, die MySQL-Datenbank Inno DB 5.x, Hibernate 5, das Logging und den Connection Pool und ist, genau wie die Test-Frameworks und die Aktivierung der RESTful WebService-Schnittstelle in diesem Blog-Eintrag hier und vorigen Blog-Einträgen bereits beschrieben.

Bei dieser Gelegenheit darf auch das sehr effektive, interessante und erfolgreiche Seminar

“TDD mit Java”

hier und hier von Binaris Informatik ebenfalls erwähnt werden.

Die Primefaces Beispiel-Applikation arbeitet über die RESTful WebService-Schnittstelle auf derselben Datenbanken, wie die MyFaces-Applikation recipeadmin und die AngularJS Beispiel-Applikation recipeadmin-angularjs, weshalb für die Primefaces Beispiel-Applikationen das selbe mit HeidiSQL erstellte Datenbank-Skript verwendet werden kann.

Hier die /META-INF/persistence.xml, die für alle drei Projekte dieselbe ist:

    <xml version=“1.0″ encoding=“UTF-8″?>
    <persistence version=“2.0″ xmlns=“http://java.sun.com/xml/ns/persistence“
    xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance“
    xsi:schemaLocation=“http://java.sun.com/xml/ns/persistence
    http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd“>
    <persistence-unit name=“RecipeadminPU“>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>
    java:jboss/datasources/RecipeadminDatasource
    </jta-data-source>
    <properties>
    <property name=“hibernate.hbm2ddl.auto“ value=“none“/>
    <property name=“hibernate.show_sql“ value=“false“/>
    </properties>
    </persistence-unit>
    </persistence>

Dafür wird die folgende Datasource benötigt (für die recipeadmin und die recipeadmin-angularjs und die recipeadmin-primefaces Applikation) und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

    <datasource jndi-name=“java:jboss/datasources/RecipeadminDatasource“ pool-name=“RecipeadminDS“
    enabled=“true“>
    <connection-url>jdbc:mysql://localhost:3306/recipeadmin</connection-url>
    <driver>mysql-connector-java-5.1.34.jar</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <pool>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>100</max-pool-size>
    <prefill>true</prefill>
    </pool>
    <security>
    <user-name>root</user-name>
    <password>das entsprechende Passwort</password>
    </security>
    <statement>
    <prepared-statement-cache-size>32</prepared-statement-cache-size>
    <share-prepared-statements>true</share-prepared-statements>
    </statement>
    </datasource>

Die fertigen Beispiel-Applikationen recipeadmin-primefaces, recipeadmin und recipeadmin-angularjs können hier betrachtet werden.

Hier die Beispiel-Projekte für die Entwicklungsumgebungen JBoss Developer Studio und intelliJ 15:

JBoss Developer Studio Projekte:

recipeadmin
recipeadmin-angularjs
recipeadmin-primefaces

intelliJ Projekte:

recipeadmin
recipeadmin-angularjs
recipeadmin-primefaces

Hier der WildFly 10 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Voraussetzung ist jeweils Java 8.

Die fertig konfigurierte Version des WildFly 10.Final mit vielen Beispiel-Applikationen der vorigen Blog-Einträge hier zum Download bereit kann runtergeladen, entpackt und gestartet werden. Dabei ist nur der Pfad für JAVA_HOME in der standalone.xml anzupassen, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt.

Die Angular JS Beispiel-Applikation dieses Blog-Eintrags kann danach selbst erneut deployt werden, ohne den bereits gestarteten WildFly 10 Application Server überhaupt stoppen oder erneut starten zu müssen. Bei laufendem Server einfach ins Server-Unterverzeichnis /standalone/deployments

– eine leere Textdatei namens recipeadmin-angularjs.war.dodeploy speichen und
– das Archiv recipeadmin-angularjs.war aus dem recipeadmin-angularjs/target-Verzeichnis speichern

Sofort wird die Beispiel-Applikation deployt und in wenigen Sekunden gestartet und kann entweder hier und hier oder unter der folgenden Url aufgerufen werden:

http://localhost:8080/recipeadmin-angularjs

Die Primefaces Beispiel-Applikation dieses Blog-Eintrags kann danach selbst erneut deployt werden, ohne den bereits gestarteten WildFly 10 Application Server überhaupt stoppen oder erneut starten zu müssen. Bei laufendem Server einfach ins Server-Unterverzeichnis /standalone/deployments

– eine leere Textdatei namens recipeadmin-primefaces.war.dodeploy speichen und
– das Archiv recipeadmin-primefaces.war aus dem recipeadmin-primefaces/target-Verzeichnis speichern

Die Faces Beispiel-Applikation dieses Blog-Eintrags kann danach selbst erneut deployt werden, ohne den bereits gestarteten WildFly 10 Application Server überhaupt stoppen oder erneut starten zu müssen. Bei laufendem Server einfach ins Server-Unterverzeichnis /standalone/deployments

– eine leere Textdatei namens recipeadmin.war.dodeploy speichen und
– das Archiv recipeadmin.war aus dem recipeadmin/target-Verzeichnis speichern

Wie man sieht, macht es viel Freude, die XHTML-Views der beschriebenen Beispiel-Applikation von MyFaces oder RichFaces auf die vorteilhafte Primefaces-Technologie umzustellen und ebenfalls, zuvor die Angular JS und Faces-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und weiterzuentwickeln.

Es besteht also durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces, Angular JS und JSF-Implementierungen mit den die JEE7-Spezifikation implementierenden Technologien folgen.

Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test Driven Development mit Java, sowie weiterhin eine schöne Sommerzeit und viel Spaß bei der EM und beim Barbecue.

Kommentare

13 Kommentare zu “WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2, JBoss WildFly 10”

  1. Von WebApps – Responsiv mit Angular JS, REST, JEE7, Java 8 auf JBoss WildFly 9 und 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Donnerstag, 30. Juni 2016 23:10

    […] Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Klassen-Diagramm (UML), genauer: […]

  2. Von WebApps – mit Angular JS, REST, JEE7, JBoss Forge, Java 8, MySQL 5, Postgres 9, MSSQL Server 2016 auf JBoss WildFly 9 und 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Freitag, 19. August 2016 21:15

    […] Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Klassen-Diagramm (UML), genauer: […]

  3. 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 Montag, 26. September 2016 10:18

    […] mittels JBoss Forge erstellt werden können, ist bereits analog in diesem Blog-Eintrag hier für die Applikationen recipeadmin-primefaces und recipeadmin-angularjs beschrieben worden, und wie […]

  4. Von WebApps – mit Angular JS, JQuery, REST, JEE7, Java 8, MySQL 5, Postgres 9, auf JBoss WildFly 9 und 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Samstag, 29. Oktober 2016 14:32

    […] vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer: Entity-Relationship-Diagramm […]

  5. 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

    […] mittels JBoss Forge erstellt werden können, ist bereits analog in diesem Blog-Eintrag hier für die Applikationen recipeadmin-primefaces und recipeadmin-angularjs beschrieben worden, und wie […]

  6. Von WebApps – Generativ mit Angular JS, REST, JEE7, Java 8 auf JBoss WildFly 9 und 10 : Softwareentwicklung, Projektmanagement & Schulung | binaris informatik GmbH am Donnerstag, 29. Dezember 2016 15:00

    […] Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Klassen-Diagramm (UML), genauer: […]

  7. 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:18

    […] mittels JBoss Forge erstellt werden können, ist bereits analog in diesem Blog-Eintrag hier für die Applikationen recipeadmin-primefaces und recipeadmin-angularjs beschrieben worden, und wie […]

  8. 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 21:14

    […] mittels JBoss Forge erstellt werden kann, ist bereits analog in diesem Blog-Eintrag hier für die Applikation recipeadmin-primefaces beschrieben worden, und wie in der pom.xml des […]

  9. Von WebApps – JSF 2, Primefaces, FileDownloads, JPA 2, EJB 3, JEE7, REST, MySQL, WildFly : Karriere als Software Entwickler | binaris informatik GmbH am Sonntag, 26. März 2017 19:51

    […] hier. Im Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Klassen-Diagramm (UML), genauer: […]

  10. Von WebApps – Primefaces 6, JPA 2, EJB 3, PDFs parsen, iText, MySQL, REST, JEE7, WildFly : Karriere als Software Entwickler | binaris informatik GmbH am Sonntag, 23. April 2017 15:21

    […] hier. Im Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Entity-Relationship-Diagramm zu einer […]

  11. Von WebApps – mit Angular JS, JQuery, REST, JEE7, JBoss Forge, Java 8, MySQL 5, auf JBoss WildFly 9 und 10 : Karriere als Software Entwickler | binaris informatik GmbH am Sonntag, 28. Mai 2017 16:07

    […] vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer: Entity-Relationship-Diagramm […]

  12. Von WebApps – Wizards mit Angular JS, JQuery, REST, JEE7, Java8, MySQL 5 auf JBoss WildFly : Karriere als Software Entwickler | binaris informatik GmbH am Samstag, 29. Juli 2017 22:59

    […] vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer: Entity-Relationship-Diagramm […]

  13. Von WebApps – RESTful mit Angular JS, JEE7, Java8, MySQL5 auf JBoss WildFly 9 und 10 : Karriere als Software Entwickler | binaris informatik GmbH am Dienstag, 29. August 2017 22:34

    […] vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer: Entity-Relationship-Diagramm […]