WebApps – Generativ mit Angular JS, REST, JEE7, Java 8 auf JBoss WildFly 9 und 10

Donnerstag, 29. Dezember 2016 von  
unter Fachartikel Architektur

Die Motivation

Im Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Klassen-Diagramm (UML), genauer: Entity-Relationship-Diagramm hier, auch E-R Diagramm genannt, zu einer JEE7-Applikation zu kommen. Diese JEE6- und JEE7-Beispielapplikationen hier liefern 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 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).

Die Beispiel-Applikation restaurantguide-angularjs wird dann auf dem neusten JBoss WildFly 10 Final Server (entspricht dem neuen JBoss EAP 7-Server) deployt. Dabei ist die Verwendung der beiden neuen JBoss WildFly JEE7-Application Server in diesem Blog-Eintrag hier und die Konfiguration verschiedener Datenbanken in diesem Blog hier bereits beschrieben worden.

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

a) jQuery oder Angular JS

Die oft hierüber geführte Diskussion ist inzwischen eigentlich obsolet geworden, da es meiner Erfahrung nach eher unproblematisch ist, beide JavaScript-Frameworks in derselben Browser-Applikation zu verwenden und solange man nicht versucht, beide Frameworks auf ein und demselben HTML-Element anzuwenden, kommen diese sich auch weder bei der Event-Triggerung noch beim Event-Handling in die Quere. Hier ist ein funktionierendes Beispiel dazu mit einem jQuery-Accordion und jQuery-Carousel auf der Startseite und zusätzlich einer verlinkten Angular JS Such-Applikation im Events Header-Menü.

b) RichFaces oder Primefaces

Auch diese beiden Frameworks können parallel in einer .xhtml-Seite verwendet werden. Somit könnte eine RichFaces-richDataTable auch ein Element eines Primefaces-rating enthalten, was aber anhand der Primefaces-Beispielapplikation restaurantguide-primefaces im Bezug auf die Bewertung eines Restaurants im nächsten Blog-Eintrag gesondert besprochen werden soll.

Erstellung der Beispiel Applikation aus dem Datenmodell

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

Maven JEE 7 JBoss-Artefakte und Maven Dependencies

Dabei werden in der pom.xml die folgenden Maven Dependencies verwendet und es soll nicht vergessen werden, dass die heute in Java 8 enthaltenen javax.ws.rs REST-Packages ohne die bereits vor vielen Jahren erfolgte sehr gute Vorarbeit der Entwickler des jboss-resteasy REST-Frameworks wohl in der heutigen Form noch nicht im JDK vorhanden wären. Danke, JBoss Rockstars!

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

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

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

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

Einsatz von CDI

Und ebenfalls die CDI 1.1 Dependency:

– cdi-api_1.1

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

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

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

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

“TDD mit Java”

hier und hier von Binaris Informatik erwähnt werden.

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

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

Zum Erzeugen der Datenbank wird das folgende Property gesetzt:

<property name=“hibernate.hbm2ddl.auto“ value=“create-drop“/>

Damit die Datenbank danach nicht bei jedem Server-Neustart gelöscht und neuangelegt wird, wurde das Property “hibernate.hbm2ddl.auto“ danach auf den unwirksamen Wert “none“ gesetzt.

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/RestaurantguideDatasource“ pool-name=“RestaurantguideDS“
    enabled=“true“>
    <connection-url>jdbc:mysql://localhost:3306/restaurantguide</connection-url>
    <driver>mysql-connector-java-5.1.34.jar</driver>
    <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
    <pool>
    <min-pool-size>10</min-pool-size>
    <max-pool-size>100</max-pool-size>
    <prefill>true</prefill>
    </pool>
    <security>
    <user-name>root</user-name>
    <password>das entsprechende Passwort</password>
    </security>
    <statement>
    <prepared-statement-cache-size>32</prepared-statement-cache-size>
    <share-prepared-statements>true</share-prepared-statements>
    </statement>
    </datasource>

Die fertige Beispiel-Applikation restaurantguide-angularjs kann zusammen mit den anderen Beispiel-Applikationen hier betrachtet werden.

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

restaurantguide-angularjs

Und hier das intelliJ Projekt:

restaurantguide-angularjs

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

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

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

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

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

http://localhost:8080/restaurantguide-angularjs

Wie man sieht, macht es einfach Spaß, die responsiven Angular JS-Beispielapplikationen mittels JBoss Forge auf dem Datenmodell zu erzeugen und für die Umsetzung der Anforderungen weiterzuentwickeln.

Es besteht also durchaus die Möglichkeit, dass noch weitere Blog-Einträge zu Webframeworks wie Angular JS und Bootstrap auf die JEE7-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 weiterhin viel Spaß beim Silvesterfeiern und viel Erfolg im neuen Jahr 2017.

Kommentare

Ein Kommentar zu “WebApps – Generativ mit Angular JS, REST, JEE7, Java 8 auf JBoss WildFly 9 und 10”

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

    […] das Deployment auf dem GlassFish 3 Application Server erklärt wurde. Die in diesem Blog-Eintrag hier mittels JBoss Forge Eclipse PlugIn erstellte Applikation restaurantguide-angularjs wurde auf dem […]