- JavaServer Faces
-
JavaServer Faces (kurz: JSF) ist ein Framework-Standard zur Entwicklung von grafischen Benutzeroberflächen für Webapplikationen. Basierend auf Servlets und JSP-Technologie, gehört JSF zu den Webtechnologien der Java Platform, Enterprise Edition (Java EE). Mit Hilfe von JSF kann der Entwickler auf einfache Art und Weise Komponenten für Benutzerschnittstellen in Webseiten einbinden und die Navigation definieren. Voraussetzungen für die Entwicklung von JSF-Content sind das JDK, ein Servlet-Container (z. B. Apache Tomcat) und Grundlagenverständnis von HTML, HTTP und der Java-Programmiersprache. Zur Vereinfachung der Entwicklung kann eine Integrierte Entwicklungsumgebung verwendet werden.
Inhaltsverzeichnis
Komponenten
Der Programmierer entwickelt nicht die Ausgabeseite mit HTML, sondern setzt sie auf einem höheren Abstraktionsniveau aus Komponenten zusammen. Ähnlich wie bei der klassischen Anwendungsentwicklung kann sich der Entwickler stattdessen auf die eigentliche Anwendungslogik konzentrieren. JSF-Komponenten unterliegen einer hierarchischen Struktur. Ähnlich wie in der Java-Swing-Technologie gibt es in JavaServer Faces Container-Komponenten, die andere Komponenten in sich aufnehmen können. Um die Anwendung besser zu strukturieren, wird strikt zwischen Modell, Ausgabe und Steuerung getrennt, wie es das Model-View-Controller-Konzept vorsieht.
Ein zentrales Konzept von JavaServer Faces ist die View. Dabei handelt es sich um eine Baumstruktur aus JSF-Komponenten. Eine solche Struktur kommt genau einmal pro Aufruf vor, bei Verwendung von JavaServer Pages (JSP) also einmal pro Seite. Die View wird am Anfang des JSF-Lebenszyklus aufgebaut, direkt nach Eintreffen der Anforderung vom Client. In der letzten Phase des Lebenszyklus werden die Komponenten der Views mit der Wurzel beginnend rekursiv aufgerufen, um die Antwort, beispielsweise eine HTML-Seite, zu erzeugen. Die Controller-Komponente, welche Benutzereingaben steuert, kann in JavaServer Faces über eigene Komponenten oder mit einem sogenannten Handler implementiert werden. Diese sind meist mit Java geschrieben. Die eigentliche Logik der Applikation findet im Model statt. Bei JavaServer Faces sind die Model-Komponenten sogenannte Java-Beans (Java-Klassen), die vom Container verwaltet werden. JSF-Web-Anwendungen besitzen in der Regel keinen nennenswerten HTML-Code. Der HTML-Code wird erst im Quellcode der generierten Seite sichtbar. JSF-Komponenten besitzen eigene Renderer. Diese Renderer wandeln die mit JSF geschriebenen Seiten in HTML-Code um, so dass jeder HTML-Web-Browser die Seite darstellen kann. Eigene Renderer können für andere Ausgabeformate geschrieben werden.
Lebenszyklus
Die Spezifikation der JavaServer Faces definiert einen sogenannten Lebenszyklus, den eine JSF-Anwendung mit jedem Aufruf erneut durchläuft. Dieser Lebenszyklus ist in sechs Phasen aufgeteilt.
- Restore View („Sicht wiederherstellen“) wählt anhand der eingehenden Anforderung eine Sicht (View) aus und baut den dazu passenden Komponentenbaum auf.
- Apply Request Values („Anforderungsparameter anwenden“) extrahiert Parameter aus der Anforderung (üblicherweise ein HTTP-Post-Request) und weist sie den passenden JSF-Komponenten zu, beispielsweise Eingabefeldern.
- Process Validations („Validierung ausführen“) überprüft die Gültigkeit der zuvor ermittelten Eingaben. Dazu werden eigene Konverter- und Validator-Objekte verwendet, die den Komponenten in der View-Definition zugewiesen wurden.
- Update Model Values („Modell aktualisieren“) weist den Modellobjekten die zuvor ermittelten Werte zu.
- Invoke Application („Anwendung aufrufen“) ruft durch die Anwendung definierte Methoden auf, beispielsweise wenn ein Button betätigt wurde.
- Render Response („Antwort wiedergeben“) erzeugt schließlich die Antwort auf die ursprüngliche Anfrage, beispielsweise eine HTML-Seite. Hierzu werden sogenannte Renderer aufgerufen, die den View-Komponenten zugeordnet sind.
Treten Fehler auf, oder soll als Antwort beispielsweise eine HTML-Seite aufgerufen werden, die keine JSF-Komponenten enthält, so können einzelne Phasen übersprungen werden.
Implementierungen
Die JavaServer-Faces-Spezifikation wird von einer Reihe Frameworks implementiert. Diese werden meist in JEE-Containern mitgeliefert und lassen sich oft nur unter Schwierigkeiten austauschen. Dazu gehören beispielsweise:
- Mojarra, die Referenzimplementierung von JavaServer Faces im Rahmen des GlassFish Java Anwendungsservers
- Apache MyFaces und MyFaces Trinidad von der Apache Software Foundation
- Oracle ADF, ein kommerzielles Java-Framework für Java-Enterprise-Applikationen (Vorläufer von Apache MyFaces Trinidad)
Komponentenframeworks
Komponentenframeworks erweitern JSF-Implementationen. Mit ihnen können beispielsweise sehr einfach JavaScript und Ajax generiert werden, somit erhöhen sie die Produktivität beim Erstellen des Codes erheblich.
- ICEfaces, Opensource-Framework von ICEsoft; basierend auf dem Woodstock GUI-Komponentenframework.
- RichFaces inkl. Ajax4jsf von Red Hat (ehemals Exadel)[1]
- PrimeFaces[2]
- Mojarra Scales
- J4Fry
- xulfaces
- jQuery4jsf
Verschiedene Unternehmen bieten auch grafische Entwicklungswerkzeuge für JSF an.
Standardisierung
Die JSF-Spezifikation wurde im Rahmen des Java Community Process (JSR 127) von einer Reihe bekannter Unternehmen entwickelt und am 27. Mai 2004 in der Version 1.1 verabschiedet. Am 11. Mai 2006 wurde die Version 1.2 (JSR 252) veröffentlicht. Die aktuelle Version der Referenzimplementierung Mojarra 1.2_15 erschien am 24. September 2010.[3]
Die Version 2.0 (JSR 314) bringt insbesondere Ajax-Unterstützung mit sich. Sie ist seit Dezember 2009 erhältlich und kann auf der Oracle-Homepage heruntergeladen werden. Eine Implementation sowie ein Tutorial und weitere Dokumentation stehen im Mojarra Project zur Ansicht und zum Download bereit, die derzeitige Version der Mojarra Referenzimplementierung lautet 2.0.6.[4] Bei JSF 2.1 handelt es sich um einen Wartungsrelease von Version 2.0, freigegeben wurde die Spezifikation am 21. November 2010[5], die aktuelle Version der Mojarra Referenzimplementierung lautet 2.1.3.[6]
JavaServer Faces umfasst
- Eine Tag-Bibliothek zur Einbindung der JSF-Oberflächenkomponenten in JavaServer Pages oder in einem Facelet,
- eine Java-API zur Kontrolle von Bedienelementen der Benutzerschnittstelle. Dies schließt auch die Behandlung von Ereignissen, die Validierung der Eingabe, Navigation und Unterstützung für Internationalisierung mit ein.
- Eine eigene Expression Language (EL), welche als Grundlage die JSP-Technologie hat. In JavaServer Faces werden EL-Ausdrücke in folgender Schreibweise geschrieben:
#{1+2}, #{PI/2}, #{handler.attribut}
Eine Ähnlichkeit zu der JSP-EL ist unverkennbar. Der Hauptunterschied liegt nicht nur an dem vorangestelltem #, sondern auch in der Sprache selbst. Die JavaServer Pages-Expression Language ist dynamischer als die JavaServer Faces-Expression Language. Die JavaServer Faces-EL ist zustandsbehafteter (statischer), vergleichbar mit den Java-Swing-Komponenten. Die Expression Language von JSF hat eine bidirektionale Wertebindung, d. h. sie kann Properties (Eigenschaften einer Bean) lesen (z. B. Initialisierung) und schreiben (z. B. Werte an Property binden). Folgende Tabelle zeigt Ausdrucksarten der Expression Language von JSF:
Expression Language Ausdruck Beispiel Wertebindung #{handler.name}
– name ist eine Variable der handler-BeanMethodenbindung #{handler.actionMethode}
– actionMethode ist eine Methode der handler-BeanArithmetisch / Logisch #{5+8}, #{65/5}, #{99>90}, #{!(5>6)||(8<4)}
Bei der Entwicklung von JavaServer Faces-Seiten sollte auf die Kombination von JSP- und JSF-Ausdrücken verzichtet werden, da das zu Problemen führen kann.
JSF-Standard Tags (nicht vollständig)
Tag-Name Beschreibung <f:view> Erzeugt Instanz der Klasse javax.faces.component.UIViewRoot. Alle enthaltenen Komponenten werden Child-Komponenten der View. <h:form> Bindet Eingabekomponenten in ein Formular. Sendet POST-Request per HTTP. <h:panelGrid> In HTML <table>-Tag. Anzahl der Spalten bestimmt das columns-Attribut <f:facet> Definiert eine Facette als Kindelement eines Containers (z. B. Überschrift für eine Tabelle) <h:outputText> Normaler HTML-Text <h:outputLabel> In HTML <label>-Tag. Kennzeichnung eines Eingabefeldes <h:panelGroup> Container, der mehrere JSF-Tags zu einem Tag zusammenfügt <h:inputText> In HTML <input>-Tag mit type="text", value-Attribut bezieht sich auf die Komponenten (z. B. EL-Ausdruck) <h:inputSecret> In HTML <input>-Tag mit type="password" <h:commandButton> Button in HTML. <input>-Tag mit type-Attribut (submit, reset, image). Standardmäßig: submit. Sendet Formular ab und löst ActionEvent aus (über Bean-Methode). <h:message> Gibt die erste Fehlermeldung für die im for-Attribut angegebenen Komponenten aus. ErrorStyle-Attribut kann als CSS-Fehler-Darstellung genutzt werden. Einsatz
JavaServer Faces will eine einfache Möglichkeit bieten, leistungsfähige Webanwendungen zu schreiben, ohne dass man sich zu viele Gedanken über die Komplexität einer Webanwendung (Zustand über zustandsloses Protokoll, Request, Response, …) machen muss. Bei der Entwicklung soll es auch einem Programmierer einer Desktopanwendung erleichtert werden, Webanwendungen zu schreiben. Da große Firmen an der Spezifikation mitgearbeitet haben, wird JavaServer Faces faktisch zum Standard.
In der Breite konnten sich JavaServer Faces aber immer noch nicht durchsetzen. Das liegt unter anderem auch daran, dass JavaServer Faces seinen Ansprüchen nicht ganz gerecht wird. So muss der Programmierer viele Techniken beherrschen, unter anderem HTML, CSS, JavaScript, XML, einen Applikationsserver, eine Expression Language und JavaServer Pages. Zusätzlich muss man für eine Änderung mehrere Dateien in unterschiedlichen Verzeichnissen bearbeiten (XML-Konfiguration des Servlet-Containers, Navigationsregeln, JSP-Datei).
Prinzipiell eignen sich Frameworks wie JavaServer Faces oder Apache Wicket dazu, Rich Client-Anwendungen im ähnlichen Programmierstil wie GUI-Anwendungen im Internet abzubilden. Eine Stärke von JSF ist die dynamische Generierung von Formularen.
Für die Entwicklung von Webseiten mit zustandslosen und sauberen URL (z. B. zur Suchmaschinenoptimierung) sind allerdings Frameworks wie beispielsweise Apache Tapestry besser geeignet.
Literatur
- Martin Marinschek et al.: JavaServer Faces 2.0: Grundlagen und erweiterte Konzepte. 2009, dpunkt.verlag, ISBN 978-3-89864-606-2
- Bernd Müller: JavaServer Faces 2.0: Ein Arbeitsbuch für die Praxis. 2010, Hanser, ISBN 978-3-446-41992-6
- Marcel Urbanek: JavaServer Faces: JSF verstehen und praktisch einsetzen. 2010, w3l, ISBN 978-3-86834-003-7
Weblinks
- OpenSource-Implementierung Apache MyFaces
- JSF-Buch online
- JSF Tutorials (englisch)
- JSF AJAX Component Library Feature Matrix
- JSF-Implementierungs-Pattern (PDF-Datei; 618 kB)
- Demonstration von Standard- und Erweiterungskomponenten
Einzelnachweise
- ↑ [1], RichFaces Homepage, abgerufen am 18. Jänner 2011
- ↑ [2], PrimeFaces Homepage, abgerufen am 18. Jänner 2011
- ↑ [3], Oracle Mojarra JavaServer Faces Download Seite, abgerufen am 18. Jänner 2011
- ↑ Oracle: Oracle Mojarra JavaServer Faces. Abgerufen am 9. Oktober 2011.
- ↑ Andy Bosch: Was ist neu in JSF 2.1. Abgerufen am 9. Oktober 2011.
- ↑ Oracle: Oracle Mojarra JavaServer Faces. Abgerufen am 9. Oktober 2011.
Kategorien:- Java-Programmierschnittstelle
- Web-Entwicklung
Wikimedia Foundation.