19 sierpnia 2008

Dyskusje o znaczeniu facelets

Ugrzązłem w rozwoju wtyczki Geronimo NetBeans Plugin i testowaniu (nie)doskonałości rozwojowej wersji NetBeans 6.5, więc powiało orzeźwieniem (auć, początkowo napisałem przez 'ż'!), kiedy przeglądając listę dyskusyjną pl.comp.lang.java natrafiłem na zamierzchły już wątek JSF-facelets a pozycjonowanie i bezposredni URL, w którym Michał odpytywał Brzeziego o znaczenie facelets w świecie aplikacji JSF, szczególnie w kontekście istnienia JBoss Seam, JSF 1.2, Unified EL oraz JSTL 1.2. Nie długo trwało, kiedy trafiłem na bardzo podobną dyskusję tyle, że dotyczyła JSF Templating oraz facelets (mimo wyraźnego porównania różnych rozwiązań, wciąż dotyczyła sensu istnienia facelets) - Facelets vs. JSF Templating. To właśnie ten wątek "zmusił" mnie do pobrania specyfikacji JSR-314 JavaServer Faces 2.0, w której naocznie przekonałem się o znaczeniu facelets w rozwoju JSF 2.0 (patrz rozdział Integration with Facelets jako równouprawnionego do Integration with JSP, acz wyjątkowo skromnego w treści):

As of version 2 of this specification, JavaServer Faces implementations must support (although JSF-based applications need not utilize) using Facelets as the page description language for JSF pages.

This chapter is a place holder for the Facelets specification. Currently it is a scratch pad for spec assertions that apply to Facelets features that are not yet implemented in the current Facelets implementation.


Dodając do tego niedawno zakończoną lekturę książki Facelets Roberta Swarra (O'Reilly, March 2007), której moją recenzję można znaleźć w Book review: Facelets nie mogłem oprzeć się pokusie zdabania tematu i znalezienia odpowiedzi na pytanie, czy wciąż warto zajmować się facelets. W zasadzie to sama wzmianka w specyfikacji JSF 2.0 odpowiada na to pytanie, ale pytanie o znaczenie facelets było w kontekście obecnych technologii webowych, gdzie wciąż króluje JSF 1.2 ze wsparciem JBoss Seam (albo odwrotnie).

Pierwsza strona projektu facelets opisuje go jako Facelets is a view technology that focuses on building JSF component trees. Hmmm, pewnie nie bardzo zrozumiałe dla nowicjuszy jsfowych, więc z pomocą może przyjść dokumentacja facelets - Facelets - JavaServer Faces View Definition Framework, a szczególnie rozdział Chapter 6. Facelets Architecture - (a za nią i wspomniana książka Facelets), gdzie jego obszar działania przedstawiony jest jako:

Facelets is founded on simple principles and the API is a solid reflection of it. The framework is focused on one specific task, and that's tree creation and content interweaving-- taking an XHTML or XML document and using it as instructions to populate a tree of UIComponents. That's it.

A technicznie, sprowadza się do zarejestrowania nowego JSF ViewHandler - com.sun.facelets.FaceletViewHandler w faces-config.xml i cały świat facelets stoi otworem. Od tej pory zamiast JSP jako technologii wizualizacji interfejsu użytkownika korzystamy z XHTML, więc znaczniki JSP, które do tej pory były stosowane idą w odstawkę, a na ich miejsce należy odszukać odpowiedników faceletowych (patrz Why can't I use {JSP Tag library name here} with Facelets?). Można oczywiście stosować facelets i JSP w pojedyńczej aplikacji webowej (patrz How do I use Facelets and JSP in the same application?), więc nic straconego. facelets jest również podstawowym budowniczym widoku w JBoss Seam, więc i na tej podstawie możnaby wysnuć pewne podejrzenia o niebagatelnym znaczeniu facelets.

Ja jednak wciąż nie mogę uporać się ze znacznikami jpivot, które są dla mnie kluczowym elementem w obecnym projekcie. Powodem dla wdrożenia facelets w projekcie było przede wszystkim wsparcie dla tworzenia szablonów, dzięki którym mógłbym podzielić stronę na cześci - nagłówek, stopka, lewy/prawy panel, środek i całkowicie zapomnieć o JSF-owym f:subview i różnych temupodobnych technikach włączania podstron znanych z JSP (ala jsp:include). Książka Facelets uspokoiła mnie, że nie jestem stracony i użycie znaczników JSP dla jpivot będzie możliwe, ale wciąż zastanawiam się, jakie należy podjąć kroki, aby aplikację uruchomić wespół z jpivot i facelets. Początkowo próbowałem się z JBoss Seam, ale zdaje się, że na chwilę obecną wystarczy duet facelets oraz jpivot. Jeszcze rozważam, ile faktycznie mogę poświęcić czasu na rozwiązywanie potencjalnych błędów (kiedy wtyczka GNP czeka). A jak u Was wygląda użycie facelets? Jest dla niego miejsce?

Zagadka na koniec. Właśnie na nią wpadłem i nie mogłem kryć jej dla siebie. Do czego służy poniższa komenda?
 jlaskowski@work /cygdrive/c/apps/netbeans-nightly
$ cmd /C start netbeans-trunk-nightly-200808190201.zip
Zamiast wykonywać kilka czynności, teraz mogę "załatwić" to jedną.