WebApps – Primefaces 6, REST, JEE7, Angular JS auf JBoss WildFly 9 und 10

Die Motivation

Im Blog-Eintrag über WebApps – Responsiv mit Angular JS, REST, JEE7, Java 8 auf JBoss WildFly 9 und 10 hier wurde beschrieben, wie aus einem mittels Eclipse-PlugIn Umlet erstellten Entity-Relationship-Diagramm schrittweise eine responsive JEE7-Applikation mit Angular JS User Interface entsteht. Die  benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends liefern bei den JEE6- und JEE7-Beispielapplikationen hier EJB 3-getriebenen Backends (Session Beans als DAOs, „DAO“-Pattern) unter Anbindung der JPA 2 Entities („Table-Per-Class“-Pattern) mit Hilfe von DTOs über fachliche RESTful WebService-Endpoints zwecks besserer Steuerung der vertikalen Skalierbarkeit.

Die Beispiel-Applikation fridge-primefaces verwendet die JSF2-Implementierung Primefaces 6 und die Beispiel-Applikation fridge-angularjs dieses Blog-Eintrags verwendet das Google Angular JS Framework. Beide Beispiel-Applikationen werden auf dem JBoss WildFly 10 Application  Server (entspricht dem JBoss EAP 7-Server) deployt.

Dabei ist die Verwendung der beiden JBoss WildFly JEE7-Application Server in diesem Blog-Eintrag bereits in diesem Blog beschrieben worden. Das Durchsuchen, und die Nutzung einer Pagination der Ergebnisliste ist ebenfalls in den Beispiel-Applikationen enthalten, wie auch mit Hilfe des Angular JS Frameworks und des Bootstrap-Frameworks eine dynamische Benutzeroberfläche, die sich in der Beispiel-Applikation fridge-angularjs an beliebige Auflösungen und Display-Größen responsiv anpasst. Hier nun das E-R-Diagramm der Kühlschrank-Datenbank:

E-R-diagram
(E-R-Diagramm der Beispiel-Datenbank „fridgedb“ ohne die MySQL-Sequence-Tabellen.)

Weiterhin gibt es in der Primefaces 6 Beispiel-App fridge-primefaces die Möglichkeit zum Excel-Export in einer simplen Reporting-View, welche diejenigen Artikel im Kühlschrank als erstes listet, deren MHD als nächstes expiriert.

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Dabei werden in der pom.xml die folgenden Maven Dependencies verwendet:

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, EJB, Primefaces, POI) 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

– primefaces-6.0
– poi-3.7

– cdi-api_1.1

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

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

Der aktivierte Link zum DataExporter verwendet die folgende, oben genannte Apache POI-Dependency hier.

Viele sehr gute Beispiele zur Konfiguration der DataExporter (Excel, PDF, CSV, XML) finden sich im Primefaces Showcase hier.

Für die Reporting-View der demnächst expirierenden Artikel in der Beispiel-Applikation fridge-primefaces wird die ArticleBean um die folgende Methode erweitert:

public void expiringItems() {

                   CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();

                   CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);

                   Root<Article> root = countCriteria.from(Article.class);

                   countCriteria = countCriteria.select(builder.count(root)).where(

                                                  getSearchPredicates(root));

                   this.count = this.entityManager.createQuery(countCriteria)

                                                  .getSingleResult();

                   CriteriaQuery<Article> criteria = builder.createQuery(Article.class);

                   root = criteria.from(Article.class);

                   criteria.orderBy(builder.asc(root.get(„expiryDateTime“)));

                   TypedQuery<Article> query = this.entityManager.createQuery(criteria

                                                  .select(root).where(getSearchPredicates(root)));

                   query.setFirstResult(this.page * getMaxPageSize()).setMaxResults(

                                                  getMaxPageSize());

                   this.pageItemsExpiring = query.getResultList();

   }

In der Report-View (article/report.xhtml), erreichbar über den ‚Report‘-Menüpunkt, ist eine Report Excel-Datei zum Download erhältlich. Ein Klick auf das Buch-Symbol startet den Download der Datei ‚articles_expiring_soon.xls‘ mit den Columns (Name, Category, Expiry Date) über die bald das MHD erreichenden Artikel im Kühlschrank aus der ‚Articles expiring soon‘-Übersicht der Report-View .

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 InnoDB 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 einem Blog-Eintrag dieses Blogs bereits beschrieben.

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

“TDD mit Java”

von Binaris Informatik erwähnt werden.

Hier auch die /META-INF/persistence.xml der Beispiel-Applikation:

<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=“FridgecontentPU“>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>
    java:jboss/datasources/FridgecontentDatasource
</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 und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

<datasource jndi-name=“java:jboss/datasources/FridgecontentDatasource“ pool-name=“FridgecontentDS“
    enabled=“true“>
    <connection-url>jdbc:mysql://localhost:3306/fridgecontent</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>

Hier auch das mit HeidiSQL erstellte Datenbank-Skript (SQL Export) zum Anlegen der Datenbank fridgecontent.

Die fertigen Beispiel-Applikationen fridge-primefaces und fridge-angularjs können zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden.

Hier die Beispiel-Projekte für die Eclipse-Entwicklungsumgebung JBoss Developer Studio:

fridge-primefaces

fridge-angularjs

Hier der WildFly 10 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Voraussetzung zum Start des WildFly 10 Application Servers 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. Für die Weiterentwicklung, den Build und das Deployment des Projekts ist mindestens Java 6 und Maven 3 erforderlich. Als Entwicklungsumgebung wurde Eclipse Form des “JBoss Developer Studios“ verwendet .

Weiterhin die FireFox WebDeveloper IDE/Tools. Als Datenbank wurde MySQL InnoDB 5.x eingesetzt, hier kann aber auch leicht PostgreSQL,Oracle oder auch gerne eine andere relationale Open Source-Datenbank verwendet werden. Der WildFly 10 verwendet als Java Runtime Java 8 oder höher, weshalb jeder WildFly Application Server auf dem Linux-Server für die Beispiel-Applikationen seine eigene JVM bekam, (WildFly 9 läuft auf Java 7, WildFly 10 auf Java 8). Hierfür wird im Startskript standalone.sh einfach das benötigte JAVA_HOME gesetzt. Auch bekam jede WildFly Application Server-Instanz einen eigenen Port, auf dem die Beispiel-Applikationen erreichbar sind.

Die Primefaces 6 Beispiel-Applikation dieses Blog-Eintrags kann 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

– das Archiv fridge-primefaces.war aus dem fridge-primefaces/target-Verzeichnis speichern

Sofort wird die Beispiel-Applikation deployt und in wenigen Sekunden gestartet und kann aufgerufen werden:

http://localhost:8080/fridge-primefaces

Die Angular JS Beispiel-Applikation dieses Blog-Eintrags kann 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

– das Archiv logisticsadmin-angularjs.war aus dem fridge-angularjs/target-Verzeichnis speichern

Sofort wird die Beispiel-Applikation deployt und in wenigen Sekunden gestartet und kann aufgerufen werden:

http://localhost:8080/fridge-angularjs

Wie man sieht, macht es einfach Spaß, die responsiven Angular JS-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und weiterzuentwickeln und z. B. mit der Primefaces 6-Version komfortable JEE7-Beispielapplikationen auf einer erweiterten REST-Schnittstelle zu entwickeln.

Es besteht also durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Angular JS, Bootstrap und den die JEE7-Spezifikation implementierenden Backends und darauf basierenden WebServices und folgen. Im nächsten Blog-Eintrag soll mittels einer ’shoppinghelper‘-Beispielapplikation dann der Kühlschrank der soeben besprochenen Beispielapplikation fridge-primefaces tatsächlich mit ein paar Einkaufsartikeln befüllt werden. Man darf also weiterhin auf den ersten Advent gespannt sein. Allen interessierten Leserinnen und Lesern viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test Driven Development mit Java.