czerwiec 13, 2009
JSF i RichFaces – pierwsze starcie
Za namową Darka Ludery postanowiłem troszeczkę jeszcze pogrzebać przy samym wyborze JSF. To, że jest to framework wręcz stworzony do rozszerzania o inne funkcjonalności już dowiedziałem się wcześniej. Zresztą w książce o JSF piszą o Apache Tiles, Strutsie i trochę o AJAXie. Darek w komentarzu do poprzedniego mojego wpisu zasugerował RichFaces. Zajrzałem, popatrzyłem i jest fajnie – JQuery UI dla Javy, ale tak na oko 6,5 raza lepszy.
No ale dość gadania. Wypadałoby zabrać się do jakieś roboty. Próbowałem stworzyć projekt na swoim starym dobrym NetBeansie w wersji 6.5, ale cosik mi się popieprzyło (nagle uruchomienie Tomcata wywalało błąd, że kompilator nie może odnaleźć klasy Object, wtf?). Przeinstalowałem zatem temat i na pokładzie mam ślicznego NetBeansa w wersji 6.5.1, GlassFisha w wersji jeszcze 2 (rozwojowa wersja 3 mnie póki co nie interesuje), no i przeinstalowałem Tomcata. Nie wiem czy zapamiętano wszystkie pluginy, które wcześniej miałem poinstalowane czy co, ale kwestia jest taka, że po upgradzie dalej sypało mi błędami. Jednakże może wpierw proces tworzenia projektu:
Tworzymy nowy projekt. File->New Project->Java Web->Web Application.

Wybieramy nazwę dla projektu, lokalizację i takie tam:

Środowisko uruchomieniowe:

No i na końcu dorzucamy sobie biblioteki, które chcemy wykorzystać. Dla przypomnienia – Hibernate, JSF, RichFaces.

Klikając na kolejne elementy listy na dole pojawiają się opcje konfiguracyjne. Ja tam ustawiłem wersję dla JSF (1.2), a także wybrałem połączenie MySQL. Zainstalowałem sobie lokalnie PostgreSQL. Jeśli na moim hostingu dałoby się toto również zainstalować, wówczas cała aplikacja będzie powstawała z tym systemem bazodanowym. Zawsze coś innego niż do tej pory (z PostgreSQL pracowałem ze dwa miesiące może w poprzedniej firmie). Pozostaje też pytanie o mój hosting. Podobnie jak z HowToJava byłoby dobrze móc pokazywać efekty swojej pracy szerokiej publice – jeśli da radę zainstalować na serwerze PostgreSQL to będzie w ogóle miło.
Na sam koniec wypada pokazać jak wygląda nasz nowo utworzony projekt:

Wygląda niby ciekawie, ale jak już wspomniałem wcześniej – takie coś się nie uruchomi! (przynajmniej u mnie nie chciało). Przeorałem net i w końcu postanowiłem iść metodą drobnych kroczków.
Sypała błędami deklaracja taglibów w pliku JSP:
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
Po usunięciu z kodu wszystko działa ślicznie pięknie, idzie deploy, Tomcat odpala się aż miło. Generalnie na necie znalazłem opis podobnego przypadku, ale kolesiowi wyrzucało problemy, gdyż dodatkowo miał wrzucony do WEB-INF/lib plik jar z biblioteką ajax4jsf. Ja nie miałem i w myśl tego tutoriala (oficjalnego) mieć nie powinienem. Jedyną zadeklarowaną biblioteką znaczników powinna być:
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>
Tylko to dotyczy tylko i wyłącznie RichFaces. No a gdzie AJAX mój kochany? Postanowiłem nie dać za wygraną i opdrążyć temat głębiej. Dlaczego bowiem domyślne odpalenie projektu skutkuje błędami? Aż taki bug? Rozumiem, że wsparcie dla RichFaces jest pluginem, no ale bez przesady. Wspomniana biblioteka ajax4jsf została zintegrowana z RichFaces już jakiś czas temu. Dziwne toto.
Zrobiłem tak. Usunąłem z libraries wpisy dotyczące RichFaces. Po czym ściągnąłem najnowszą wersję tego frameworka, rozpakowałem 3 jary do WEB-INF/lib i dodałem je do projektu. Run i… DZIAŁA! Jednakże w logu uruchomienia Tomcata dalej znajduję takie coś:
2009-06-13 01:53:06 org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.
Could not load java.lang.Object.
The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
No ja rozumiem, debugging purposes, ale dlaczego wszystko poza tym działa? Wpisuję w okienko tekst, a on się automatycznie wyświetla poniżej (czyli a4j zaskoczył). Totalnie nie mam pojęcia o co w tym chodzi. Obiecywałem sobie, że w Javie będę grzecznie orientował się na wiedzę, a nie osiągnięte cele, a tutaj mam zagwozdkę – cel osiągnięty, wiedzy do końca to nie ma. No ale może mądrzejsi po przeczytaniu tego postu podsuną jakieś rozwiązanie. Na pożegnanie screen z “HelloWorld” konglomeratu JSF+RichFaces
