JSF 2.0 ist da! - JAXenter
Die FacesTales-Kolumne

JSF 2.0 ist da!

Lars Röwekamp und Matthias Weßendorf

Nach einer Pause geht die FacesTales-Kolumne mit einem kleinen Überblick zu JSF 2.0 in die nächste Runde. Seit Oktober 2008 steht der zweite öffentliche Entwurf der Spezifikation zum Review durch die Java Community bereit.

Neue Feature braucht das Land

Die Spezifikation bietet einige Neuerungen:

  • Facelets-Integration (Komponentenentwicklung und PDL)
  • Einheitliches „Resource Handling“
  • Erweiterte Scopes
  • SystemEvents
  • Ajax etc.
System Events

SystemEvents repräsentieren, anders als die bekannten JSF-Events, spezielle Punkte im Lebenszyklus einer JSF-Anwendung. Bisher angedacht sind SystemEvents, die signalisieren, dass eine Komponente zur View hinzugefügt wurde (AfterAddToParentEvent) bzw. davorsteht, gerendert zu werden (BeforeRenderEvent). Für den neu eingeführten ViewScope sind ebenfalls Events angedacht (ViewMapCreatedEvent und ViewMapDestroyedEvent). Auch die erfolgreich abgeschlossene Konfiguration der JSF-Anwendung und das bevorstehende Herunterfahren wird durch eigene SystemEvents signalisiert (ApplicationPostConstructEvent bzw. ApplicationPreDestroyEvent). Um gezielt auf ein SystemEvent reagieren zu können, lassen sich entsprechende EventListener bei dem Application-Objekt (SystemEventListener) oder aber bei einzelnen Komponenten (ComponentSystemEventListener) registrieren, alternativ stehen Annotationen bereit. Intern werden die neuen Events z.B. zur dynamischen Ressourcenverwaltung verwendet: Indem ein spezieller Renderer via SystemEventListener auf das Hinzufügen des neuen h:outputScript>-Tags (AfterAddToParentEvent) „hört“, kann die Ausgabe des durch das Tag referenzierten JavaScripts entsprechend der angegebenen Tag-Attribute gesteuert werden. Aktuell kann ein solches Verhalten nur erreicht werden, indem man zum Beispiel (Tomahawk), den eigentlichen Response via Filter abfängt und nachträglich modifiziert – eine nicht gerade performante Variante.

Was aber bringen die neuen SystemEvents dem Entwickler, der nicht täglich mit der Implementierung von Komponentenbibliotheken beschäftigt ist? Ein Beispiel ist das Ausführen von anwendungspezifischem Startup-Code. Bisher ist der JSF-Entwickler gezwungen, zu diesem Zweck einen ServletContextListener und somit ein Konstrukt außerhalb der JSF-Welt zu verwenden, was aufgrund einer nicht für alle Situationen genau spezifizierten Aufrufreihenfolge unter Umständen zu unliebsamen Nebenwirkungen führt. Mithilfe der SystemEvents dagegen kann in einer JSF-2.0-Anwendung auf den Abschluss der Konfiguration und somit auf das Auftreten des ApplicationPostConstructEvent „gehorcht“ und mithilfe eines entsprechenden SystemEventListeners der Startup-Code angestoßen werden. Näheres zum Thema System Events findet sich auch in einem Blogeintrag von Ryan Lubke.

Ajax

Im Web-2.0-Zeitalter darf das Thema Ajax natürlich in der neuen Spezifikation nicht fehlen. Sie geht sogar soweit, dass sie ein JavaScript API für Ajax anbietet! Dadurch können diverse JSF Frameworks schneller auf einen gemeinsamen Nenner gebracht werden, die dann einen einheitlichen Kommunikationskanal für „Ajax“ nutzen. Mit der JS-Funktion ajaxRequest() kann der Entwickler eine Komponente ajaxifizieren:

Neben dem HTML-Element (this) und dem JS-Event (event) werden zwei Optionen übergeben. Mit execute werden die clientseitigen IDs der Komponenten angegeben, die innerhalb der Lifecycle.execute()-Methode (JSF Lifecycle Phase 1 bis 5) ausgeführt werden. Die render-Option bestimmt die Komponenten für die letzte Phase (Lifecycle.render()). Doch was bedeutet das? JSF 2.0 verarbeitet bei einem Ajax-Postback nur Teile des Komponentenbaums, dadurch sind die properitären Phaselistener-Hacks endlich Vergangenheit! Die UIViewRoot-Komponente identifiziert die „Ajax-Komponenten“ und ruft an ihnen die entsprechenden Lifecycle-Methoden auf. Sie nutzt dabei neuen Ajax-Methoden des FacesContext sowie verschiedene ContextCallback-Implementierungen. Dies ist durchaus interessant, allerdings nicht wirklich neu. Oracle’s ADF Faces realisiert das bereits heute. Lobenswert ist die direkte Verankerung in der Spezifikation. Jedoch hat die Ajax-Integration auch noch kleine Schwächen. Wie oben ersichtlich, ist die Realisierung eher unbequem, da es JS-Code benötigt. Eine deklarative Variante ist wünschenswert. Ein weiterer Nachteil ist, dass nun jeder Ajax-Request direkt an das FacesServlet geschickt wird. Will man mit Ajax ein (JSON)Servlet ansprechen, muss man zusätzliches JS einbinden. Natürlich ist das JSF Ajax API ein erster und wichtiger Schritt, jedoch sollten hier die gebotenen Möglichkeiten ausgebaut werden.

Lars Röwekamp ist Geschäftsführer der OpenKnowledge GmbH und berät seit mehr als 10 Jahren Kunden in internationalen Projekten rund um das Thema Enterprise Computing.

Matthias Weßendorf arbeitet für die Oracle Corp. an ADF Faces und Apache Trinidad. Seit 2004 ist er PMC von Apache MyFaces. Matthias hat an verschiedenen internationalen Konferenzen als Redner teilgenommen.

Geschrieben von
Lars Röwekamp und Matthias Weßendorf
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.