WebApps – mit REST, JPA 2, EJB 3, JSF 2, Primefaces 6, JEE7 auf WildFly 9, 10, 11, 12, und 18 mit Java Corretto

Die Motivation

Über Beispiel-Applikationen zu der der sehr vorteilhaften Primefaces 6-Technologie gibt es bereits Blog-Einträge in diesem Blog hier. In diesem Blog-Eintrag soll nun nach dem zugrundeliegenden relationalen Datenmodell eine Primefaces 6 Beispiel-Webapplikation moviebooking-primefaces für eine MySQL 5 Datenbank Datenbank erstellt werden. Dabei wird als Basis-Frontendtechnologie JSF 2 in der Primefaces 6-Implementierung auf dem WildFly 9, 10, 11, 12 und 18 verwendet. Die WildFly Server 9, 19, 11, und 12 verwenden als Java Runtime dabei Java 8 und WildFly 18 läuft in diesem Blog mit Java 11 Amazon Corretto. Weiterhin wird der Einsatz moderner Tag-Libs in den XHTML-Seiten der JEE7-Applikation erklärt. Mittels JBoss Forge Eclipse PlugIn wird die Primefaces 6 Beispiel-Applikation moviebooking-primefaces auf dem Datenmodell mit den JPA 2 Entities erstellt unter Einsatz von JSF 2 und der robusten, elegant gestylten, etablierten, optimalen Primefaces Frontend-Technologie.

Die Beispiel-Applikation moviebooking-primefaces wird dann auf den JBoss WildFly 9 Final, JBoss WildFly 10 Final, JBoss WildFly 11, JBoss WildFly 12 und JBoss WildFly 18 Application Servern deployt und getestet. Die Verwendung der JBoss WildFly JEE7-Application Server wurde in einem Blog-Eintrag in einem Blog-Eintrag dieses Blogs bereits einmal beschrieben. Dabei liefern die JEE6- und JEE7-Beispielapplikationen hier mit Hilfe eines 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 ServiceInterfaces die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren (ServiceConsumer-Pattern). Der JPA-Provider ist hier Hibernate von JBoss, wofür WildFly 9, 10, 11, 12 und 18 zu konfigurieren sind. Um es vorwegzunehmen wurde die Migration auf den WildFly 18 aus reinem Interesse durchgeführt und dabei Java 11 (Amazon Corretto) verwendet, wobei es für die Beispielapplikation nicht zwingend erforderlich ist. Mittels dem Criteria-API werden aus dem Backend die benötigten Daten für das Frontend gelesen, welche in der jeweiligen Kinobuchung (“Moviebooking“) dann auswählbar sind. Dabei wurde auf die Präsentation des Buchungsvorgangs als Wizard erstmal verzichtet. Zu Wizards gibt es bereits einen Beispiel-Eintrag in diesem Blog hier als Umfrage-Beispiel. Es wird aber bestimmt hierzu noch einen Blog-Eintrag geben, da ein Buchungs-Wizard als sinnvolle Variante eines Buchungs-Beispiels nicht von der Hand zu weisen ist.

Erstellung der Beispiel Applikation nach Datenmodell

Wie die Applikation moviebooking-primefaces mittels JBoss Forge erstellt werden kann, ist bereits analog in diesem Blog-Eintrag hier für die soeben erwähnte Unfrage-Applikation surveyapplication-primefaces beschrieben worden und wie daraus die Moviebooking-Applikation weiterentwickelt werden kann. Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der moviebooking – MySQL Datenbank:

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

Als Ideengeber und Beispiel-Applikationsvorlage wurden die Spring WebFlow Examples hier verwendet mit dem folgenden Spring WebFlow Booking hier.

In der pom.xml des jeweiligen Beispielprojekts nach erfolgtem Download erkennbar, wurden in der Applikation moviebooking-primefaces ebenfalls die folgenden JEE 7 Artefakte für den JBoss WildFly identifiziert, verwendet und importiert:

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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. Die Aktivierung von CDI erfolgt mittels beans.xml im WEB-INF Verzeichnis.

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

Primefaces 6:

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 in den vorigen Blog-Einträgen beschrieben.

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-6.0.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>6.0</version>
</dependency>

Allein durch Änderung dieses Eintrags in der pom.xml kann jederzeit auch auf die gewünschte Primefaces-Version umgestellt werden. Bei der Ausprogrammierung der XHTML-Views auf Primefaces sind der Primefaces Showcase und der neue Primefaces 6.0 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.

Aktiviert werden die Primefaces-Tags in der gewünschten XHTML-Seite mittels folgendem Namespace 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 ansonsten nahezu identisch zu den ManagedBeans der MyFaces-Applikationen. Weitere Informationen zu JSF 2.2, CDI und Primefaces finden sich auch hier im Blog von Balus C. Detail-Informationen zur JavaScript-Bibliothek jQuery, die vom Primefaces-Framework sehr intensiv verwendet wird, finden sich hier: jquery.org

forge.taglib.xml:

Die in den Beispiel-Applikationen verwendete, moderne Forge TagLib kann sehr einfach erweitert werden, indem die zusätzlich benötigten Methoden in der ViewUtils-Klasse ergänzt werden und deren Signaturen in der forge.taglib.xml im Verzeichnis src/main/webapp/WEB-INF/classes/META-INF/ bekanntgemacht werden, also genau wie bei klassischen TagLibs mit dem Unterschied, dass die verwendeten Tags innerhalb der Applikation in der ViewUtils-Klasse implementiert werden, was für die Applikation zusätzliche Sicherheit bringt. Diese Tags sind für jede Applikation sehr leicht adaptierbar und können genau auf die Applikation zugeschnitten werden. 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-Applikation moviebooking-primefaces:

<?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.moviebooking.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.moviebooking.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.moviebooking.view.ViewUtils</function-class>
<function-signature>
int count(java.util.Collection)
</function-signature>
</function>

<function>
<function-name>displayShort</function-name>
<function-class>de.binaris.moviebooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayShort(java.lang.Object, int)
</function-signature>
</function>

<function>
<function-name>displayRange</function-name>
<function-class>de.binaris.moviebooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayRange(java.lang.Object,java.lang.Object)
</function-signature>
</function>

<function>
<function-name>displayFirst</function-name>
<function-class>de.binaris.moviebooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayFirst(java.lang.Object)
</function-signature>
</function>

<function>
<function-name>listExcludingSelectedOne</function-name>
<function-class>de.binaris.moviebooking.view.ViewUtils</function-class>
<function-signature>
java.util.List listExcludingSelectedOne(java.util.Collection,java.lang.Object)
</function-signature>
</function>
</facelet-taglib>

Mit entsprechenden Implementierungen der Tag-Funktionalitäten in der ViewUtils-Klasse unter Verwendung generischer Typen T und Collections List<T>.

Über Tags, TagLibs und die Erweiterung bestehender und die Definition eigener Tags gibt es bereits einen Blog-Eintrag und durch die soeben gezeigten Beispiele ist erkennbar, wie simpel es ist, eigene Tags für die .xhtml-Views heutiger JSF 2-Applikationen zu definieren und deren Utility functions-Signaturen im WEB-INF/classes/META-INF-Verzeichnis des classpaths als *name*-taglib.xml mit dem genannten XML Document-Header und dem jboss-forge-view namespace zu deklarieren (s.o. forge.taglib.xml).

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

Konfiguration des JBoss WildFly Application Servers

Die Konfiguration des JBoss WildFly Application Servers 10 Final und JBoss WildFly Application Servers 11 Final bzw. neuerer Versionen (z. B. JBoss WildFly Application Server 12 Final) erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2 und 9 Final und betrifft die Datasource, das Logging und den Connection Pool und ist, genau wie die Test-Frameworks und die Aktivierung der RESTful WebService-Schnittstelle in vorigen Blog-Einträgen bereits beschrieben. Wie die MySQL-Datenbank Inno DB 5.x zu konfigurieren ist, wurde ebenfalls in einem bereits vorhandenen Blog-Eintrag beschrieben.

Die Primefaces Beispiel-Applikation arbeitet über die RESTful WebService-Schnittstelle auf der MySQL-InnoDB. Für die Primefaces Beispiel-Applikation kann folgendes mit HeidiSQL erstellte MySQL 5.x Datenbank-Skript verwendet werden. Hier auch die Datasource Definition:

<datasource jndi-name=“java:jboss/datasources/MoviebookingDatasource“ pool-name=“MoviebookingDS“ enabled=“true“>
                    <connection-url>jdbc:mysql://localhost:3306/moviebooking</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 Password]</password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>32</prepared-statement-cache-size>
                        <share-prepared-statements>true</share-prepared-statements>
                    </statement>
</datasource>

Die Hibernate-Konfiguration der WildFly Application Server ist ebenfalls leicht durchführbar und wurde bereits in einem Blog-Eintrag in diesem Blog hier beschrieben.

Die fertige Beispiel-Applikation moviebooking-primefaces kann leicht selbst deployt werden und kann ebenfalls hier auf dem Test-Server aufgerufen und danach eine Beispiel Kinoticket-Buchung erstellt werden.

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

“TDD mit Java”

von Binaris Informatik erwähnt werden.

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

JBoss Developer Studio Projekt:

moviebooking-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. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank für den WildFly 9 und den WildFly 10 gibt es hier mehr Informationen in diesem Blog.

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 anzupassen, damit dieser auf das tatsächliche JDK 8 – Verzeichnis des Server-Systems zeigt.

Hier auch der WildFly 11 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Voraussetzung ist jeweils Java 8. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9 und WildFly 10 durchzuführen sind.

Der fertig konfigurierte WildFly 11.Final mit vielen Beispiel-Applikationen der vorangegangenen Blog-Einträge ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK zeigt.

Hier auch der WildFly 18 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Empfohlen ist hier Java 11 (Amazon Corretto). Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9, 10, 11 und 12 durchzuführen sind.

Der fertig konfigurierte WildFly 18.Final mit vielen Beispiel-Applikation dieses Blogs ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java 11 (Amazon Corretto) fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

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

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

Wie man sieht, macht es viel Freude, JEE-Applikationen mit der vorteilhaften Primefaces-Technologie zu entwickeln und ebenfalls, zuvor die Faces-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und weiterzuentwickeln.

Es ist also sehr wahrscheinlich, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces, Angular JS und Faces und den die JEE-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 eine schöne Frühlingszeit.

WebApps – mit Angular JS, JQuery, REST, JEE, JBoss Forge, Java 11 Corretto, MySQL, auf JBoss WildFly 18

Die Motivation

In dem bereits 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 hier, auch E-R Diagramm genannt, eine JEE-Applikation erstellt werden kann. Diese JEE6- und JEE7-Beispielapplikationen hier liefern mit Hilfe von 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 ServiceInterfaces oder per Microservices mit Docker, Spring Boot, siehe auch ServiceBroker-Pattern hier, die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren (ServiceConsumer-Pattern).

Das Durchsuchen, und die Nutzung einer Pagination der Ergebnisliste ist ebenfalls in der Beispiel-App enthalten, wie auch mit Hilfe des Angular JS Frameworks und des Bootstrap-Frameworks eine dynamische Benutzeroberfläche, die sich an beliebige Auflösungen und Display-Größen responsiv anpasst.

Die ausprogrammierte JEE7-Applikation moviebooking-angularjs mit dem Angular JS-Frontend und dem JEE-Backend mit den JPA 2 Entities kann einfach an verschiedene relationale Datenbanken (z. B. MySQL 5.x oder Postgres 9.x) angebunden werden, weshalb auch benötigte SQL-Export/-Import-Skripte zur Verfügung gestellt werden. Die Beispiel-Applikation  moviebooking-angularjs wird dann auf dem JBoss WildFly 18 Final Server deployt. Dabei ist die Verwendung des JBoss WildFly JEE-Application Server in diesem Blog-Eintrag hier bereits beschrieben worden.

Erstellung der Beispiel Applikation auf dem Datenmodell

Mittels DBeaver wird das Klassendiagramm der Entities aus den Datenbank-Objekten erstellt und aus diesen, nach dem Anlegen der Datenbank per Hibernate Envers während dem WildFly 18 Undertow Deployment mittels JBoss Forge Eclipse PlugIn im JBoss Developer Studio erst der REST-WebService mit den Endpoints generiert und danach die Angular JS WebApp auf diesem RESTful WebService.

Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der moviebooking – MySQL Datenbank:

E-R-diagram

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

Dabei darf positiv erwähnt werden, dass man mittels JBoss Forge eine saubere, stringente Architektur in die JEE7-Applikation einbringt, die beim Weiterentwickeln der App sehr hilfreich ist und sowohl die Entwicklungszeit-Performance als auch die Codequalität deutlich steigert. Danke, JBoss Rockstars!

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

“TDD mit Java”

hier von Binaris Informatik erwähnt werden.

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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

Die Aktivierung von CDI erfolgt, wie beschrieben, mittels beans.xml im WEB-INF Verzeichnis der Beispielapplikation.

WildFly Anbindung an MySQL5 und deklarative WildFly Hibernate-Konfiguration

Die Konfiguration des JBoss WildFly Application Servers 18 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2, 9, 10, 11, 12 und 18 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 ein wichtiges Thema, welches noch genauer beschrieben werden wird. Die Anbindung an die relationale  Datenbank MySQL 5 erfolgt übrigens analog für die JBoss Application Server WildFly 8.1, 8.2, 9, 10 und WildFly 11, 12 und 18.

Je nach verwendeter Datenbank kann in der persistence.xml im Deployment-Paket der Beispiel-App moviebooking-angularjs.war ein entsprechender Datenbank-Dialekt eingetragen werden:

Hier die /META-INF/persistence.xml der Beispiel-Applikation für MySQL5:

    <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=“MoviebookingPU“>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>
            java:jboss/datasources/MoviebookingDatasource
    </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 je Datenbank die folgende Datasource benötigt und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

Für MySQL 5:

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

Für die erfolgreiche Anbindung der soeben deklarierten Datasoures werden die Datenbank-Treiber auf Modul-Ebene des JBoss WildFly konfiguriert, wie hier für den MySQL JDBC4 Treiber beispielhaft auf dem WildFly 8.2 beschrieben wurde.

Damit die Datasources die soeben konfigurierten Treiber auch finden, werden diese in der /standalone/configuration/standalone.xml bei den <datasources> deklariert:

Für MySQL 5:

<driver name=“mysql-connector-java-5.1.34.jar“ module=“com.mysql“>
   <driver-class>com.mysql.jdbc.Driver</driver-class>
   <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
   </xa-datasource-class>
</driver>

Die Hibernate-Konfiguration des WildFly 11 Final Servers ist ebenfalls leicht durchführbar. Hierfür werden im WildFly11 Server-Verzeichnis wildfly-11.0.0.Final/modules/system/layers/base/org/hibernate/main folgende Dateien hinterlegt:

– hibernate-core-5.1.10.Final.jar
– hibernate-entitymanager-5.1.10.Final.jar
– hibernate-enve55rs-5.1.10.Final.jar
– hibernate-java8-5.1.10.Final.jar
– jipijapa-hibernate5-11.0.0.Final.jar
– module.xml
– mysql-connector-java-5.1.34.jar
– mysql-connector-java-5.1.34.jar.index

Dies läuft für die Application Server WildFly 12  und 18 Final ganz analog. Die fertige Beispiel-Applikation moviebooking-angularjs kann zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden (MySQL5 Server, Postgres 9 auf Linux).

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, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und auch der Pfad für das log-Dateien Verzeichnis in der Datei [server]/standalone/configuration/logging.properties.

Hier auch der WildFly 11 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Minimale Voraussetzung ist jeweils Java 8, er wird hier aber bereits mit Java 9 betrieben. Der fertig konfigurierte WildFly 11 mit vielen weiteren Beispiel-Applikationen ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden.

Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK 9–Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties. Die Verwendung und Konfiguration des neuen WildFly 12 wird noch genauer besprochen, läuft aber prinzipiell genauso. Die Download-Links für den WildFly 12 Final gibt es für  Linux hier und für Windows hier.

Der fertig konfigurierte WildFly 18 Final mit Beispiel-Applikationen dieses Blogs ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java11 Amazon Corretto fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske. Hier auch das SQL-Skript zum Anlegen und initialen Befüllen der moviebooking Datenbank.

Hier auch nochmal die ausführliche Dokumentation einer weiteren JEE Beispielapplikation mit Selenium-Tests und Javascript QUnit-Tests.

Hier das Angular JS „moviebooking-angularjs“ Beispiel-Projekt für die Eclipse-Entwicklungsumgebung JBoss Developer Studio:

moviebooking-angularjs

Fazit: Wie man sieht, macht es einfach viel Freude, z.B. mittels JBoss Forge und JPA 2 Entities die responsiven Angular JS Apps auf dem Datenmodell zu erzeugen und weiterzuentwickeln oder eben robuste, komfortable, Browser-basierte Primefaces 6-Fontends, sei es nun für mobile IMS (Informations-Management-Systeme) oder für Product Information Management Systems und diese an einen neuen, die JEE7 oder JEE8-Spezifikation erfüllenden JBoss WildFly (WildFly 9 – 18 Final)  anzubinden.

Somit besteht durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces 6, Angular JS und Bootstrap, sowie den die JEE7-Spezifikation oder JEE8-Spezifikation implementierenden WebService-und Backend-Technologien folgen. Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test-Driven Development mit Java, sowie noch eine schöne Winterzeit.

WebApps – RESTful mit JSF 2, JPA 2, EJB 3, Primefaces 6, Java 8 und 11 auf WildFly 9, 10, 11, 12 und 18

Die Motivation

Über Beispiel-Applikationen zu der der sehr vorteilhaften Primefaces 6-Technologie gibt es einige Blog-Einträge in diesem Blog hier. In diesem Blog-Eintrag soll nun nach dem zugrundeliegenden relationalen Datenmodell eine Primefaces 6 Beispiel-Webapplikation businessappointments-primefaces für eine MySQL 5 Datenbank Datenbank erstellt werden. Dabei wird als Basis-Frontendtechnologie JSF 2 in der Primefaces 6-Implementierung auf dem WildFly 9, 10, 11, 12 und 18 verwendet. Die WildFly Server 9, 19, 11, und 12 verwenden dabei als Java Runtime Java 8 und WildFly 18 läuft in diesem Blog mit Amazon Corretto 11. Weiterhin wird der Einsatz moderner Tag-Libs in den XHTML-Seiten der JEE7-Applikation erklärt. Mittels JBoss Forge Eclipse PlugIn wird die Primefaces 6 Beispiel-Applikation businessappointments-primefaces auf dem Datenmodell mit den JPA 2 Entities erstellt unter Einsatz von JSF 2 und der robusten, stets elegant gestylten, etablierten, optimalen Primefaces Frontend-Technologie.

Die Beispiel-Applikation businessappointments-primefaces wird dann auf den JBoss WildFly 9 Final, JBoss WildFly 10 Final, JBoss WildFly 11, JBoss WildFly 12 und JBoss WildFly 18 Application Servern deployt und getestet. Die Verwendung der JBoss WildFly JEE7-Application Server wurde in einem Blog-Eintrag in einem Blog-Eintrag dieses Blogs bereits einmal beschrieben. Dabei liefern die JEE6- und JEE7-Beispielapplikationen hier mit Hilfe eines 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 ServiceInterfaces die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren (ServiceConsumer-Pattern). Der JPA-Provider ist hier Hibernate von JBoss, wofür WildFly 9, 10, 11, 12 und 18 zu konfigurieren sind. Um es vorwegzunehmen wurde die Migration auf den WildFly 18 aus reinem Interesse durchgeführt und dabei Java 11 (Amazon Corretto) verwendet, wobei es für die Beispielapplikation nicht zwingend erforderlich ist. Auf Basis derselben Motivation wird in einem der nächsten Blog-Einträge auch einmal die Migration auf WildFly 20 durchgeführt werden. Mittels dem Criteria-API werden aus dem Backend die benötigten Daten für das Frontend gelesen, die für die Geschäfts-Veranstaltung erforderlich sind. Weiterhin können auch neue Geschäftskontakte hinzugefügt, aktualisiert und persistiert werden. Auf die Implementierung der Neuanlage einer Geschäfts-Veranstaltung als Wizard wurde erstmal verzichtet. Zu Wizards gibt es bereits einen Beispiel-Eintrag mit einem Umfrage-Beispiel in diesem Blog hier.

Erstellung der Beispiel Applikation nach Datenmodell

Wie die Applikation businessappointments-primefaces mittels JBoss Forge erstellt werden kann, ist bereits analog in diesem Blog-Eintrag hier für die soeben erwähnte Umfrage-Applikation surveyapplication-primefaces beschrieben worden und wie daraus die Business Veranstaltungs-Applikation weiterentwickelt werden kann. Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der businessappointments – MySQL Datenbank:

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

Dabei darf positiv erwähnt werden, dass man mittels JBoss Forge eine saubere, stringente Architektur in die JEE7-Applikation einbringt, die beim Weiterentwickeln der App sehr hilfreich ist und sowohl die Entwicklungszeit-Performance als auch die Codequalität deutlich steigert. Danke, JBoss Rockstars!

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

“TDD mit Java”

von Binaris Informatik erwähnt werden.

Es werden in der pom.xml die folgenden Maven Dependencies 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

Und ebenfalls die CDI 1.1 Dependency:

– cdi-api_1.1

Dabei erfolgt die Aktivierung von CDI mittels beans.xml im WEB-INF Verzeichnis.

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

Primefaces 6:

Hat man erst einmal die JPA 2.1 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 auf Primefaces leicht durchführbar und wurde bereits beschrieben.

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-6.1.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>6.1</version>
</dependency>

Durch Änderung dieses Eintrags in der pom.xml kann auf die gewünschte Primefaces-Version umgestellt werden. Bei der Ausprogrammierung der XHTML-Views auf Primefaces sind der Primefaces Showcase und z. B. der Primefaces 6.1 Users Guide (PDF) sehr hilfreich. Der größte Aufwand der Migration von einer Faces Applikation auf die Primefaces 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.

Aktiviert werden die Primefaces-Tags in der gewünschten XHTML-Seite mittels folgendem Namespace 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 ansonsten nahezu identisch zu den ManagedBeans der MyFaces-Applikationen. Weitere Informationen zu JSF 2, CDI und Primefaces finden sich auch hier im Blog von Balus C. Detail-Informationen zur JavaScript-Bibliothek jQuery, die vom Primefaces-Framework sehr intensiv verwendet wird, finden sich hier: jquery.org

forge.taglib.xml:

Die in den Beispiel-Applikationen verwendete, moderne Forge TagLib kann sehr einfach erweitert werden, indem die zusätzlich benötigten Methoden in der ViewUtils-Klasse ergänzt werden und deren Signaturen in der forge.taglib.xml im Verzeichnis src/main/webapp/WEB-INF/classes/META-INF/ bekanntgemacht werden, also genau wie bei klassischen TagLibs mit dem Unterschied, dass die verwendeten Tags innerhalb der Applikation in der ViewUtils-Klasse implementiert werden, was für die Applikation zusätzliche Sicherheit bringt, anstatt in einer extra TagLib. Diese Tags sind für jede Applikation sehr leicht adaptierbar und können genau auf die Applikation zugeschnitten werden. 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-Applikation businessappointments-primefaces:

<?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.businessappointments.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.businessappointments.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.businessappointments.view.ViewUtils</function-class>
       <function-signature>
             int count(java.util.Collection)
       </function-signature>
   </function>
                
   <function>
       <function-name>displayShort</function-name>
       <function-class>de.binaris.businessappointments.view.ViewUtils</function-class>
       <function-signature>
             java.lang.String displayShort(java.lang.Object, int)
       </function-signature>
   </function>
                
   <function>
       <function-name>displayRange</function-name>
       <function-class>de.binaris.businessappointments.view.ViewUtils</function-class>
       <function-signature>
             java.lang.String displayRange(java.lang.Object,java.lang.Object)
       </function-signature>
   </function>

   <function>
       <function-name>displayFirst</function-name>
       <function-class>de.binaris.businessappointments.view.ViewUtils</function-class>
       <function-signature>
             java.lang.String displayFirst(java.lang.Object)
       </function-signature>
   </function>

   <function>
       <function-name>listExcludingSelectedOne</function-name>
       <function-class>de.binaris.businessappointments.view.ViewUtils</function-class>
       <function-signature>
             java.util.List listExcludingSelectedOne(java.util.Collection,java.lang.Object)
       </function-signature>
   </function>   
</facelet-taglib>

Mit entsprechenden Implementierungen der Tag-Funktionalitäten in der ViewUtils-Klasse unter Verwendung generischer Typen T und Collections List<T> hier:

package de.binaris.businessappointments.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 String displayRange(Object object1, Object object2) {
     String text1 = display(object1);
     String text2 = display(object2);
      if (text1 == null || text2 == null
          || text1.trim() == null || text2.trim() == null) {
           return null;
      }
     return (text1 + “-“ + text2);
   }
                
   public static String displayFirst(Object object) {
     String text = display(object);
      if (text == null || text.split(“\\s+“) == null
          || text.split(“\\s+“)[0] == null) {
           return null;
      }
     return (text.split(“\\s+“)[0] + “…“);
   }
 
   public static String displayShort(Object object, int length) {
     String text = display(object);
      if (text == null || text.split(“\\s+“) == null
           || text.split(“\\s+“)[0] == null) {
           return null;
      }
     String[] elements = text.split(“\\s+“);
     String result = ““;
      int i = 0;
      while ((result+elements[i]).length() < length) {
          result += elements[i] + “ “;
          i++;
      }
      return (result.trim() + “…“);
   }

   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
   }

   public static ViewUtils getInstance() {
      return new ViewUtils();
   }
}

Dabei bestimmt allein die Facelets XML-TagLib Deklaration in der forge.taglib.xml, welche der Utility Methoden als Tags mit dem forgeview: Prefix der XML-Namespace Deklaration in den .xhtml-Seiten verfügbar sind und welche ausschließlich als (static) Helper-Funktionen definiert und von anderen Klassen verwendbar sind.

Ü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 2-Applikationen zu definieren und deren Utility functions-Signaturen im WEB-INF/classes/META-INF-Verzeichnis des classpaths als *name*-taglib.xml mit dem folgenden XML Document-Header und dem jboss-forge-view namespace zu deklarieren (s.o. forge.taglib.xml).

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

Konfiguration des JBoss WildFly 10 Application Servers

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, das Logging und den Connection Pool und ist, genau wie die Test-Frameworks und die Aktivierung der RESTful WebService-Schnittstelle, sowie die Konfiguration der MySQL-Datenbank Inno DB in vorigen Blog-Einträgen bereits beschrieben worden.

Die Primefaces Beispiel-Applikation arbeitet über die RESTful WebService-Schnittstelle auf der MySQL-InnoDB. Für die Primefaces Beispiel-Applikation kann folgendes mit HeidiSQL erstellte MySQL 5.x Datenbank-Skript verwendet werden. Hier auch die Datasource Definition:

<datasource jndi-name=“java:jboss/datasources/BusinessappointmentsDatasource“ pool-name=“BusinessappointmentsDS“ enabled=“true“>
            <connection-url>jdbc:mysql://localhost:3306/businessappointments</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 Password]</password>
            </security>
            <statement>
            <prepared-statement-cache-size>32</prepared-statement-cache-size>
            <share-prepared-statements>true</share-prepared-statements>
            </statement>
</datasource>

Die Hibernate-Konfiguration der WildFly Server 9 und 10 ist ebenfalls leicht durchführbar und wurde bereits in einem Blog-Eintrag in diesem Blog hier beschrieben.

Konfiguration der JBoss WildFly 11 Application Servers

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

Die Hibernate-Konfiguration des WildFly Servers ist ebenfalls leicht durchführbar. Hierfür werden im WildFly11 Server-Verzeichnis wildfly-11.0.0.Final/modules/system/layers/base/org/hibernate/main folgende Dateien hinterlegt:

– hibernate-core-5.1.10.Final.jar
– hibernate-entitymanager-5.1.10.Final.jar
– hibernate-envers-5.1.10.Final.jar
– hibernate-java8-5.1.10.Final.jar
– jipijapa-hibernate5-11.0.0.Final.jar
– module.xml
– mysql-connector-java-5.1.34.jar
– mysql-connector-java-5.1.34.jar.index

Die fertige Beispiel-Applikation businessappointments-primefaces kann leicht selbst deployt werden und kann ebenfalls hier auf dem Test-Server aufgerufen und danach eine Beispiel-Geschäftsveranstaltung („Businessappointment“) erstellt und z. B. um Business-Kontakte ergänzt werden.

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

JBoss Developer Studio Projekt:

businessappointments-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. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank für den WildFly 9 und den WildFly 10 gibt es hier mehr Informationen in diesem Blog.

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 anzupassen, damit dieser auf das tatsächliche JDK 8 – Verzeichnis des Server-Systems zeigt.

Hier auch der WildFly 11 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Voraussetzung ist jeweils Java 8. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9 und WildFly 10 durchzuführen sind.

Der fertig konfigurierte WildFly 11.Final mit vielen Beispiel-Applikationen der vorangegangenen Blog-Einträge ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK zeigt.

Hier auch der WildFly 18 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Empfohlen ist hier Java 11 (Amazon Corretto). Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9, 10, 11 und 12 durchzuführen sind.

Der fertig konfigurierte WildFly 18.Final mit der businessappointments-primefaces Beispiel-Applikation dieses Blog-Eintrags ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java 11 Amazon Corretto fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java 11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

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

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

Wie man sieht, macht es viel Freude, JEE-Applikationen mit der vorteilhaften Primefaces-Technologie zu entwickeln und ebenfalls, zuvor die Faces-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und weiterzuentwickeln.

Es ist also sehr wahrscheinlich, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces, Angular JS und Faces und den die JEE-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 eine angenehme Neujahrsfeier und alles Gute für das neue Jahr 2021.

WebApps – Wizards mit Primefaces 6, JSF 2, JPA 2,EJB 3, JEE7, Postgres 9, REST, WildFly 18

Die Motivation

Über Beispiel-Applikationen zu der der sehr vorteilhaften Primefaces 6-Technologie gibt es bereits Blog-Einträge in diesem Blog hier. In diesem Blog-Eintrag soll nun nach dem zugrundeliegenden relationalen Datenmodell eine Primefaces 6 Beispiel-Webapplikation travelbookingwizard-primefaces für eine MySQL 5 Datenbank Datenbank erstellt werden. Dabei wird als Basis-Frontendtechnologie JSF 2 in der Primefaces 6-Implementierung auf dem WildFly 9, 10, 11, 12 und 18 verwendet. Die WildFly Server 9, 19, 11, und 12 verwenden als Java Runtime dabei Java 8 und WildFly 18 läuft in diesem Blog mit Java 11 Amazon Corretto. Weiterhin wird der Einsatz moderner Tag-Libs in den XHTML-Seiten der JEE7-Applikation erklärt. Mittels JBoss Forge Eclipse PlugIn wird die Primefaces 6 Beispiel-Applikation travelbookingwizard-primefaces auf dem Datenmodell mit den JPA 2 Entities erstellt unter Einsatz von JSF 2 und der robusten, elegant gestylten, etablierten, optimalen Primefaces Frontend-Technologie.

Die Beispiel-Applikation travelbookingwizard-primefaces wird dann auf den JBoss WildFly 9 Final, JBoss WildFly 10 Final, JBoss WildFly 11, JBoss WildFly 12 und JBoss WildFly 18 Application Servern deployt und getestet. Die Verwendung der JBoss WildFly JEE7-Application Server wurde in einem Blog-Eintrag in einem Blog-Eintrag dieses Blogs bereits einmal beschrieben. Dabei liefern die JEE6- und JEE7-Beispielapplikationen hier mit Hilfe eines 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 ServiceInterfaces die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren (ServiceConsumer-Pattern). Der JPA-Provider ist hier Hibernate von JBoss, wofür WildFly 9, 10, 11, 12 und 18 zu konfigurieren sind. Um es vorwegzunehmen wurde die Migration auf den WildFly 18 aus reinem Interesse durchgeführt und dabei Java 11 (Amazon Corretto) verwendet, wobei es für die Beispielapplikation nicht zwingend erforderlich ist. Mittels dem Criteria-API werden aus dem Backend die benötigten Daten für das Frontend gelesen, welche in der jeweiligen Reisebuchung (“Travelbooking“) dann auswählbar sind. Dabei kann der Buchungsvorgangs als Wizard durchlaufen werden. Zu Wizards gibt es bereits einen Beispiel-Eintrag in diesem Blog hier als Umfrage-Beispiel.

Erstellung der Beispiel Applikation nach Datenmodell

Wie die Applikation travelbookingwizard-primefaces mittels JBoss Forge erstellt werden kann, ist bereits analog in diesem Blog-Eintrag hier für die soeben erwähnte Unfrage-Applikation surveyapplication-primefaces beschrieben worden und wie daraus die Travelbooking Wizard-Applikation weiterentwickelt werden kann. Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der travelbooking – MySQL Datenbank:

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

Als Ideengeber und Beispiel-Applikationsvorlage wurden die Spring WebFlow Examples hier verwendet mit dem folgenden Spring WebFlow Booking hier.

In der pom.xml des jeweiligen Beispielprojekts nach erfolgtem Download erkennbar, wurden in der Applikation travelbookingwizard-primefaces ebenfalls die folgenden JEE 7 Artefakte für den JBoss WildFly identifiziert, verwendet und importiert:

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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. Die Aktivierung von CDI erfolgt mittels beans.xml im WEB-INF Verzeichnis.

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

Primefaces 6:

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 in den vorigen Blog-Einträgen beschrieben.

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-6.0.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>6.0</version>
</dependency>

Allein durch Änderung dieses Eintrags in der pom.xml kann jederzeit auch auf die gewünschte Primefaces-Version umgestellt werden. Bei der Ausprogrammierung der XHTML-Views auf Primefaces sind der Primefaces Showcase und der neue Primefaces 6.0 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.

Aktiviert werden die Primefaces-Tags in der gewünschten XHTML-Seite mittels folgendem Namespace 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 ansonsten nahezu identisch zu den ManagedBeans der MyFaces-Applikationen. Weitere Informationen zu JSF 2.2, CDI und Primefaces finden sich auch hier im Blog von Balus C. Detail-Informationen zur JavaScript-Bibliothek jQuery, die vom Primefaces-Framework sehr intensiv verwendet wird, finden sich hier: jquery.org

forge.taglib.xml:

Die in den Beispiel-Applikationen verwendete, moderne Forge TagLib kann sehr einfach erweitert werden, indem die zusätzlich benötigten Methoden in der ViewUtils-Klasse ergänzt werden und deren Signaturen in der forge.taglib.xml im Verzeichnis src/main/webapp/WEB-INF/classes/META-INF/ bekanntgemacht werden, also genau wie bei klassischen TagLibs mit dem Unterschied, dass die verwendeten Tags innerhalb der Applikation in der ViewUtils-Klasse implementiert werden, was für die Applikation zusätzliche Sicherheit bringt. Diese Tags sind für jede Applikation sehr leicht adaptierbar und können genau auf die Applikation zugeschnitten werden. 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-Applikation travelbookingwizard-primefaces:

<?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.travelbooking.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.travelbooking.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.travelbooking.view.ViewUtils</function-class>
<function-signature>
int count(java.util.Collection)
</function-signature>
</function>

<function>
<function-name>displayShort</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayShort(java.lang.Object, int)
</function-signature>
</function>

<function>
<function-name>displayRange</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayRange(java.lang.Object,java.lang.Object)
</function-signature>
</function>

<function>
<function-name>displayFirst</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayFirst(java.lang.Object)
</function-signature>
</function>

<function>
<function-name>listExcludingSelectedOne</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.util.List listExcludingSelectedOne(java.util.Collection,java.lang.Object)
</function-signature>
</function>
</facelet-taglib>

Mit entsprechenden Implementierungen der Tag-Funktionalitäten in der ViewUtils-Klasse unter Verwendung generischer Typen T und Collections List<T>.

Über Tags, TagLibs und die Erweiterung bestehender und die Definition eigener Tags gibt es bereits einen Blog-Eintrag und durch die soeben gezeigten Beispiele ist erkennbar, wie simpel es ist, eigene Tags für die .xhtml-Views heutiger JSF 2-Applikationen zu definieren und deren Utility functions-Signaturen im WEB-INF/classes/META-INF-Verzeichnis des classpaths als *name*-taglib.xml mit dem genannten XML Document-Header und dem jboss-forge-view namespace zu deklarieren (s.o. forge.taglib.xml).

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

Konfiguration des JBoss WildFly Application Servers

Die Konfiguration des JBoss WildFly Application Servers 10 Final und JBoss WildFly Application Servers 11 Final bzw. neuerer Versionen (z. B. JBoss WildFly Application Server 12 Final) erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2 und 9 Final und betrifft die Datasource, das Logging und den Connection Pool und ist, genau wie die Test-Frameworks und die Aktivierung der RESTful WebService-Schnittstelle in vorigen Blog-Einträgen bereits beschrieben. Wie die MySQL-Datenbank Inno DB 5.x zu konfigurieren ist, wurde ebenfalls in einem bereits vorhandenen Blog-Eintrag beschrieben.

Die Primefaces Beispiel-Applikation arbeitet über die RESTful WebService-Schnittstelle auf der MySQL-InnoDB. Für die Primefaces Beispiel-Applikation kann folgendes mit HeidiSQL erstellte MySQL 5.x Datenbank-Skript verwendet werden. Hier auch die Datasource Definition:

<datasource jndi-name=“java:jboss/datasources/TravelbookingDatasource“ pool-name=“TravelbookingDS“ enabled=“true“>
                    <connection-url>jdbc:mysql://localhost:3306/travelbooking</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 Password]</password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>32</prepared-statement-cache-size>
                        <share-prepared-statements>true</share-prepared-statements>
                    </statement>
</datasource>

Die Hibernate-Konfiguration der WildFly Application Server ist ebenfalls leicht durchführbar und wurde bereits in einem Blog-Eintrag in diesem Blog hier beschrieben.

Die fertige Beispiel-Applikation travelbookingwizard-primefaces kann leicht selbst deployt werden und kann ebenfalls hier auf dem Test-Server aufgerufen und danach eine Beispiel Hotelzimmer-Buchung erstellt werden.

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

“TDD mit Java”

von Binaris Informatik erwähnt werden.

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

JBoss Developer Studio Projekt:

travelbookingwizard-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. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank für den WildFly 9 und den WildFly 10 gibt es hier mehr Informationen in diesem Blog.

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 anzupassen, damit dieser auf das tatsächliche JDK 8 – Verzeichnis des Server-Systems zeigt.

Hier auch der WildFly 11 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Voraussetzung ist jeweils Java 8. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9 und WildFly 10 durchzuführen sind.

Der fertig konfigurierte WildFly 11.Final mit vielen Beispiel-Applikationen der vorangegangenen Blog-Einträge ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK zeigt.

Hier auch der WildFly 18 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Empfohlen ist hier Java 11 (Amazon Corretto). Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9, 10, 11 und 12 durchzuführen sind.

Der fertig konfigurierte WildFly 18.Final mit der travelbookingwizard-primefaces Beispiel-Applikation dieses Blog-Eintrags ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java11 (Amazon Coretto) fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

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

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

Wie man sieht, macht es viel Freude, JEE-Applikationen mit der vorteilhaften Primefaces-Technologie zu entwickeln und ebenfalls, zuvor die Faces-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und weiterzuentwickeln.

Es ist also sehr wahrscheinlich, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces, Angular JS und Faces und den die JEE-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 eine schöne Winterzeit.

WebApps – mit REST, JPA 2, EJB 3.2, JSF 2.2, Angular JS, Bootstrap, JBoss Forge, Java 11, MySQL 5, Postgres 9, auf JBoss WildFly 9, 10, 11, 12 und 18

Die Motivation

In dem bereits vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer „Entity-Relationship-Diagramm“, auch E-R Diagramm genannt, eine JEE7-Applikation erstellt werden kann. Diese JEE6- und JEE7-Beispielapplikationen hier liefern mit Hilfe von 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 REST- Webservice Interfaces oder per Microservices mit DockerSpring Boot, siehe auch „ServiceBroker“-Pattern hier, die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren („ServiceConsumer“-Pattern).

Die Beispiel-Applikation

Die JEE 7 Beispiel-Applikation ‘cultureadmin-primefaces‘ arbeitet mit der JSF 2.2 Primefaces 6 Implementierung auf Basis der Template-Technologie und ermöglicht die leichte Pflege von und die Suche nach kulturellen Veranstaltungen bestimmter Kategorien und der erforderlichen Ticketverkaufsstellen.

Mittels JBoss Forge werden sowohl JSF 2.2 Benutzerschnittstellen verfügbar gemacht, als auch die Angular JS GUIs der zweiten JEE 7 Beispiel-Applikation ‘cultureadmin-angularjs‘. Mit dieser zweiten, responsiven Applikation kann sich der Interessent kultureller Veranstaltungen auch unterwegs im Browser auf seinem Smartphone die Daten der Veranstaltungen ansehen und verwalten, oder z. B. nach den besten Ticketverkaufsstellen suchen. Durch diese zwei simplen, übersichtlichen JEE-Beispielprojekten wird die Verwendung und Effektivität der eingesetzten Technologien gezeigt.

Das Durchsuchen und die Nutzung einer Pagination der Ergebnisliste ist ebenfalls in der ‘cultureadmin-angularjs‘ Beispiel-App enthalten, wie auch mit Hilfe des Angular JS Frameworks und des Bootstrap-Frameworks eine dynamische Benutzeroberfläche, die sich an beliebige Auflösungen und Display-Größen responsiv anpasst. Die ausprogrammierte JEE7-Applikation cultureadmin- angularjs mit dem Angular JS-Frontend und dem JEE-Backend mit den JPA 2 Entities kann einfach an verschiedene relationale Datenbanken (z. B. MySQL 5.x oder Postgres 9.x) angebunden werden, weshalb auch die benötigten kompletten SQL-Export/-Import-Skripte zur Verfügung gestellt werden.

Die Beispiel-Applikation cultureadmin- angularjs wird dann auf den JBoss WildFly 9, 10 und 11, 12 und 18 Final Servern deployt (dabei entspricht der WildFly 10 technologisch dem JBoss EAP 7-Server). Die Verwendung dieser JBoss WildFly JEE7-Application Server ist bereits in einem Blog-Eintrag beschrieben worden.

Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der cultureadmin – MySQL Datenbank:

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

Erstellung der Beispiel Applikation aus dem Datenmodell

Mittels DBeaver wird das Klassendiagramm der Entities aus den Datenbank-Objekten erstellt und aus diesen, nach dem Anlegen der Datenbank per Hibernate Envers während dem WildFly 18 Undertow Deployment mittels JBoss Forge Eclipse PlugIn im JBoss Developer Studio erst der REST-WebService mit den Endpoints generiert und danach die Angular JS WebApp auf diesem RESTful WebService. 

Dabei darf positiv erwähnt werden, dass man mittels JBoss Forge eine saubere, stringente Architektur in die JEE7-Applikation einbringt, die beim Weiterentwickeln der App sehr hilfreich ist und sowohl die Entwicklungszeit-Performance als auch die Codequalität deutlich steigert. Danke, JBoss Rockstars!

Bei dieser Gelegenheit darf auch das sehr effektive, interessante und erfolgreiche Seminar über Test-driven Development

TDD mit Java

hier von Binaris Informatik erwähnt werden.

Verwendete Technologien

a) Die Beispiel-Applikation ‘cultureadmin- angularjs’:

Die Beispiel-Applikation ‘cultureadmin-angularjs‘ verwendet im Frontend Angular.js und HTML5-/CSS3, als auch die JavaScript-Bibliotheken Bootstrap.js und in sehr geringem Maß jQuery.

Das MVC Framework ‘Angular JS‘ ermöglicht bekanntlich unter Einsatz des Router Design Patterns und des Front Controller Design Patterns das Erstellen von responsiven (Mobile) Applikationen zur über ein Service Interface verfügbaren Daten aus einem RESTful WebService.

In AngularJS werden mit HTML-Code deklarativ die Oberflächen gestaltet. Ein weiterer Aspekt dabei ist, dass Anwendungslogik nur in den JavaScript-Dateien definiert wird. Dieser sollte weitmöglichst unabhängig von der Benutzeroberfläche bzw. der Anwender-Schnittstelle (User interface) sein. Im Gegensatz zu anderen MVC-Frameworks erweitert AngularJS den HTML-Code, anstatt diesen komplett zu kapseln.

Um einen Bereich einer HTML-Seite von AngularJS verwalten zu lassen, muss dieser von einem Element mit dem Attribut ‘ng-app’ umschlossen sein. Nach dem Laden der Seite sucht AngularJS nach dem Atrribut ‘ng-app’ und analysiert den davon umschlossenen Bereich. ‘Controller’ werden in AngularJS mit dem Attribut ‘ng-controller’ definiert. Controller und View kommunizieren über den ‘Scope’, einen Container auf dessen Inhalt von beiden Seiten aus zugegriffen werden kann. Mit der ‘{{}}’ Notation kann mittels einem One-Way-Binding im HTML auf Elemente des ‘Scope’ zugegriffen werden. Die Daten können angezeigt, aber nicht zurückgeschrieben werden. Two-Way-Bindings ermöglichen auch das Schreiben in den ‘Scope’ und können logischerweise nur an HTML-Input-Elementen verwendet werden.

Eine Iteration über alle Elemente einer list kann in AngularJS mit der Anweisung ‘ng-repeat’ erfolgen, wie im Beispiel ‘cultureadmin-angularjs‘ zu sehen ist. Innerhalb jedes ‘<li>‘ Elementes wird dann z. B. der Inhalt der Property ‘text’ jedes Listenelementes ausgegeben, welches in der Beispiel-Applikation für das jeweilige Edit-Template innerhalb des jeweilgen JavaScript edit*Controllers an die Erfordernisse angepasst werden kann und für das jeweilige Search-Template innerhalb der jeweiligen search.html.

b) Das RESTful WebService-Backend der Beispiel-Applikation:

Für das JAX-RS Service-Backend der Beispiel-Applikation kommt Java EE zum Einsatz (Stateful/Stateless EJB 3.2 und JEE 7) und im Backend Model JPA 2.1 Entities. Über ein Service Interface werden die interessierenden Daten der Beispiel-Applikationen aus den Endpoints des RESTful WebService verfügbar gemacht.

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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

Die Aktivierung von CDI erfolgt, wie beschrieben, mittels beans.xml im WEB-INF Verzeichnis der Beispielapplikation.

WildFly Anbindung an MySQL5, Postgres 9 und deklarative WildFly 11 Hibernate-Konfiguration

Die Konfiguration des JBoss WildFly Application Servers 18 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2, 9, 10, 11, 12 und 18 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 ein wichtiges Thema, welches noch genauer beschrieben werden wird. Die Anbindung an die relationale  Datenbank MySQL 5 erfolgt übrigens analog für die JBoss Application Server WildFly 8.1, 8.2, 9, 10 und WildFly 11, 12 und 18.

Je nach verwendeter Datenbank kann in der persistence.xml im Deployment-Paket der Beispiel-App cultureadmin-angularjs.war ein entsprechender Datenbank-Dialekt eingetragen werden:

Hier die /META-INF/persistence.xml der Beispiel-Applikation für MySQL5:

    <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=“CultureadminPU“>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>
            java:jboss/datasources/CultureadminDatasource
    </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 je Datenbank die folgende Datasource benötigt und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

Für MySQL 5:

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

Für Postgres 9:

    <datasource jndi-name=“java:jboss/datasources/CultureadminDatasource“ pool-name=“CultureadminDS“ enabled=“true“>
    <connection-url>jdbc:postgresql://localhost:5432/cultureadmin</connection-url>
    <driver>postgresql-9.4.1209.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 Password]</password>
    </security>
    <statement>
    <prepared-statement-cache-size>32</prepared-statement-cache-size>
    <share-prepared-statements>true</share-prepared-statements>
    </statement>
    </datasource>

Für die erfolgreiche Anbindung der soeben deklarierten Datasoures werden die Datenbank-Treiber auf Modul-Ebene des JBoss WildFly konfiguriert, wie hier für den MySQL JDBC4 Treiber beispielhaft auf dem WildFly 8.2 beschrieben wurde.

Damit die Datasources die soeben konfigurierten Treiber auch finden, werden diese in der /standalone/configuration/standalone.xml bei den <datasources> deklariert:

Für Postgres 9:

<driver name=“postgresql-java-9.4.1209.jar“ module=“org.postgresql“>
   <driver-class>org.postgresql.Driver</driver-class>
   <xa-datasource-class>org.postgresql.xa.PGXADataSource
   </xa-datasource-class>
</driver>

Für MySQL 5:

<driver name=“mysql-connector-java-5.1.34.jar“ module=“com.mysql“>
   <driver-class>com.mysql.jdbc.Driver</driver-class>
   <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
   </xa-datasource-class>
</driver>

Die Hibernate-Konfiguration des WildFly 11 Final Servers ist ebenfalls leicht durchführbar. Hierfür werden im WildFly11 Server-Verzeichnis wildfly-11.0.0.Final/modules/system/layers/base/org/hibernate/main folgende Dateien hinterlegt:

– hibernate-core-5.1.10.Final.jar
– hibernate-entitymanager-5.1.10.Final.jar
– hibernate-envers-5.1.10.Final.jar
– hibernate-java8-5.1.10.Final.jar
– jipijapa-hibernate5-11.0.0.Final.jar
– module.xml
– mysql-connector-java-5.1.34.jar
– mysql-connector-java-5.1.34.jar.index

Dies läuft für die Application Server WildFly 12  und 18 Final ganz analog. Die fertige Beispiel-Applikation cultureadmin-angularjs kann zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden (MySQL5 Server, Postgres 9 auf Linux).

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, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und auch der Pfad für das log-Dateien Verzeichnis in der Datei [server]/standalone/configuration/logging.properties.

Hier auch der WildFly 11 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Minimale Voraussetzung ist jeweils Java 8, er wird hier aber bereits mit Java 9 betrieben. Der fertig konfigurierte WildFly 11 mit vielen weiteren Beispiel-Applikationen ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden.

Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK 9–Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties. Die Verwendung und Konfiguration des neuen WildFly 12 wird noch genauer besprochen, läuft aber prinzipiell genauso. Die Download-Links für den WildFly 12 Final gibt es für  Linux hier und für Windows hier.

Der fertig konfigurierte WildFly 18 Final mit Beispiel-Applikationen dieses Blogs ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java11 Amazon Coretto fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

Hier auch nochmal die ausführliche Dokumentation einer weiteren JEE Beispielapplikation mit Selenium-Tests und Javascript QUnit-Tests.

Hier das Angular JS „cultureadmin-angularjs“ Beispiel-Projekt für die Eclipse-Entwicklungsumgebung JBoss Developer Studio:

cultureadmin-angularjs

Fazit: Wie man sieht, macht es einfach viel Freude, z.B. mittels JBoss Forge und JPA 2 Entities die responsiven Angular JS Apps auf dem Datenmodell zu erzeugen und weiterzuentwickeln oder eben robuste, komfortable, Browser-basierte Primefaces 6-Fontends, sei es nun für mobile IMS (Informations-Management-Systeme) oder für PIMS (Product Information Management Systems) und diese an einen neuen, die JEE7-Spezifikation erfüllenden JBoss WildFly (WildFly 9 – 18 Final)  anzubinden.

Somit besteht durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces 6, Angular JS und Bootstrap, sowie den die JEE7-Spezifikation oder JEE8-Spezifikation implementierenden WebService-und Backend-Technologien folgen. Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test-Driven Development mit Java, sowie noch einen schönen Halloween.

WebApps – mit JPA 2, JSF 2.2, Primefaces 6, REST, JEE7, Java 8 auf JBoss WildFly

Die Motivation

Über die Migration von RichFaces und MyFaces Beispiel-Applikationen auf die sehr vorteilhafte Primefaces 6-Technologie gibt es bereits Blog-Einträge in diesem Blog hier. In diesem Blog-Eintrag soll nun nach einem Datenmodell eine Primefaces 6 Beispiel-Webapplikation zur Administration kultureller Veranstaltungen erstellt werden. Dabei werden als Basis-Frontendtechnologien JSF 2.2 und Primefaces 6 verwendet. Weiterhin wird der Einsatz moderner Tag-Libs in den XHTML-Seiten der JEE7-Applikation erklärt.

Bei dieser Gelegenheit darf auch das sehr effektive, interessante und erfolgreiche Seminar über Test-driven Development

TDD mit Java

hier von Binaris Informatik erwähnt werden.

Es wird also eine weitere  Primefaces 6 Beispiel-Applikation cultureadmin-primefaces entwickelt, unter Einsatz der robusten, aber stets elegant gestylten, etablierten, optimalen Primefaces Frontend-Technologie. Die Beispiel-Applikation cultureadmin-primefaces wird dann auf einem JBoss WildFly Test-Server der Versionsnummer 9 Final oder höher deployt. Dabei ist die Verwendung der JBoss WildFly JEE-Application Server in diesem Blog-Eintrag hier bereits beschrieben worden.

Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der cultureadmin – MySQL Datenbank:

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

Erstellung der Beispiel Applikation aus dem Datenmodell

Wie die Applikation cultureadmin-primefaces mittels JBoss Forge erstellt werden kann, ist bereits analog in diesem Blog-Eintrag hier für die Applikation travelbooking-primefaces beschrieben worden, und wie in der pom.xml des jeweiligen Beispielprojekts nach erfolgtem Download erkennbar ist, wurden auch in der Applikation cultureadmin-primefaces die folgenden JEE 7 Artefakte für den JBoss WildFly identifiziert, verwendet und importiert:

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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. Die Aktivierung von CDI erfolgt mittels beans.xml im WEB-INF Verzeichnis.

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

Primefaces 6:

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 in den vorigen Blog-Einträgen beschrieben.

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-6.0.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>6.0</version>
</dependency>

Allein durch Änderung dieses Eintrags in der pom.xml kann jederzeit auch auf die gewünschte Primefaces-Version umgestellt werden. Bei der Ausprogrammierung der XHTML-Views auf Primefaces sind der Primefaces Showcase und der neue Primefaces 6.0 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.

Aktiviert werden die Primefaces-Tags in der gewünschten XHTML-Seite mittels folgendem Namespace 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 ansonsten nahezu identisch zu den ManagedBeans der MyFaces-Applikationen. Weitere Informationen zu JSF 2.2, CDI und Primefaces finden sich auch hier im Blog von Balus C. Detail-Informationen zur JavaScript-Bibliothek jQuery, die vom Primefaces-Framework sehr intensiv verwendet wird, finden sich hier: jquery.org

forge.taglib.xml:

Die in den Beispiel-Applikationen verwendete, moderne Forge TagLib kann sehr einfach erweitert werden, indem die zusätzlich benötigten Methoden in der ViewUtils-Klasse ergänzt werden und deren Signaturen in der forge.taglib.xml im Verzeichnis src/main/webapp/WEB-INF/classes/META-INF/ bekanntgemacht werden, also genau wie bei klassischen TagLibs mit dem Unterschied, dass die verwendeten Tags innerhalb der Applikation in der ViewUtils-Klasse implementiert werden, was für die Applikation zusätzliche Sicherheit bringt. Diese Tags sind für jede Applikation sehr leicht adaptierbar und können genau auf die Applikation zugeschnitten werden. 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-Applikation cultureadmin-primefaces:

<?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.cultureadmin.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.cultureadmin.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.cultureadmin.view.ViewUtils</function-class>
<function-signature>
int count(java.util.Collection)
</function-signature>
</function>

<function>
<function-name>displayShort</function-name>
<function-class>de.binaris.cultureadmin.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayShort(java.lang.Object, int)
</function-signature>
</function>

<function>
<function-name>displayRange</function-name>
<function-class>de.binaris.cultureadmin.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayRange(java.lang.Object,java.lang.Object)
</function-signature>
</function>

<function>
<function-name>displayFirst</function-name>
<function-class>de.binaris.cultureadmin.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayFirst(java.lang.Object)
</function-signature>
</function>

<function>
<function-name>listExcludingSelectedOne</function-name>
<function-class>de.binaris.cultureadmin.view.ViewUtils</function-class>
<function-signature>
java.util.List listExcludingSelectedOne(java.util.Collection,java.lang.Object)
</function-signature>
</function>
</facelet-taglib>

Mit entsprechenden Implementierungen der Tag-Funktionalitäten in der ViewUtils-Klasse unter Verwendung generischer Typen T und Collections List<T>.

Über Tags, TagLibs und die Erweiterung bestehender und die Definition eigener Tags gibt es bereits einen Blog-Eintrag und durch die soeben gezeigten Beispiele ist erkennbar, wie simpel es ist, eigene Tags für die .xhtml-Views heutiger JSF 2-Applikationen zu definieren und deren Utility functions-Signaturen im WEB-INF/classes/META-INF-Verzeichnis des classpaths als *name*-taglib.xml mit dem genannten XML Document-Header und dem jboss-forge-view namespace zu deklarieren (s.o. forge.taglib.xml).

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

WildFly Anbindung an MySQL5 und deklarative WildFly 11 Hibernate-Konfiguration

Die Konfiguration des JBoss WildFly Application Servers 18 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2, 9, 10, 11, 12 und 18 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 ein wichtiges Thema, welches noch genauer beschrieben werden wird. Die Anbindung an die relationale Datenbank MySQL 5 erfolgt übrigens analog für die JBoss Application Server WildFly 8.1, 8.2, 9, 10 und WildFly 11, 12 und 18.

Je nach verwendeter Datenbank kann in der persistence.xml im Deployment-Paket der Beispiel-App cultureadmin-primefaces.war ein entsprechender Datenbank-Dialekt eingetragen werden:

Hier die /META-INF/persistence.xml der Beispiel-Applikation für MySQL5:

    <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=“CultureadminPU“>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>
            java:jboss/datasources/CultureadminDatasource
    </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 je Datenbank die folgende Datasource benötigt und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

Für MySQL 5:

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

Für die erfolgreiche Anbindung der soeben deklarierten Datasoures werden die Datenbank-Treiber auf Modul-Ebene des JBoss WildFly konfiguriert, wie hier für den MySQL JDBC4 Treiber beispielhaft auf dem WildFly 8.2 beschrieben wurde.

Damit die Datasources die soeben konfigurierten Treiber auch finden, werden diese in der /standalone/configuration/standalone.xml bei den <datasources> deklariert:

Für MySQL 5:

<driver name=“mysql-connector-java-5.1.34.jar“ module=“com.mysql“>
   <driver-class>com.mysql.jdbc.Driver</driver-class>
   <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
   </xa-datasource-class>
</driver>

Die Hibernate-Konfiguration des WildFly 11 Final Servers ist ebenfalls leicht durchführbar. Hierfür werden im WildFly11 Server-Verzeichnis wildfly-11.0.0.Final/modules/system/layers/base/org/hibernate/main folgende Dateien hinterlegt:

– hibernate-core-5.1.10.Final.jar
– hibernate-entitymanager-5.1.10.Final.jar
– hibernate-envers-5.1.10.Final.jar
– hibernate-java8-5.1.10.Final.jar
– jipijapa-hibernate5-11.0.0.Final.jar
– module.xml
– mysql-connector-java-5.1.34.jar
– mysql-connector-java-5.1.34.jar.index

Dies läuft für die Application Server WildFly 12  und 18 Final ganz analog. Die fertige Beispiel-Applikation cultureadmin-primefaces kann zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden (MySQL5 Server, Postgres 9 auf Linux).

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, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und auch der Pfad für das log-Dateien Verzeichnis in der Datei [server]/standalone/configuration/logging.properties.

Hier auch der WildFly 11 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Minimale Voraussetzung ist jeweils Java 8, er wird hier aber bereits mit Java 9 betrieben. Der fertig konfigurierte WildFly 11 mit vielen weiteren Beispiel-Applikationen ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden.

Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK 9–Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties. Die Verwendung und Konfiguration des neuen WildFly 12 wird noch genauer besprochen, läuft aber prinzipiell genauso. Die Download-Links für den WildFly 12 Final gibt es für  Linux hier und für Windows hier.

Der fertig konfigurierte WildFly 18 Final mit Beispiel-Applikationen dieses Blogs ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java11 fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

Hier auch nochmal die ausführliche Dokumentation einer weiteren JEE Beispielapplikation mit Selenium-Tests und Javascript QUnit-Tests.

Hier das Primefaces „cultureadmin-primefaces“ Beispiel-Projekt für die Eclipse-Entwicklungsumgebung JBoss Developer Studio:

cultureadmin-primefaces

Und hier das Primefaces „cultureadmin-primefaces“ Beispiel-Projekt für die intelliJ-Entwicklungsumgebung:

cultureadmin-primefaces

Es besteht also durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces, Angular JS und Faces und den die JEE7-Spezifikation oder JEE8-Spezifikation implementierenden WebService-und Backend-Technologien folgen.
Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test Driven Development mit Java, sowie einen angenehmen Herbstanfang und ein fröhliches Erntedankfest.

WebApps – mit Angular JS, JQuery, REST, JEE7, JBoss Forge, Java 11, MySQL 5, Postgres 9, auf JBoss WildFly 9, 10, 11, 12 und 18

Die Motivation

In dem bereits vorhandenen Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 wurde beschrieben, wie von einem Klassen-Diagramm (UML), genauer „Entity-Relationship-Diagramm“, auch E-R Diagramm genannt, eine JEE7-Applikation erstellt werden kann. Diese JEE6- und JEE7-Beispielapplikationen hier liefern mit Hilfe von 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 REST- Webservice Interfaces oder per Microservices mit Docker, Spring Boot, siehe auch „ServiceBroker“-Pattern hier, die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren („ServiceConsumer“-Pattern).

Das Durchsuchen, und die Nutzung einer Pagination der Ergebnisliste ist ebenfalls in der Beispiel-App enthalten, wie auch mit Hilfe des Angular JS Frameworks und des Bootstrap-Frameworks eine dynamische Benutzeroberfläche, die sich an beliebige Auflösungen und Display-Größen responsiv anpasst.

Die ausprogrammierte JEE7-Applikation employeetimetracker- angularjs mit dem Angular JS-Frontend und dem JEE-Backend mit den JPA 2 Entities kann einfach an verschiedene relationale Datenbanken (z. B. MySQL 5.x oder Postgres 9.x) angebunden werden, weshalb auch die benötigten kompletten SQL-Export/-Import-Skripte zur Verfügung gestellt werden.

Die Beispiel-Applikation employeetimetracker-angularjs wird dann auf den JBoss WildFly 9, 10 und 11, 12 und 18 Final Servern deployt (dabei entspricht der WildFly 10 technologisch dem JBoss EAP 7-Server). Die Verwendung dieser JBoss WildFly JEE7-Application Server ist bereits in einem Blog-Eintrag beschrieben worden.

Erstellung der Beispiel Applikation auf dem Datenmodell

Mittels DBeaver wird das Klassendiagramm der Entities aus den Datenbank-Objekten erstellt und aus diesen, nach dem Anlegen der Datenbank per Hibernate Envers während dem WildFly 18 Undertow Deployment mittels JBoss Forge Eclipse PlugIn im JBoss Developer Studio erst der REST-WebService mit den Endpoints generiert und danach die Angular JS WebApp auf diesem RESTful WebService. Hier das E-R-Diagramm der Employeetimetracker-Datenbank:

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

Dabei darf positiv erwähnt werden, dass man mittels JBoss Forge eine saubere, stringente Architektur in die JEE7-Applikation einbringt, die beim Weiterentwickeln der App sehr hilfreich ist und sowohl die Entwicklungszeit-Performance als auch die Codequalität deutlich steigert. Danke, JBoss Rockstars!

Bei dieser Gelegenheit darf auch das sehr effektive, interessante und erfolgreiche Seminar über Test-driven Development

TDD mit Java

hier von Binaris Informatik erwähnt werden.

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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

Die Aktivierung von CDI erfolgt, wie beschrieben, mittels beans.xml im WEB-INF Verzeichnis der Beispielapplikation.

Auf die Architektur und verwendeten Design Patterns der Beispiel-Applikationen wird noch genauer eingegangen.

WildFly Anbindung an MySQL5, Postgres 9 und deklarative WildFly 11 Hibernate-Konfiguration

Die Konfiguration des JBoss WildFly Application Servers 18 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2, 9, 10, 11, 12 und 18 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 ein wichtiges Thema, welches noch genauer beschrieben werden wird. Die Anbindung an die relationale  Datenbank MySQL 5 erfolgt übrigens analog für die JBoss Application Server WildFly 8.1, 8.2, 9, 10 und WildFly 11, 12 und 18.

Je nach verwendeter Datenbank kann in der persistence.xml im Deployment-Paket der Beispiel-App employeetimetracker-angularjs.war ein entsprechender Datenbank-Dialekt eingetragen werden:

Hier die /META-INF/persistence.xml der Beispiel-Applikation für MySQL5:

    <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=“EmployeetimetrackerPU“>
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>
            java:jboss/datasources/EmployeetimetrackerDatasource
    </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 je Datenbank die folgende Datasource benötigt und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

Für MySQL 5:

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

Für Postgres 9:

    <datasource jndi-name=“java:jboss/datasources/EmployeetimetrackerDatasource“ pool-name=“EmployeetimetrackerDS“ enabled=“true“>
    <connection-url>jdbc:postgresql://localhost:5432/employeetimetracker</connection-url>
    <driver>postgresql-9.4.1209.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 Password]</password>
    </security>
    <statement>
    <prepared-statement-cache-size>32</prepared-statement-cache-size>
    <share-prepared-statements>true</share-prepared-statements>
    </statement>
    </datasource>

Für die erfolgreiche Anbindung der soeben deklarierten Datasoures werden die Datenbank-Treiber auf Modul-Ebene des JBoss WildFly konfiguriert, wie hier für den MySQL JDBC4 Treiber beispielhaft auf dem WildFly 8.2 beschrieben wurde.

Damit die Datasources die soeben konfigurierten Treiber auch finden, werden diese in der /standalone/configuration/standalone.xml bei den <datasources> deklariert:

Für Postgres 9:

<driver name=“postgresql-java-9.4.1209.jar“ module=“org.postgresql“>
   <driver-class>org.postgresql.Driver</driver-class>
   <xa-datasource-class>org.postgresql.xa.PGXADataSource
   </xa-datasource-class>
</driver>

Für MySQL 5:

<driver name=“mysql-connector-java-5.1.34.jar“ module=“com.mysql“>
   <driver-class>com.mysql.jdbc.Driver</driver-class>
   <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
   </xa-datasource-class>
</driver>

Die Hibernate-Konfiguration des WildFly 11 Final Servers ist ebenfalls leicht durchführbar. Hierfür werden im WildFly11 Server-Verzeichnis wildfly-11.0.0.Final/modules/system/layers/base/org/hibernate/main folgende Dateien hinterlegt:

– hibernate-core-5.1.10.Final.jar
– hibernate-entitymanager-5.1.10.Final.jar
– hibernate-envers-5.1.10.Final.jar
– hibernate-java8-5.1.10.Final.jar
– jipijapa-hibernate5-11.0.0.Final.jar
– module.xml
– mysql-connector-java-5.1.34.jar
– mysql-connector-java-5.1.34.jar.index

Dies läuft für die Application Server WildFly 12  und 18 Final ganz analog. Die fertige Beispiel-Applikation employeetimetracker-angularjs kann zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden (MySQL5 Server, Postgres 9 auf Linux).

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, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und auch der Pfad für das log-Dateien Verzeichnis in der Datei [server]/standalone/configuration/logging.properties.

Hier auch der WildFly 11 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Minimale Voraussetzung ist jeweils Java 8, er wird hier aber bereits mit Java 9 betrieben. Der fertig konfigurierte WildFly 11 mit vielen weiteren Beispiel-Applikationen ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden.

Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK 9–Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties. Die Verwendung und Konfiguration des neuen WildFly 12 wird noch genauer besprochen, läuft aber prinzipiell genauso. Die Download-Links für den WildFly 12 Final gibt es für  Linux hier und für Windows hier.

Der fertig konfigurierte WildFly 18 Final mit Beispiel-Applikationen dieses Blogs ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java11 (Amazon Coretto -ja, fast genau wie die Eismarke) fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

Hier auch nochmal die ausführliche Dokumentation einer weiteren JEE Beispielapplikation mit Selenium-Tests und Javascript QUnit-Tests.

Hier das Angular JS „employeetimetracker-angularjs“ Beispiel-Projekt für die Eclipse-Entwicklungsumgebung JBoss Developer Studio:

employeetimetracker-angularjs

Fazit: Wie man sieht, macht es einfach viel Freude, z.B. mittels JBoss Forge und JPA 2 Entities die responsiven Angular JS Apps auf dem Datenmodell zu erzeugen und weiterzuentwickeln oder eben robuste, komfortable, Browser-basierte Primefaces 6-Fontends, sei es nun für mobile IMS (Informations-Management-Systeme) oder für PIMS (Product Information Management Systems) und diese an einen neuen, die JEE7-Spezifikation erfüllenden JBoss WildFly (WildFly 9 – 18 Final)  anzubinden.

Somit besteht durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces 6, Angular JS und Bootstrap, sowie den die JEE7-Spezifikation oder JEE8-Spezifikation implementierenden WebService-und Backend-Technologien folgen. Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test-Driven Development mit Java, sowie noch schöne Sommerferien.

WebApps – mit Primefaces 6, JSF 2, JPA 2, EJB 3, JEE7, REST auf WildFly 9, 10, 11, 12, und 18

Die Motivation

Über Beispiel-Applikationen zu der der sehr vorteilhaften Primefaces 6-Technologie gibt es bereits Blog-Einträge in diesem Blog hier. In diesem Blog-Eintrag soll nun nach dem zugrundeliegenden relationalen Datenmodell eine Primefaces 6 Beispiel-Webapplikation travelbooking-primefaces für eine MySQL 5 Datenbank Datenbank erstellt werden. Dabei wird als Basis-Frontendtechnologie JSF 2 in der Primefaces 6-Implementierung auf dem WildFly 9, 10, 11, 12 und 18 verwendet. Die WildFly Server 9, 19, 11, und 12 verwenden als Java Runtime dabei Java 8 und WildFly 18 läuft in diesem Blog mit Java 11 Amazon Corretto. Weiterhin wird der Einsatz moderner Tag-Libs in den XHTML-Seiten der JEE7-Applikation erklärt. Mittels JBoss Forge Eclipse PlugIn wird die Primefaces 6 Beispiel-Applikation travelbooking-primefaces auf dem Datenmodell mit den JPA 2 Entities erstellt unter Einsatz von JSF 2 und der robusten, elegant gestylten, etablierten, optimalen Primefaces Frontend-Technologie.

Die Beispiel-Applikation travelbooking-primefaces wird dann auf den JBoss WildFly 9 Final, JBoss WildFly 10 Final, JBoss WildFly 11, JBoss WildFly 12 und JBoss WildFly 18 Application Servern deployt und getestet. Die Verwendung der JBoss WildFly JEE7-Application Server wurde in einem Blog-Eintrag in einem Blog-Eintrag dieses Blogs bereits einmal beschrieben. Dabei liefern die JEE6- und JEE7-Beispielapplikationen hier mit Hilfe eines 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 ServiceInterfaces die benötigten Daten zur Präsentation und Bearbeitung (Änderung, Löschen, Neuanlage) in den Web-Frontends, welche die WebServices konsumieren (ServiceConsumer-Pattern). Der JPA-Provider ist hier Hibernate von JBoss, wofür WildFly 9, 10, 11, 12 und 18 zu konfigurieren sind. Um es vorwegzunehmen wurde die Migration auf den WildFly 18 aus reinem Interesse durchgeführt und dabei Java 11 (Amazon Corretto) verwendet, wobei es für die Beispielapplikation nicht zwingend erforderlich ist. Mittels dem Criteria-API werden aus dem Backend die benötigten Daten für das Frontend gelesen, welche in der jeweiligen Reisebuchung (“Travelbooking“) dann auswählbar sind. Dabei wurde auf die Präsentation des Buchungsvorgangs als Wizard erstmal verzichtet. Zu Wizards gibt es bereits einen Beispiel-Eintrag in diesem Blog hier als Umfrage-Beispiel.

Erstellung der Beispiel Applikation nach Datenmodell

Wie die Applikation travelbooking-primefaces mittels JBoss Forge erstellt werden kann, ist bereits analog in diesem Blog-Eintrag hier für die soeben erwähnte Unfrage-Applikation surveyapplication-primefaces beschrieben worden und wie daraus die Travelbooking-Applikation weiterentwickelt werden kann. Hier das mittels DBeaver erstellte Entity-Relationship Diagramm der travelbooking – MySQL Datenbank:

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

Als Ideengeber und Beispiel-Applikationsvorlage wurden die Spring WebFlow Examples hier verwendet mit dem folgenden Spring WebFlow Booking hier.

In der pom.xml des jeweiligen Beispielprojekts nach erfolgtem Download erkennbar, wurden in der Applikation travelbooking-primefaces ebenfalls die folgenden JEE 7 Artefakte für den JBoss WildFly identifiziert, verwendet und importiert:

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Es 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 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. Die Aktivierung von CDI erfolgt mittels beans.xml im WEB-INF Verzeichnis.

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

Primefaces 6:

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 in den vorigen Blog-Einträgen beschrieben.

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-6.0.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>6.0</version>
</dependency>

Allein durch Änderung dieses Eintrags in der pom.xml kann jederzeit auch auf die gewünschte Primefaces-Version umgestellt werden. Bei der Ausprogrammierung der XHTML-Views auf Primefaces sind der Primefaces Showcase und der neue Primefaces 6.0 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.

Aktiviert werden die Primefaces-Tags in der gewünschten XHTML-Seite mittels folgendem Namespace 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 ansonsten nahezu identisch zu den ManagedBeans der MyFaces-Applikationen. Weitere Informationen zu JSF 2.2, CDI und Primefaces finden sich auch hier im Blog von Balus C. Detail-Informationen zur JavaScript-Bibliothek jQuery, die vom Primefaces-Framework sehr intensiv verwendet wird, finden sich hier: jquery.org

forge.taglib.xml:

Die in den Beispiel-Applikationen verwendete, moderne Forge TagLib kann sehr einfach erweitert werden, indem die zusätzlich benötigten Methoden in der ViewUtils-Klasse ergänzt werden und deren Signaturen in der forge.taglib.xml im Verzeichnis src/main/webapp/WEB-INF/classes/META-INF/ bekanntgemacht werden, also genau wie bei klassischen TagLibs mit dem Unterschied, dass die verwendeten Tags innerhalb der Applikation in der ViewUtils-Klasse implementiert werden, was für die Applikation zusätzliche Sicherheit bringt. Diese Tags sind für jede Applikation sehr leicht adaptierbar und können genau auf die Applikation zugeschnitten werden. 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-Applikation travelbooking-primefaces:

<?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.travelbooking.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.travelbooking.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.travelbooking.view.ViewUtils</function-class>
<function-signature>
int count(java.util.Collection)
</function-signature>
</function>

<function>
<function-name>displayShort</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayShort(java.lang.Object, int)
</function-signature>
</function>

<function>
<function-name>displayRange</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayRange(java.lang.Object,java.lang.Object)
</function-signature>
</function>

<function>
<function-name>displayFirst</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.lang.String displayFirst(java.lang.Object)
</function-signature>
</function>

<function>
<function-name>listExcludingSelectedOne</function-name>
<function-class>de.binaris.travelbooking.view.ViewUtils</function-class>
<function-signature>
java.util.List listExcludingSelectedOne(java.util.Collection,java.lang.Object)
</function-signature>
</function>
</facelet-taglib>

Mit entsprechenden Implementierungen der Tag-Funktionalitäten in der ViewUtils-Klasse unter Verwendung generischer Typen T und Collections List<T>.

Über Tags, TagLibs und die Erweiterung bestehender und die Definition eigener Tags gibt es bereits einen Blog-Eintrag und durch die soeben gezeigten Beispiele ist erkennbar, wie simpel es ist, eigene Tags für die .xhtml-Views heutiger JSF 2-Applikationen zu definieren und deren Utility functions-Signaturen im WEB-INF/classes/META-INF-Verzeichnis des classpaths als *name*-taglib.xml mit dem genannten XML Document-Header und dem jboss-forge-view namespace zu deklarieren (s.o. forge.taglib.xml).

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

Konfiguration des JBoss WildFly Application Servers

Die Konfiguration des JBoss WildFly Application Servers 10 Final und JBoss WildFly Application Servers 11 Final bzw. neuerer Versionen (z. B. JBoss WildFly Application Server 12 Final) erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2 und 9 Final und betrifft die Datasource, das Logging und den Connection Pool und ist, genau wie die Test-Frameworks und die Aktivierung der RESTful WebService-Schnittstelle in vorigen Blog-Einträgen bereits beschrieben. Wie die MySQL-Datenbank Inno DB 5.x zu konfigurieren ist, wurde ebenfalls in einem bereits vorhandenen Blog-Eintrag beschrieben.

Die Primefaces Beispiel-Applikation arbeitet über die RESTful WebService-Schnittstelle auf der MySQL-InnoDB. Für die Primefaces Beispiel-Applikation kann folgendes mit HeidiSQL erstellte MySQL 5.x Datenbank-Skript verwendet werden. Hier auch die Datasource Definition:

<datasource jndi-name=“java:jboss/datasources/TravelbookingDatasource“ pool-name=“TravelbookingDS“ enabled=“true“>
                    <connection-url>jdbc:mysql://localhost:3306/travelbooking</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 Password]</password>
                    </security>
                    <statement>
                        <prepared-statement-cache-size>32</prepared-statement-cache-size>
                        <share-prepared-statements>true</share-prepared-statements>
                    </statement>
</datasource>

Die Hibernate-Konfiguration der WildFly Application Server ist ebenfalls leicht durchführbar und wurde bereits in einem Blog-Eintrag in diesem Blog hier beschrieben.

Die fertige Beispiel-Applikation travelbooking-primefaces kann leicht selbst deployt werden und kann ebenfalls hier auf dem Test-Server aufgerufen und danach eine Beispiel Hotelzimmer-Buchung erstellt werden.

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

“TDD mit Java”

von Binaris Informatik erwähnt werden.

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

JBoss Developer Studio Projekt:

travelbooking-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. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank für den WildFly 9 und den WildFly 10 gibt es hier mehr Informationen in diesem Blog.

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 anzupassen, damit dieser auf das tatsächliche JDK 8 – Verzeichnis des Server-Systems zeigt.

Hier auch der WildFly 11 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Voraussetzung ist jeweils Java 8. Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9 und WildFly 10 durchzuführen sind.

Der fertig konfigurierte WildFly 11.Final mit vielen Beispiel-Applikationen der vorangegangenen Blog-Einträge ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche JDK zeigt.

Hier auch der WildFly 18 als Zip-Archiv zum Download und Entpacken, für Linux hier und für Windows hier. Empfohlen ist hier Java 11 (Amazon Corretto). Über die Konfiguration von Hibernate, der Datasource und der MySQL 5.x Datenbank wird ebenfalls auf bereits vorhandene Blog-Einträge hier verwiesen, da die Konfigurationen analog zum WildFly 9, 10, 11 und 12 durchzuführen sind.

Der fertig konfigurierte WildFly 18.Final mit der travelbooking-primefaces Beispiel-Applikation dieses Blog-Eintrags ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden. Der Pfad des JAVA_HOME braucht hierbei nicht angepasst zu werden, da dieser WildFly mit integriertem Java11 (Amazon Cornetto) fertig konfiguriert ist. Das Entzippen und Ausführen der WildFly18.0.1.Final/bin/standalone.bat genügt also, um den Application Server unter Windows mit der Java11 Runtime zu starten.

Die SQL-Skripte zum Anlegen und Befüllen der MySQL Beispiel-Datenbanken finden sich verlinkt in den Blog-Einträgen wieder, die hier durchsucht werden können, durch Eingabe eines Stichworts im Suche-Feld der Eingabemaske.

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

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

Wie man sieht, macht es viel Freude, JEE-Applikationen mit der vorteilhaften Primefaces-Technologie zu entwickeln und ebenfalls, zuvor die Faces-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und weiterzuentwickeln.

Es ist also sehr wahrscheinlich, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces, Angular JS und Faces und den die JEE-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 eine schöne Sommerzeit. Der Binaris Blog ist übrigens in der Sommerpause bis zum 07.August

WebApps – mit REST, JPA 2, EJB 3.2, Angular JS, JSF 2.2 auf JBoss WildFly 10

Die Beispiel-Applikation

Die JEE Beispiel-Applikation employeetimetracker mit JSF 2.2 arbeitet wie die weiteren JEE Beispiel-Applikationen hier mit der Template-Technologie und ermöglicht die leichte Pflege von und die Suche nach Zeiterfassungsdaten und Projektzeiten durch den Admin einer Mitarbeiter Arbeitszeiterfassungs- und Projektzeitertfassungs-Applikation. Die Beispiel-Applikation verwendet im Backend JPA 2 – Entities und  EJB 3.2.

Mit JBoss Forge wird sowohl das JSF 2.2 User Interface erzeugt, als auch die Angular JS GUIs der zweiten JEE  7 Beispiel-Applikation employeetimetracker-angularjs. Mit der zweiten, responsiven Applikation kann der Admin  der Employeetimetracker-Applikation auch unterwegs im Browser auf seinem Smartphone die zu pflegenden  Employeetimetracker-Stammdaten/-Bestandsdaten bearbeiten oder durchsuchen. Bei dieser Beispiel-Applikation wurden auf Basis zweier vorhandener Entity-Relationship-Diagramme (einmal Projektzeiterfassung und einmal  Arbeitszeiterfassung) gleich zwei Anwendungen innerhalb der selben Benutzerschnittstelle (Java Server Faces oder Angular JS) umgesetzt und testweise implementiert. Dadurch hat der Anwender die beiden Möglichkeiten, einfach nur seine Zeiten zu erfassen, oder eine gewünschte Projektzeiterfassung durchzuführen.

Hier das E-R-Diagramm der employeetimetracker-Datenbank:

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

Die Verwendung und Effektivität der eingesetzten JEE-Technologien und WebFrameworks wird durch diese simplen JEE7 Beispielprojekten belegt und die jeweils als .war Archiv verfügbaren empoyeetimetracker.war und empoyeetimetracker-angularjs.war werden per Deployment auf dem JBoss WildFly 10 Application Server zum Test zur Verfügung gestellt.

TDD der employeetimetracker Applikationen

Wie zusätzliche Selenium-Tests mit dem Selenium FireFox-PlugIn durchgeführt und diese Tests gespeichert  werden können, ist bereits in diesem Blog-Eintrag hier beschrieben. Diese Selenium Tests können gespeichert und in einer Test-Suite zusammengefasst werden, um auch später jederzeit die korrekte Funktionsweise der Eingabe-Aktionen und Link-Aufrufe der Responsiven Applikation automatisiert verifizieren zu können.

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

“TDD mit Java”   von Binaris Informatik hingewiesen werden.

Verwendete Technologien

a) Die Beispiel-Applikation employeetimetracker-angularjs:

Die Beispiel-Applikation employeetimetracker-angularjs verwendet im Frontend Angular.js und HTML5-/CSS3  und auch die JavaScript-Bibliotheken Bootstrap.js und etwas jQuery.

Das MVC Framework Angular JS ermöglicht unter Einsatz des Router Design Patterns und des Front Controller Design Patterns das Erstellen von responsiven (Mobile) Applikationen zur Bearbeitung von über ein Service Interface verfügbaren JSON-Daten aus einem RESTful WebService.

Mit AngularJS werden in der Beispiel-Applikation mit den HTML5-Frontends deklarativ die Benutzerschnittstelle  umgesetzt und die  Anwendungslogik in den JavaScript-Dateien definiert. Für die dabei verwendeten Edit-Templates und HTML-Suchseiten können Änderungen (z. B. für die auszugebenden Daten) innerhalb des jeweilgen JavaScript edit*Controllers.js oder auch der jeweiligen search.html durchgeführt werden. Für eine zusätzliches Login der App könnte ein Login-Modul z. B. mittels Spring Security for REST implementiert werden.

b) Die Beispiel-Applikation employeetimetracker:

Die JSF 2.2-Applikation employeetimetracker verwendet im Frontend JSF 2.2 und .xhtml-Templates mit HTML5-/CSS3. Weiterhin findet die JSTL-TagLibrary Verwendung, zu der es hier eine sehr gute RefCard von DZone gibt. Je nach Zustand, eingeloggt oder nicht, werden zwei verschiedene Basis-.xhtml Templates im Header der jeweils aufgerufenen .xhtml-Seite includiert. Die Login-Seite bietet dem Anwender die Möglichkeit, optional einen neuen User anzulegen, oder sich mit einem vorhandenen User einzuloggen.

c) Das RESTful WebService-Backend beider Beispiel-Applikationen:

Für das JAX-RS Service-Backend beider Beispiel-Applikationen kommt Java EE zum Einsatz (Stateful/Stateless  EJB 3.2 und JEE 7) und im Backend Model JPA 2.1 Entities. Über ein Service Interface werden die  interessierenden JSON-Daten der Beispiel-Applikationen aus einem RESTful WebService über entsprechende GET- oder POST-Http-Requests verfügbar gemacht. Dadurch kann ein und derselbe RESTful-Webservice von verschiedenen Client-Frontends und -Benutzeroberflächen verwendet werden und z. B. auf einer separaten JBoss WildFly Application Server Instanz deployt werden. Auch auf mobilen Endgeräten können die aus dem REST-Webservice erhaltenen JSON-Daten in nativen Client-seitigen oder responsiven (HTML5, jQuery, javascript) Apps präsentiert, durchsucht, oder geändert werden, solange der REST-Service hinter der Firewall für den Service-Consumer erreichbar ist. Der WebService wird üblicherweise auf einem anderen Port aufrufbar gemacht als die Applikationen auf den Frontend-Servern, die für den Anwender bzw. die Clients im “Multi-Channel“-Betrieb direkt ansprechbar sind. Für einen RESTful UserService und Lizenz-WebService gibt es zusätzlich zu den JEE6 und JEE7 Beispielapplikationen auch ein Beispiel für den JBoss 6 in einem Blog-Eintrag in diesem Blog, bei dem bereits eine JBoss Seam RichFaces Admin GUI und ein Restlet WebService in demselben .war-Archiv zur Verfügung gestellt wurden.

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Wie die Applikationen employeetimetracker und employeetimetracker-angularjs mittels JBoss Forge erstellt  werden, ist bereits in diesem Blog-Eintrag hier beschrieben worden, und wie in der pom.xml des jeweiligen  Beispielprojekts nach erfolgtem Download erkennbar ist, werden auch hier die folgenden JEE 7 Artefakte für den JBoss WildFly 10 identifiziert, verwendet und  importiert:

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

Die Aktivierung von CDI erfolgt, wie beschrieben, mittels beans.xml im  WEB-INF Verzeichnis.

Deployment auf JBoss WildFly und Konfigurationen

Die Beispiel-Applikationen wurden auf dem JBoss WildFly 10 deployt und getestet und können gerne weiterverwendet und als Open Source weiterentwickelt werden.

Die folgende Datasource (für die employeetimetracker und die employeetimetracker-angularjs Applikation) wurde in der standalone/configuration/standalone.xml unter den <datasources> eingetragen:

<datasource jndi-name="java:jboss/datasources/EmployeetimetrackerDatasource" 
                      pool-name="EmployeetimetrackerDS" enabled="true">
        <connection-url>jdbc:mysql://localhost:3306/employeetimetracker</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>

Für die Weiterentwicklung, den Build und das Deployment des Projekts ist Java und Maven erforderlich. Als Entwicklungsumgebung wurde Eclipse in Form des “JBoss Developer Studios“ mit Java verwendet, was auch sehr gut funktioniert hat. Weiterhin wurden die FireFox WebDeveloper IDE/Tools und die Chrome Entwicklertools verwendet. Als Datenbank wurde MySQL InnoDB 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 bekommt, (WildFly 9 läuft auf Java 7, WildFly 10 auf Java 8, hiermit können auch WildFly 11 und WildFly 12 betrieben werden). Hierfür wird im Startskript standalone.sh einfach das benötigte JAVA_HOME gesetzt. Wie bereits erwähnt, bekommt jede WildFly Application Server-Instanz einen eigenen Port, auf dem die Beispiel-Applikationen entweder auf WildFly 9 oder WildFly 10 erreichbar sind.

Die Konfiguration des JBoss WildFly Application Servers kann in einem bereits in diesem Blog vorhandenen Blog-Eintrag nachgelesen werden und kann bei allen WildFly Open Source Application Servern unter Beachtung der entsprechenden Versionsnummern ganz genauso leicht durchgeführt werden. Ein weiterer großer Vorteil aller WildFly Application Server und der JBoss EAP Server ist, dass einfach mehrere JEE-Applikationen oder WebService-Applikationen konfigurativ auf demselben MultiThreaded Application Server als .war-Archive deployt werden können und hierfür nicht mehr als.ear-Archiv verpackt und deployt werden müssen, wie es auf anderen J(2)EE Application Servern teilweise noch erforderlich war.

Die Minimal-Konfiguration des WildFly 10 betrifft:

– die MySQL Datenbank/den Java MySQL-Datenbank-Treiber und die MySQL-Datasource der employeetimetracker Beispiel-Applikation

– die Hibernate Version und ihre interessierenden Features/Dependencies

– das Start-Skript des Application Servers WildFly 10

Eine fertige Version der Beispiel-Applikation employeetimetracker kann heruntergeladen und ins Verzeichnis /standalone/deployments gespeichert werden. Genauso kann mit der Beispiel-Applikation employeetimetracker-angularjs verfahren werden. Durch Starten von standalone.bat (Windows)  oder standalone.sh (Linux) kann der JBoss WildFly gestartet werden.

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, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties. 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.

Anschließend ist die Beispiel-Applikation z. B. lokal aufrufbar unter der folgenden Url:

http://servername:port/employeetimetracker

Und die Beispiel-Applikation employeetimetracker-angularjs ist danach aufrufbar unter der Url:

http://servername:port/employeetimetracker-angularjs

Nun können z. B. Selenium Tests per Selenium IDE PlugIn/Recorder erstellt und danach ausgeführt werden.

Die Test-Frameworks und die Tests

a) Arquillian Tests für das Service-Backend

b) QUnit-Tests für die REST-Services

c) Selenium Tests für die Benutzerschnittstelle

Die Testframeworks wurden in einem Blog-Eintrag hier bereits erklärt.

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

“TDD mit Java”   von Binaris Informatik hingewiesen werden.

Wie Test-Suites, die mit dem Selenium IDE PlugIn durchgeführt wurden und automatisiert ausgeführt werden können, erstellt werden, wurde bereits in diesem Blog Eintrag hier beschrieben.

Hier noch eine weitere SPA (Single Page Appliction) Beispiel-Applikation, bei der das Testen des Backends mittels Arquillian und das integrative Testen des Frontends mittels Selenium (Workflow und UX Elemente) und QUnit (Javascript-Framework zum Test-Aufruf der REST-Endpoints aus einer Browser-View) ebenfalls ausführlich beschrieben ist.

Hier der WildFly 10 als Zip-Archiv zum Download und Entpacken: http://download.jboss.org/wildfly/10.0.0.Final/wildfly-10.0.0.Final.zip

Wie die interessierte Leserin/der interessierte Leser hier bereits feststellen konnte, macht es wirklich viel Spaß, die mit Hilfe von JBoss Forge auf den JPA-Entities angelegten JEE7, JBoss, JSF 2.2 und Angular JS Multi-Channel Applikationen zu erstellten und auszuprogrammieren, weshalb durchaus noch weitere Blog-Einträge zu diesen Themen folgen können.

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

WebApps– mit JSF 2.2, Primefaces 5, REST, JPA 2, JEE7, JBoss WildFly 10

Die Motivation

In einem Blog-Eintrag wurde bereits eine Beispiel-Applikation mit der JSF 2.2-Implementierung Apache MyFaces besprochen, weshalb hier eine weitere JSF 2-Implementierung, nämlich die Primefaces, besprochen werden sollen und die Migration der Beispielapplikation employeetimetracker von MyFaces auf die Primefaces Applikation employeetimetracker-primefaces erklärt wird. Über die Faces Technologie gibt es bereits einen Blog-Eintrag, 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 Application Server beschrieben wurde. Die in diesem Blog-Eintrag mittels JBoss Forge Eclipse PlugIn erstellte und migrierte Applikation employeetimetracker-primefaces wird auf dem JBoss WildFly 10 Final deployt und der Vollständigkeit wegen auch auf dem JBoss WildFly 9 Final und kann ebenso leicht auf weiteren WildFly Servern deployt werden, wie z. B. dem JBoss WildFly 11 Final und JBoss WildFly 12 Final. Dabei ist die Verwendung der beiden JBoss WildFly JEE7-Application Server in einem Blog-Eintrag bereits beschrieben worden und unterstützt den Einsatz der robusten, aber stets eleganten, etablierten Primefaces Frontend-Technologie optimal.

Migration der Beispiel Applikation auf Primefaces

Wie in der pom.xml erkennbar ist, werden hier die folgenden JEE7 Artefakte für den JBoss WildFly verwendet und importiert:

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

Und ebenfalls die CDI 1.1 Dependency:

- cdi-api_1.1

Die Aktivierung von CDI erfolgt bekanntlich mittels beans.xml im WEB-INF Verzeichnis.

Primefaces:

Die Einbindung der erforderlichen Primefaces-UI-Bibliothek primefaces-5.2.jar erfolgt ganz simpel über die entsprechende Maven Primefaces Dependency in der pom.xml. Es ist also im Gegensatz zu einem Ant-Build hier kein extra /lib-Verzeichnis und keine build.xml für einen Ant Build-Prozess mehr erforderlich, denn es wird einfach der folgende Eintrag zur pom.xml für den Maven Build hinzugefügt:

    <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. 40 XHTML-Views von MyFaces auf Primefaces sind der Primefaces Showcase sehr hilfreich. Ebenfalls wurde das sehr gute bei DZone erhältliche PDF zur JSTL hier verwendet. 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 employeetimetracker. Auch gibt es noch ein paar zusätzliche toString()-Methoden auf  einigen JPA-Entities, die bei Bedarf eine geänderte String-Repräsentation der Attribute liefern können.

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 entsprechenden Verzeichnis bekanntgemacht wird. Die TagLib wird in der entsprechenden .xhtml-View über den korrekten Eintrag mit dem richtigen Prefix im Document-Header eingebunden und mittels forgetaglib-Scope mittels Expression Language (EL) an der gewünschten Stelle mit den richtigen Input-Parametern aufgerufen. Hier die forge.taglib.xml:

<?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.employeetimetracker.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.employeetimetracker.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.employeetimetracker.view.ViewUtils</function-class>
    	<function-signature>
    		int count(java.util.Collection)
    	</function-signature>
    </function>
	
    <function>
    	<function-name>listExcludingSelectedOne</function-name>
    	<function-class>de.binaris.employeetimetracker.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>:

// ViewUtils:

package de.binaris.employeetimetracker.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 und durch die soeben gezeigten Beispiele ist erkennbar, wie leicht es ist, eigene Tags für die .xhtml-Views heutiger Primefaces-Applikationen zu definieren.

Die Konfiguration des JBoss WildFly Application Servers 11 Final erfolgt analog der Konfigurationen der JBoss Application Server WildFly 8.1, 8.2, 9 und 10 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 ein wichtiges Thema, welches in diesem Blog bereits in einem früheren Blog-Eintrag beschrieben wurde. Die Anbindung an die relationale  Datenbank MySQL 5 erfolgt übrigens analog für die JBoss Application Server WildFly 8.1, 8.2, 9, 10 und WildFly 11.

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

“TDD mit Java”

von Binaris Informatik erwähnt werden.

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, wie in diesem Blog-Eintrag hier beschrieben wurde, damit dieser auf das tatsächliche JDK 8-Verzeichnis des Server-Systems zeigt und auch der Pfad für das log-Dateien Verzeichnis in der Datei [server]/standalone/configuration/logging.properties.

Hier auch der WildFly 11 Final als Zip-Archiv zum Download und Entpacken: Für Linux hier und für Windows hier. Minimale Voraussetzung ist jeweils Java 8. Der fertig konfigurierte WildFly 11 mit vielen weiteren Beispiel-Applikationen ist hier zum Download verfügbar, kann runtergeladen, entpackt und gestartet werden.

Auch hier ist nur der Pfad des JAVA_HOME anzupassen, damit dieser auf das tatsächliche Open JDK – Verzeichnis des Server-Systems zeigt und ebenfalls der Pfad für das log-Dateien Verzeichnis in der logging.properties.

Die Entity-Relationship Diagramme, welche als Vorlagen der Beispiel-Applikation verwendet wurden (TimeTracking, Project Tracking) können in der Primefaces Beispielapplikation hier nachgesehen werden.

Die Beispiel-Applikation kann auch selbst erneut deployt werden, ohne den bereits gestarteten WildFly Application Server überhaupt stoppen oder erneut starten zu müssen. Bei laufendem Server

– ins Server-Unterverzeichnis /standalone/deployments das Archiv employeetimetracker-primefaces.war speichern

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

http://localhost:8080/employeetimetracker-primefaces

Die Blog-Einträge können übrigens hier nach Stichworten und Erscheinungsmonat leicht durchsucht werden.

Somit besteht durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces 6, Angular JS und Bootstrap, sowie den die JEE7-Spezifikation oder JEE8-Spezifikation implementierenden WebService-und Backend-Technologien folgen. Allen interessierten Leserinnen und Lesern weiterhin viel Freude bei der agilen Softwareentwicklung mittels Scrum und dem Test-Driven Development mit Java, sowie einen schönen Frühling.