
Hier erfährst du, was in diesem Kurs auf dich zukommt und mit wem du es zu haben wirst.
Zu einem guten Kurs gehören auch Literaturhinweise. Die findest du hier.
Hier erfährst du einige Details zu den Folien zum Kurs.
Ich werde einige grundlegende Begriffe zur Web-Entwicklung erklären. Diese Begriffe werden dich durch den ganzen Kurs begleiten.
JavaServer Faces ist ein Bestand der JavaEE-Spezifikation. Aus diesem Grund erfährst du in diesem Kursabschnitt, was JavaEE eigentlich ist und wie es im Groben funktioniert. Da JavaEE selbst nicht das Thema des Kurses ist, handelt es sich um eine eher oberflächliche Einführung.
Hier erfährst du, wie du deine Arbeitsumgebung mit Eclipse als IDE und GlassFish als Server einrichten kannst. Du kannst natürlich auch eine andere IDE oder einen anderen Server verwenden.
Hier zeige ich kurz, wie der xhtml-Editor von Eclipse aktiviert wird, falls er nicht automatisch aktiv sein sollte.
Jetzt zeige ich die wie du den GlassFish-Server außerhalb einer IDE starten kannst.
Hier erkläre ich dir, wie du den GlassFish als Server in Eclipse einrichtest und Web-Projekte in Eclipse erstellst.
Jetzt erkläre ich dir die theoretischen Grundlagen von JavaServer Faces. Es klingt im ersten Moment ein bisschen langweilig, aber dieses Hintergrundwissen ist nützlich für die Arbeit mit dem Framework.
Bei jeder JSF-Anfrage wird ein Lebenszyklus abgearbeitet, der aus sechs Phasen besteht. Aufgrund dieses Lebenszyklus kan JSF uns Arbeit abnehmen. Dieses Thema mag recht theoretisch wirken, aber wir sollten den Lebenszyklus verstehen, damit wir einige Eigenheiten von JSF nachvollziehen können.
Du wirst lernen wie ein JSF-Projekt aufgebaut sein muss.
In dieser Lektion zeige ich dir einige Grundlagen mit dem GlassFish-Server. GlassFish ist die Referenzimplementierung von JavaEE und der Server, mit dem ich in diesem Kurs arbeite.
Als nächstes zeige ich dir wie du eine GlassFish-Domäne starten und in der Web-Oberfläche verwalten kannst.
Jetzt zeige ich dir noch grundlegende Verwaltungsfunktionen für Domänen, also z.B. Ports ändern, Domänen stoppen und Domänen löschen.
Jetzt stelle ich dir unser großes Beispiel vor, das dich durch den Kurs begleiten wird. Immer wieder werde ich an diesem Beispiel zeigen wie bestimmte Konzepte von JavaServer Faces umgesetzt werden.
Den kompletten Quellcode aller meiner Beispiele stelle ich zum Download auf GitLab zur Verfügung. Hier zeige ich dir, wo du die Beispiele finden kannst.
In dieser Lektion lernst du das Grundelement von JSF-Programmen kennen: die ManagedBeans. Dabei handelt es sich um Java-Klassen, welche die Logik unseres Programms enthalten und die von den Webseiten angesprochen werden können.
Nachdem wir eine ManagedBean erstellt haben, möchten wir uns jetzt ansehen wie man von einer xhtml-Seite aus auf die Javaklasse zugreift und deren Werte ausliest bzw. Werte aus der grafischen Oberfläche in Javaobjekte hineinschreibt. Dazu erstellen wir eine erste xhtml-Seite, die ja unsere grafische Oberfläche beschreibt.
Wir möchten jetzt gerne Eingabefelder erstellen, in welche der Anwender Daten eingeben kann, die wir mit unserem Programm verarbeiten können.
In dieser Kurseinheit zeige ich dir noch mehr Möglichkeiten, die die EL dir bietet: arithmetische und logische Ausdrücke, Vergleichsausdrücke und implizite Objekte.
Es gibt auch die Möglichkeit, EL-Ausdrücke aus dem Java-Code heraus aufzurufen und somit bspw. von einer ManagedBean auf eine andere zuzugreifen. Die Anwendung dieser Möglichkeit sollte jedoch gut durchdacht sein, denn die Lesbarkeit und Wartbarkeit des Codes wird dadurch nicht unbedingt gefördert. Ich werde im Kursverlauf noch bessere Möglichkeit dafür zeigen.
Die Objekte unserer ManagedBeans werden vom Framework verwaltet. Wir haben nur einen sehr begrenzten Einfluss auf den Lebenszyklus dieser Objekte. In dieser Lektion möchte ich gerne erklären, wie wir als Programmierer den Lebenszyklus von ManagedBeans beeinflussen können.
Nachdem du die Gültigkeitsbereiche verstanden hast, möchte ich ihre Wirkungsweise nun an einem etwas größeren Beispiel zeigen, damit du sie auch wirklich nachvollziehen kannst - denn die Gültigkeitsbereiche sind sehr wichtig, da sie das ganze Verhalten deiner ManagedBeans beeinflussen.
Wie jede Javaklasse können auch ManagedBeans Konstruktoren haben. Diese sollten jedoch niemals implementiert werden. In dieser Lektion erkläre ich, warum man Konstruktoren bei ManagedBeans nicht implementieren sollte, und stelle eine Alternative vor.
Zuerst möchte ich einige grundlegende Dinge zur Navigation in JSF sagen.
Ich beginne mit der impliziten Navigation.
Navigationsregeln sind ein mächtiges Instrument, mit dem die Navigation sehr flexibel gestaltet werden kann.
Dir wird aufgefallen sein, dass in der Adresszeile des Browsers nicht die richtige URL steht. Mit Redirects kann dies geändert werden.
Der FlashScope kann verwendet werden, um Informationen von einer Seite an eine andere weiterzugeben.
In dieser Einführung erkäre ich die Grundlagen der Ereignisse in JSF.
ActionEvents sind die am häufigsten verwendeten Ereignisse. Sie werden ausgelöst, wenn der Benutzer auf eine Schaltfläche klickt.
ActionListener müssen nicht mit Methoden definiert werden, sondern du kannst auch ActionListener-Klassen schreiben. Dadurch wird die Wiederverwendbarkeit der Listener erhöht, aber natürlich auch die Anzahl der Klassen.
ValueChangeEvents werden ausgelöst, wenn der Benutzer einen Wert in einer Eingabekomponente ändert.
ValueChangeEvents werden erst ausgeführt, nachdem das Formular an den Server gesendet wurde. Das wirkt auf den ersten Blick nicht ideal, aber gerade bei langwierigen Aktionen gibt es Vorteile, die in dieser Kurseinheit vorgestellt werden.
Eine weitere Art von Ereignissen sind die PhaseEvents. Sie sind generell nicht so wichtig wie die beiden bisher vorgestellten Ereignisse, aber sie können dennoch auch in der normalen Anwendungsentwicklung sinnvollen Einsatz finden.
Auch die SystemEvents sind nicht ganz so wichtig in der normalen Anwendungsentwicklung, aber auch sie können gute Anwendungsfälle finden.
Starten möchte ich diesen Abschnitt mit einer Einführung zum Thema Softwarearchitekturen. Warum ist sie so wichtig?
Die Schichtenarchitektur ist eine sehr bekannte Softwarearchitektur, die vor allem in Web-Anwendungen eingesetzt wird.
Das Kapitel Architekturen soll abgeschlossen werden mit einem Blick ins SpaceGame. Wir werden uns anschauen wie die Schichtenarchitektur im SpaceGame umgesetzt wurde.
In der Einführung käre ich einige allgemeine und grundlegende Aspekte über Komponenten.
Ich stelle dir als erstes die Ausgabekomponenten von JSF vor.
Natürlich kann der Anwender auch Daten eingeben. Jetzt erkläre ich dir die Eingabekomponenten von JSF.
Mithilfe von Kommandokomponenten kann der Benutzer Aktionen starten. Dabei handelt es sich um Buttons und Links.
Auswahlkomponenten ermöglichen es dem Benutzer, einen oder mehrere Werte aus einer Liste von Werten auszuwählen.
Mithilfe von Grafikkomponenten können Bilder auf der Webseite dargestellt werden.
Containerkomponenten dienen dazu, andere Komponenten zu gruppieren.
Daten stellt man als Übersicht am besten in einer Tabelle dar. Dazu bietet JSF die Komponente DataTable, die wohl die komplexeste der Standardkomponenten ist. Hier stelle ich die grundlegende Funktionsweise der DataTable dar, aber diese Komponente wird uns noch einige Kurseinheiten beschäftigen.
Jetzt möchten wir mal einige Daten in die Tabelle hineinschreiben und anzeigen und zwar so, dass der Benutzer einen Datensatz auswählen kann, indem er auf eine Schaltfläche klickt.
Als nächstes stellen wir dem Benutzer die Möglichkeit zur Verfügung, auch tatsächlich Daten zur Bearbeitung auszuwählen.
Jetzt erweitern wir unsere DataTable so, dass der Benutzer auch Daten ändern kann.
In der Einführung sehen wir uns an, warum Konvertierung in einer Web-Anwendung überhaupt notwendig ist und wie JSF den Programmierer dabei unterstützt.
Datumsangaben können auf zahlreiche Arten konvertiert werden. Dabei hilft der einfach zu benutzende DateTimeConverter.
Auch Zahlen können unterschiedlich dargestellt werden. An dieser Stelle kommt der ebenfalls einfach zu benutzende NumberConverter ins Spiel.
Manchmal benötigt man komplexere Konvertierungen, die von den Standardkonvertieren nicht übernommen werden können. Deswegen kann der Programmierer eigene Konvertierer definieren, die er dann einfach ins JSF-System einhängen kann und die dann bei Bedarf automatisch aufgerufen werden.
Als nächsten Schritt möchten wir unseren PK-Konvertierer so erweitern, dass er die empfangenen Strings in Objekte umwandelt bzw. die zu sendenden Objekte in Strings.
Anwendungsdefinierte Konvertierer können global und lokal definiert sein. Die globalen, die ich dir als erstes zeige, konvertieren jedes Objekt eines bestimmten Typs im gesamten Programm.
Jetzt zeige ich dir wie lokale Konvertierer funktionieren. Sie springen nicht bei jedem Vorkommen eines Objekts eines bestimmten Typs an, sondern nur wenn es gewünscht ist.
Eine interessante Anwendungsmöglichkeit für anwendungsdefinierte Konvertierer sind Auswahlfelder. Bisher haben wir die ausgewählten Werte immer als Strings gespeichert, aber es ist doch erheblich schöner, wenn wir direkt die Objekte bekommen würden, die wir brauchen. Und an dieser Stelle kommen die Konvertierer ins Spiel.
Ich erkläre dir erst einmal die Grundlagen der Validierung. Wir sollten auch darüber nachdenken, in welcher Phase sie sich abspielt. Das wird später sehr wichtig werden.
Die Standardvalidierer übernehmen einfache Validierungsaufgaben, die immer wieder in einem Programm auftauchen. Sie sind extrem leicht zu benutzen und sollten deswegen auch oft eingesetzt werden - sie sind so einfach zu benutzen, dass es keine Ausrede mehr dafür gibt, auf die Validierungen zu verzichten.
In dieser Lektion beschäftigen wir uns mit Fehlermeldungen, die während der Validierung auftreten können.
Doch es gibt nicht nur Fehlermeldungen, sondern auch bspw. Informationsmeldungen oder Warnungen. Wir sehen uns jetzt an wie man diese erzeugen kann.
Die Bean-Validierung ist eine sehr einfache Art der Validierung, die mittels Annotationen durchgeführt wird.
Mit Redirects gibt es einige Probleme, u.a. überleben Meldungen einen Redirect nicht, weil intern zwei Requests erzeugt werden. Dieses Problem kan der FlashScope lösen.
Manchmal sind Validierungen so komplex, dass die Standard-Validerer sie nicht durchführen können. Dann kannst du auch eigene Validerer entwickeln und ins Systems einhängen.
Warum ist es so wichtig, dass ein Programm auf andere Sprachen umgestellt werden kann? Im Internet dürfte die Frage leicht zu beantworten sein: Das Internet ist nun einmal international. In dieser Einführung werden genau die Fragen nach dem Warum und dem Wie beantwortet.
Nun möchten wir uns ansehen wie man in JSF internationalisiert.
Wir möchten unser Programm nun so erweitern, dass der Benutzer in einer Auswahlbox eine Sprache auswählen kann und dass das Programm sich auf diese neue Sprache umstellt und die ganze grafische Oberfläche aktualisiert.
Nun kann es interessant sein, in eine Meldung Parameter einzusetzen, also z.B. etwas wie das hier: "x Datensätze wurden gefunden." Dieses x ist eine beliebige Zahl >= 0. Wie bekommen wir diese Zahl nun in unsere Meldung hinein und zwar so, dass es für jede Sprache korrekt ist?
Ganz unprofessionell wirken Meldungen wie diese: "1 Personen wurde in der Datenbank gefunden." Wir möchten unser Programm nun so erweitern, dass es Singular und Plural unterscheiden kann - und das auch in verschiedenen Sprachen.
Auch Datum und Uhrzeit werden in verschiedenen Sprachen unter Umständen unterschiedlich dargestellt. So schreibt man im englischen Sprachraum das Datum 19.03.2019 als 2019-03-19. Zum Abschluss möchten wir uns ansehen wie wir Datums- und Zeitangaben je nach eingestellter Sprache unterschiedlich formatieren.
"Das Internet ist eine Spielerei für Computerfreaks. Wir sehen darin keine Zukunft." - Ron Sommer
Da hat sich der ehemalige Telekom-Chef Ron Sommer im Jahr 1990 leicht getäuscht. Das Internet ist inzwischen allgegenwärtig und man kann mit Fug und Recht behaupten, dass es die größte Revolution der Menschheitsgeschichte darstellt. Es hat unser Leben stark verändert und noch immer ist kein Ende abzusehen - eher im Gegenteil. Das spannendste dürfte uns noch bevor stehen.
Deswegen wird es auch immer wichtiger, dass man Programme für das Internet schreiben kann. Zahlreiche Frameworks haben sich entwickelt, die es ermöglichen, mit der Programmiersprache serverseitige Java Programme zu schreiben, die dynamische Internetseiten anzeigen.
JavaServer Faces (JSF) ist ein solches Framework, das zu dem offiziellen JavaEE-Standard (Java Enterprise Edition) gehört. Es soll die Entwicklung großer webbasierter Unternehmensanwendugen ermöglichen. Dabei geht JSF den Weg, dass die Vermischung von Java- und HTML-Code vermieden werden soll. Außerdem möchte JSF dem Programmierer viel 0815-Arbeit abnehmen und die Schwierigkeiten bei der Entwicklung von Web-Anwendungen möglichst vor ihm verbergen.
In diesem Kurs sollst du dieses sehr mächtige Java-Framework in all seinen Facetten kennenlernen. Wir starten bei den absoluten Grundlagen und arbeiten uns dann immer weiter in die Tiefen des Frameworks vor. Ich zeige dir neben den grundlegenden Bausteinen, den ManagedBeans, die Datenvalidierung, Konvertierung, Listener, außerdem den Templating-Mechanismus, der die Wiederverwendbarkeit von Teilen der Webseite erhöht, und vieles mehr.
Am Ende schreiben wir zusammen ein großes Programm, in dem alle Inhalte noch einmal vorkommen. So entsteht vor deinen Augen eine relativ große Anwendung, die alles miteinander verbindet.
Neben den Videos gehören zu dem Kurs noch weitere Materialien: Du erhälst Foliensätze als pdf, mit denen du die Inhalte noch einmal wiederholen kannst. In den Videos programmiere ich meistens und arbeite wenig mit den Folien, aber die Folien enthalten noch einmal alle wichtigen Informationen zusammengefasst fürs Wiederholen und schnelle Nachschlagen. Außerdem stelle ich dir natürlich sämtlichen Quellcode aller Beispiele zur Verfügung, damit du sofort loslegen kannst. Einige Quizes und Übungen vervollständigen den Kurs.
Neben dem eigentlichen Thema JavaServer Faces zeige ich dir noch die Grundlagen des Servers GlassFish, der die Referenzimplementierung von JavaEE ist, und die wichtigsten Elemente von CDI - ein Bestandteil von JavaEE, der inzwischen zusammen mit JSF verwendet werden kann. Außerdem ist es mir ein Herzensanliegen, auch ein wenig über eine gute Architektur für Web-Anwendungen zu sprechen, die ich dann in dem großen abschließenden Beispiel auch realisieren werde.
Als IDE verwende ich Eclipse, aber es ist dir natürlich freigestellt, eine andere IDE zu verwenden. Jede größere IDE sollte ähnliche Funktionen anbieten wie ich sie dir in Eclipse zeige.