JSF ist ein wunderbares Framework zur Erstellung von Rich-Client Anwendungen, die auf Web-Technologieen basieren. Die große Stärke von JSF ist die komponentenbasierte Architektur. Dritthersteller wie JBoss (www.jboss.org/richfaces) und Oracle (Oracle ADF) stellen mächtige Komponenten zur Erstellung von AJAX-unterstützten Web-Anwendungen bereit.
Leider jedoch ist es sehr schwierig, Get-Anfragen mit Hilfe von JSF zu implementieren. In Version 1.2 gibt es überhaut keine Unterstützung dafür. In JSF 2.0 werden endlich zwei Komponenten für Get-Anfragen eingeführt:
<h:link> und <h:button>
Zur Zeit ist JSF 2.0 jedoch oft noch nicht wirklich eine Alternative, da weder die finale Version des JBoss 6 draußen ist noch darauf basierende Bibliotheken wie Rich Faces 4.0 finalisiert wurden.
Aber warum sind denn Get-Anfragen überhaupt notwendig? Nun, die beiden wichtigsten HTTP-Anfragen sind Post und Get. Mit Post werden Daten üblicherweise an den Server gesendet (im HTTP-Body) und mit Get Daten abgerufen. Dass JSF nun ausschließlich über Post mit dem Server kommuniziert, hat hauptsächlich zwei Nachteile:
-Es lassen sich keine Bookmarks auf Post-Anfragen setzen
Dies ist jedoch oft eine wichtige Anforderung an Software. Ein Nutzer möchte sich bestimmte Artikel oder Informationen gerne als Bookmark merken oder einfach als Link verschicken.
-Die Browser Navigation funktioniert nicht wie gewünscht
Betätigt ein Nutzer den Zurück-Button des Browsers oder den Refresh-Button, kommt es zu einer Nachfrage des Browsers, z. B. im Firefox:
Um diese Seite anzuzeigen, müssen die von Firefox gesendeten Daten erneut gesendet werden, wodurch alle zuvor durchgeführten Aktionen wiederholt werden (wie eine Suche oder eine Bestellungsaufgabe)
Dieses Verhalten ist natürlich nach abgeschickten Formularen durchaus gewünscht, wer möchte zum Beispiel den gleichen Artikel mehrmals bestellen, nur weil der den Refresh Button betätigt? Bei einem reinen Abruf von Informationen ist diese Meldung aber eher verwirrend.
Letzerer Punkt lässt sich dadurch beheben, dass in der faces-config.xml ein <redirect> in die Navigation eingetragen wird. Somit wird nach der Post Anfrage über einen Redirect eine Get Anfrage abgeschickt. (mehr zu dem Thema gibts unter dem Schlagwort PRG-Pattern nachzulesen, z. B. hier: http://en.wikipedia.org/wiki/Post/Redirect/Get) Dies funktioniert allerdings auch nur vernünftig bei Managed-Beans, die in der Session liegen, sonst gehen nach dem Redirect die HTTP-Query Parameter verloren.
Ersterer Punkt lässt sich z. B. dadurch umgehen, dass über einen <h:outputLink> ein gewöhnlicher Link mit Get-Parametern aufgebaut wird, der auf eine JSF-View zeigt. (s. auch http://entwickler-forum.de/archive/index.php/t-41706.html) Nachteil an dieser Lösung: Es wird keine Action-Methode einer Managed-Bean aufgerufen. Das bedeutet, dass sämtliche Logik, die für die JSF-View benötigt wird, in die get-Methoden der Managed Bean untergebracht werden muss. Bei Seiten, die ausschließlich Informationen darstellen, ein Kompromiss der m. E. nach ok ist.
Es gibt also durchaus Möglichkeiten, auch mit JSF 1.2 GET-Anfragen zu berücksichtigen. Dennoch freue ich mich schon sehr auf Version 2.0, in der anscheinend honoriert wurde, dass Get-Anfragen einfach ein wichtiger Bestandteil einer Web-Anwendung sein können. Dies wird auch durch den Trend von Rest, s. hierzu auch mein Artikel bei ORDIX (http://www.ordix.de/ORDIXNews/1_2009/IT-Strategie/SOA_restful_web_services.html) untermauert wird.
An dieser Stelle möchte ich noch auf ein interessantes Framework hinweisen: http://ocpsoft.com/prettyfaces/. Wer bereit ist, ein weiteres Framework zur Lösung dieser Problematik einzubeziehen, wird hier fündig. Leider hatte ich so meine Probleme, Pretty Faces im aktuellen Projekt zum Laufen zu bekommen, aber das Feedback anderer Entwickler war durchaus positiv und in einem kleinen Testprojekt funktionierte es einwandfrei.