WebApps – Primefaces 6, JPA 2, EJB 3, PDFs parsen, iText, MySQL, REST, JEE7, WildFly

Sonntag, 23. April 2017 von  
unter Fachartikel Architektur

Die Motivation

Über Beispiel-Applikationen zu der sehr vorteilhaften Primefaces-Technologie gibt es bereits Blog-Einträge in diesem Blog hier. Im Blog-Eintrag über WebApps – vom Modell zur App, mit JSF 2.2, Angular JS, REST, JPA 2 hier wurde beschrieben, wie leicht es ist, von einem Entity-Relationship-Diagramm zu einer JEE7-Applikation zu kommen. In diesem Blog-Eintrag soll nun die nach dem zugrundeliegenden relationalen Datenmodell im vorigen Blog-Eintrag hier besprochene Primefaces Beispiel-Webapplikation jobapplicationadmin-primefaces ergänzt werden.

Diese weiterentwickelte, um das Such-Formular und den PDF FileParser erweiterte Admin-Applikation jobapplicationadmin-primefaces ist die Admin-Sicht für einen HR-Mitarbeiter, welcher die über die Applikation jobapplication-primefaces eingegangenen Bewerbungen (“Job Applications“) mit den zugehörigen hochgeladenen PDF-Dokumenten und einem Profilbild weiterbearbeiten möchte. Hierfür sieht er nach dem Einloggen alle Bewerber und deren persönliche Daten, Zusatzinformationen sowie hochgeladene Dokumente und kann diese öffnen, zur Weiterverarbeitung herunterladen, oder über das zusätzliche Such-Formular nach den interessierenden Suchworten durchsuchen. Die PDFs mit den gefundenen Suchworten werden dann in einer Ergebnis-Tabelle präsentiert. Falls keine PDFs mit den Suchworten gefunden werden, bleibt diese Tabelle leer (“No records found“).

Erstellung der Beispiel Applikation nach Datenmodell

Die Beispiel-Applikation jobapplicationadmin-primefaces wurde bereits im vorigen Blog-Eintrag hier nach dem Datenmodell erstellt und dann auf den JBoss WildFly 9 Final und JBoss WildFly 10 Final Application Servern deployt und getestet. Die Verwendung der JBoss WildFly JEE7-Application Server wurde in diesem Blog-Eintrag hier 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 dabei Hibernate von JBoss, welches auf dem WildFly zu konfigurieren ist, was bereits in diesem Blog-Eintrag hier beschrieben wurde.

In der pom.xml des Beispielprojekts jobapplicationadmin-primefaces1 ist nach erfolgtem Download erkennbar, dass auch hier die bekannten JEE 7 Artefakte für den JBoss WildFly verwendet und importiert wurden:

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

Einsatz von CDI

Ü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 die verwendeten Design Patterns der Beispiel-Applikationen gibt es bereits Informationen in einem Blog-Eintrag hier und bereits vorausgegangenen Blog-Einträgen.

Primefaces 6 und iText Dependencies:

Hat man erst einmal die JPA 2.2 Entities definiert und, wie beschrieben, mittels JBoss Forge die Beispiel-Webapplikationen für die ausgewählte Frontend-Technologie (Angular JS oder Faces) erzeugt und rebrandet, ist z. B. auch die Migration einer Faces Beispiel-Applikation auf Primefaces leicht durchführbar und wurde bereits in einem vorigen Blog-Eintrag hier 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>

Zusätzlich sind für das Durchsuchen der hochgeladenen PDFs die folgende BouncyCastle– und die iText-Dependency erforderlich:

<dependency>
     <groupId>org.bouncycastle</groupId>
     <artifactId>bcprov-jdk15on</artifactId>
     <version>1.48</version>
</dependency>

<dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itextpdf</artifactId>
     <version>5.4.5</version>
</dependency>

(Bouncy Castle wird vom PDF FileParser benötigt, um kodierte ASN.1 Objekte aus dem PDF zu lesen und in lesbare Text-Fragmente zu dekodieren.)

Allein durch Änderung dieser Einträge in der pom.xml kann jederzeit auch auf die gewünschte Primefaces-Version umgestellt werden, ebenso auf eine höhere iText- und BouncyCastle-Version. Bei der Ausprogrammierung der XHTML-Views auf Primefaces sind der Primefaces Showcase und der neue Primefaces 6.0 Users Guide (PDF) sehr hilfreich. Ebenfalls wurde das sehr gute bei DZone erhältliche PDF zur JSTL (Java Server Pages Template Library) verwendet. Der größte Aufwand einer 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 hier leicht umsetzbar. Weitere Informationen zur Migration auf Primefaces sind bereits in einem vorigen Blog-Eintrag hier vorhanden.

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

Hier die search.xhtml-Seite mit dem Suchwort-Formular und der Ergebnis-Tabelle. Und hier ebenfalls die erforderlichen Erweiterungen der FileUploadBean mit der Such-Methode und deren Hilfsmethoden, die sich auch leicht in eine PDFFileParser-Utility Klasse refaktorisieren lassen.

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

Konfiguration des JBoss WildFly 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 in diesem Blog-Eintrag hier und in vorigen Blog-Einträgen bereits beschrieben. Wie die MySQL-Datenbank Inno DB 5.x zu konfigurieren ist, wurde in einem bereits vorhandenen Blog-Eintrag hier bereits beschrieben.

Die Primefaces Beispiel-Applikationen jobapplicationadmin-primefaces und jobapplication-primefaces arbeiten über die RESTful WebService-Schnittstelle auf derselben MySQL-InnoDB. Für die Primefaces Beispiel-Applikationen kann folgendes MySQL 5.x Datenbank-Skript verwendet werden. Hier auch die Datasource Definition:

<datasource jndi-name=“java:jboss/datasources/JobapplicationDatasource“ pool-name=“JobapplicationDS“ enabled=“true“>
<connection-url>jdbc:mysql://localhost:3306/jobapplication</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 Hibernate-Konfiguration des WildFly Servers ist ebenfalls leicht durchführbar und wurde bereits in einem Blog-Eintrag in diesem Blog hier beschrieben.

Die fertige Beispiel-Applikation jobapplicationadmin-primefaces kann leicht selbst deployt werden und wird ebenfalls nicht auf dem Test-Server deployt, um den Eindruck zu vermeiden, man könnte sich darüber real bewerben oder reale Bewerbungen bearbeiten. Aus demselben Grund wurden in der Beispiel-Applikation auch das Firmen-Logo durch ein neutrales Emblem ersetzt und der Link auf binaris.de entfernt. Denn bei Binaris Informatik bewirbt man sich nach wie vor am besten hier.

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

“TDD mit Java”

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

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

JBoss Developer Studio Projekt:

jobapplicationadmin-primefaces

intelliJ Projekt:

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

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

– eine leere Textdatei namens jobapplicationadmin-primefaces.war.dodeploy speichen und
– das Archiv jobapplicationadmin-primefaces.war aus dem jobapplicationadmin-primefaces1/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 einen angenehmen Frühling und eine schöne Sommerzeit.

Kommentare

Die Kommentare sind geschlossen.