Im heutigen Blog-Beitrag möchte ich gerne mit der Frage starten, warum wir in den meisten neuen Projekten, in denen eine Weboberfläche entwickelt werden soll, zunächst an die verschiedenen Javascript-Frameworks denken? Sollte ich als gestandener Java-Entwickler nicht eine Lösung in meinem Ökosystem bevorzugen?
Sicherlich spielen in den meisten Architekturentscheidungen nicht nur solche Überlegungen eine Rolle. Dennoch möchte ich zeigen, wie man mit aktuellen Enterprise-Frameworks (Quarkus), ansehnliche Weboberflächen mit Jakarta Faces und Primefaces erstellen kann.
Wir starten mit einer einfachen Quarkus-Anwendung. Die einzige Abhängigkeit, die ich zusätzlich benötige, ist die Primefaces-Extension aus dem Quarkiverse.
<dependency>
<groupId>io.quarkiverse.primefaces</groupId>
<artifactId>quarkus-primefaces</artifactId>
<version>3.15.7</version>
</dependency>
Mit dieser Abhängigkeit kommt ebenfalls eine Jakarta Faces Implementierung mit in unser Projekt. In diesem Fall die Apache MyFaces Implementierung in der Version 4.1.1. Sie beinhaltet also den Standard 4.1 der Faces Spezifikation und ist damit kompatibel zu JakartaEE 11.
Eine weitere Konfiguration der Anwendung ist nicht notwendig. Primefaces verwendet eine automatische Konfiguration der Webanwendung, daher ist keine web.xml
notwendig aber selbstverständlich für weitere Konfigurationen erlaubt. Diese Datei wird wie üblich im META-INF
-Verzeichnis untergebracht. Quarkus verwendet standardmäßig das resources
-Verzeichnis unterhalb vom META-INF
-Verzeichnis für die Auslieferung der „statischen“ Inhalte. Wir können in diesem auch unsere xhtml
-Dateien für die Faces-Anwendung ablegen.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="jakarta.faces.html">
<h:head>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Modern Faces App</title>
</h:head>
<h:body>
...
</h:body>
</html>
Mit diesem minimalen Aufwand haben wir eine lauffähige Webanwendung mit Jakarta Faces erstellt. Damit wir das Ganze jetzt auch noch mit etwas Leben füllen können, erstellen wir eine Entität und einen Service.
@Entity
public class Training {
@Id
private String id;
private String name;
private String beschreibung;
...
}
@ApplicationScoped
public class TrainingService {
public List<Training> getTrainings() {
...
}
}
Wir stellen uns vor, dass hinter dem Service auch noch eine Repository-Klasse stecken kann und diese die Daten aus der Datenbank für uns verwaltet. Für uns reicht diese Tiefe für das einfache Beispiel aus.
Um nun die Verbindung zur Webansicht zu schließen erstellen wir noch eine weitere Klasse.
@Named
@RequestScoped
public class TrainingPresenter {
@Inject
TrainingService trainingService;
public List<Training> getAllTrainings() {
return trainingService.getTrainings();
}
}
Mit der zusätzlichen Annotation @Named
machen wir den Presenter unter dem Namen trainingPresenter
bekannt. Damit haben wir nun die Möglichkeit die Daten in der xhtml
-Datei zu verwenden.
<ui:repeat value="#{trainingPresenter.allTrainings}"
var="training">
...
<h:outputText value="#{training.name}"/>
...
</ui:repeat>
Dieses einfache Beispiel zeigt, dass man auch ohne den Einsatz eines Javascript-Frameworks Webanwendungen mit JakartaEE erstellen kann. Der Vorteil von diesem Ansatz ist, dass auch Java-Entwickler ohne Javascript Know-How Webanwendungen erstellen können. Darüber hinaus entfällt die Umwandlung der Daten in Json und die Übertragung zum Client in dieser Form. Die Darstellung wird auf dem Server gerendert und direkt ausgeliefert.
Für diejenigen, die schon lange im Enterprise-Umfeld unterwegs sind, waren die meisten Dinge bekannt. Dennoch gibt es häufig viele Bedenken gegen diesen Ansatz. In diesem Beitrag haben wir uns ein einfaches Beispiel angeschaut. In einem späteren Beitrag werde ich dann den Vergleich zu Angular machen. Dazu werden wir uns dann genauer Anschauen, wo die Vor- und Nachteile der beiden Frontend-Technologien liegen.