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

Samstag, 23. Juli 2016 von  
unter Fachartikel Architektur

Die Motivation

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

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

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

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

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

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

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

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

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

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

– primefaces-6.0
– poi-3.7

– cdi-api_1.1

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

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

Der aktivierte Link zum DataExporter in der Primefaces 6 Beispiel-Applikation fridge-primefaces verwendet die folgende, oben genannte Apache POI-Dependency hier.

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

   public void exiringItems() {
 
                   CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
                  
                   CriteriaQuery<Long> countCriteria = builder.createQuery(Long.class);
                   Root<Article> root = countCriteria.from(Article.class);
                   countCriteria = countCriteria.select(builder.count(root)).where(
                                                  getSearchPredicates(root));
                   this.count = this.entityManager.createQuery(countCriteria)
                                                  .getSingleResult();
                  
                   CriteriaQuery<Article> criteria = builder.createQuery(Article.class);
                   root = criteria.from(Article.class);
                   criteria.orderBy(builder.asc(root.get("expiryDateTime")));
                   TypedQuery<Article> query = this.entityManager.createQuery(criteria
                                                  .select(root).where(getSearchPredicates(root)));
                   query.setFirstResult(this.page * getMaxPageSize()).setMaxResults(
                                                  getMaxPageSize());
                   this.pageItemsExpiring = query.getResultList();
   }

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

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

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

"TDD mit Java"

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

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

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

Dafür wird die folgende Datasource benötigt und ist in der standalone/configuration/standalone.xml des JBoss WildFly Servers unter den <datasources> einzutragen:

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

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

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

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

fridge-primefaces

fridge-angularjs

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

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

Für die Weiterentwicklung, den Build und das Deployment des Projekts ist mindestens Java 6 und Maven 3 erforderlich. Als Entwicklungsumgebung wurde Eclipse 4.4 in Form des “JBoss Developer Studios 8.1.0“ mit Java 7 verwendet und ebenfalls Eclipse 4.5 (Mars) in Form des “JBoss Developer Studios 9.GA“ mit Java 8, was auch sehr gut funktioniert und hier zum Download vorhanden ist. Weiterhin die FireFox WebDeveloper IDE/Tools. Als Datenbank wurde MySQL InnoDB 5.x eingesetzt, hier kann aber auch leicht PostgreSQL, Oracle oder auch gerne eine andere relationale Open Source-Datenbank verwendet werden.

Der WildFly 10 verwendet als Java Runtime Java 8 oder höher, weshalb jeder WildFly Application Server auf dem Linux-Server für die Beispiel-Applikationen seine eigene JVM bekommt, (WildFly 9 läuft auf Java 7, WildFly 10 auf Java 8). Hierfür wird im Startskript standalone.sh einfach das benötigte JAVA_HOME gesetzt, was folgendermaßen aussieht:

JAVA_HOME=/usr/lib/jvm/oracle_jdk8
# Setup the JVM
if [ “x$JAVA“ = “x“ ]; then
        if [ “x$JAVA_HOME“ != “x“ ]; then
                JAVA=“$JAVA_HOME/bin/java“
        else
                JAVA=“java“
        fi
fi

Dabei befindet sich im Unterverzeichnis oracle_jdk8 der Inhalt des von Oracle heruntergeladenen JDK8 für Linux. Somit kann für jeden Application Server ein eigenes JDK der benötigten Version konfiguriert werden, ohne dass die JAVA_HOME-Variable eines einzelnen Servers für einen anderen Server gültig wäre. Auch bekommt jede WildFly Application Server-Instanz einen eigenen Port, auf dem die Beispiel-Applikationen entweder auf WildFly 9 oder WildFly 10 erreichbar sind.

Das Setzen und der Export der JBOSS_HOME Umgebungsvariable in der /bin/standalone.sh (für Linux) wird ebenfalls nur für jede WildFly Application Server-Instanz einzeln durchgeführt:

DIRNAME=`dirname “$0″`

RESOLVED_JBOSS_HOME=`cd “$DIRNAME/..“; pwd`

export JBOSS_HOME

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

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

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

http://localhost:8080/fridge-primefaces

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

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

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

http://localhost:8080/fridge-angularjs

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

Es besteht also durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Primefaces 6, Angular JS, Bootstrap und den die JEE7-Spezifikation implementierenden Backends und darauf basierenden WebServices folgen.

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

Kommentare

4 Kommentare zu “WebApps – Primefaces 6, REST, JEE7, Angular JS auf JBoss WildFly 9 und 10”

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

    […] 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 […]

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

    […] 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 […]

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

    […] 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 […]

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

    […] 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 […]