Głośno ostatnio na DWorld i DZone zrobiło się o nowej odsłonie Vaadina – frameworku opartego na GWT. Nigdy wcześniej nie miałem styczności z GWT (prócz kilku tutoriali i paru hellowordów). Pracuję natomiast na codzień z JSF – najczęściej w implementacji Richfaces. Chciałem więc sprawdzić co potrafi ten rozchwalany na lewo i prawo Vaadin oraz jak jego zestaw gotowych komponentów ma się do Richfaces w kontekście budowania interfejsu użytkownika dla aplikacji ‘biznesowych’ (tabele, modalpanele, itp, itd) w konwencji podbierania gotowych komponentów ze stron frameworków (odpowiednio tej i tej). Mam świadomość tego, że porównywanie Vaadina do Richfaces to jak zestawianie arbuzów z dyniami – za jedyne kryterium porównawcze chciałem zatem przyjąć ogólną prostotę danego rozwiązania. Chodziło o to żeby zrobić (CRUDa, a jakże) a się nie narobić
Najprostszą metodą stworzenia działającego projektu Vaadin, jest wyklikanie go z poziomu Eclipse (kreatory i edytor WYSIWYG). Najłatwiejszą, jaką znam, metodą zbudowania projektu opartego o Richfaces jest pobranie przykładowej aplikacji i wyrzucenie niepotrzebnych plików albo… wygenerowanie Seamowego projektu seam-gen’em. Można również oczywiście w obu przypadkach bawić się w Mavena.
Poznawanie Vaadina rozpocząłem właśnie od napisania sobie AddressBook‘a – nic innego jak CRUD, który chciałem stworzyć samemu… Stwierdziłem więc, że może chociaż samemu dorzucę ORM (JPA) i zobaczę czy nadal wszystko będzie tak gładko chodzić, to też już ktoś wcześniej zrobił
Pomyślałem więc, że zbiorę chociaż wszystko to do kupy i sprawdzę czy się nie ‘gryzie’. Napisałem zatem mavenowy AddressBook z JPA, pracujący na Glassfish 3.1 z Oracle 10g Express Edition w tle – zadziałało. Poniżej listing jak wygenerować szablon projektu Vaadina w mavenie, oraz gotowy projekt do pobrania plus kilka podpowiedzi jak coś takiego uruchomić tudzież ‘napisać’ samemu.
0) instalujemy i konfigurujemy Oracle 10g Express Edition
1) pobieramy najnowszego glassfisha 3.1 (wersja 3 zawiera bug niepozwalający na swobodne korzystanie z Vaadin – chodzi o ładowanie klas)
2) do $GLASSFISH_HOME/glassfish/lib dorzucamy sterownik ojdbc14.jar
3) z $GLASSFISH_HOME/bin uruchamiamy asadmin start domain – startujemy domyślną (domain1) domenę serwera wszystkorobiącym skryptem asadmin
4) otwieramy konsolę administracyjną Glassfisha (http://localhost:4848) i wybieramy z menu Resources->JDBC->JDBC Connection Pools
5) dodajemy pulę połączeń do naszej bazy
6) dodajemy JDBC Recource (o nazwie jdbc/sample) dla skonfigurowanej przed chwilą puli połączeń – będziemy się do tego źródła danych odwoływać z poziomu aplikacji (w persistance.xml)
7) restartujemy serwer (asadmin stop-domain; asadmin start-domain)
8 ) generujemy projekt skryptem mvnAddressBook.sh:
#!/bin/bash if [ "$#" -gt 2 ] then groupId=$1 artifactId=$2 else artifactId=AddressBook groupId=com.vaadin.demo.tutorial.addressbook fi mvn archetype:generate -DarchetypeGroupId=com.vaadin -DarchetypeArtifactId=vaadin-archetype-clean -DarchetypeVersion=LATEST -DgroupId="$groupId" -DartifactId="$artifactId" -Dversion=1.0 -Dpackaging=war cd $artifactId; mvn eclipse:eclipse
9) importujemy projekt do Eclipse z zainstalowanym pluginem do Vaadina (dzięki temu będziemy mieć edytor WYSIWYG do składania GUI z klocków)
10) rozwiązanie zależności z Glassfish w pom.xml (po pobraniu projektu dołączonego do tego wpisu ustaw własną ścieżkę!)
11) teraz najważniejsze. według uznania, przechodzimy przez tutorial AddressBook i AddressBook+JPA pamiętając o hierarchii projektu narzuconej przez Maven lub ściągamy gotowy projekt i przerzucamy kod do naszego. Dodajemy również web.xml z pustą deklaracją – korzystamy z Java EE6, więc konfigurujemy serwlety adnotacjami – patrz AddressBookApplication (jak widać konfiguracja Vaadina jest właściwie zerowa,w odróżnieniu od JSF gdzie skazani jesteśmy na klepanie kilometrowych plików typu faces-config.xml)
12) dorzucamy katalogi src/test/resources i implementujemy testy jednostkowe!
13) mvn compile war:war
14) delpoy aplikacji z poziomu konsoli administracyjnej Glassfish (pozycja menu Applications), z Eclipsa lub Mavenem.
Podsumowanie.
Nie pisałem ostatecznie analogicznej aplikacji w Seam (z Richfaces). Wiem bowiem jak coś takiego zrobić i jak świetnym narzędziem do generowania CRUDów jest seam-gen. Jeśli chodzi o Vaadin to muszę powiedzieć, że ten framework przegania pod względem prostoty JSF (nawet z tak świetnym zestawem komponentów jak Richfaces). Pisząc w Vaadin ani razu nie musimy zaglądać do web.xml, czy innych charakterystycznych dla frameworku xmli – i to jest świetne. Kuleje mocno edytor WYSIWYG – obecnie w fazie testów. Jak widać Vaadin da się zaprząc całokowicie bezboleśnie do współpracy z Java EE. Ciekaw natomiast jestem, czy da się (i czy jest sens) pożenić Vaadina z Seamem – ktoś próbował?
Wnioski.
Koniecznie zmienić skórkę dla bloga, bo się nie mieszczę!
PS. Jeszcze taka jedna obserwacja. Dzięki temu, że JSF podzielony jest na widok (jsp lub facelets) i kontroler (managed beans), ciężej niż w Vaadin jest napisać śmietnik zamiast kodu. Jedyne ryzyko, to to że nasze beany zamiast obiektowych będą kodem proceduralnym. Vaadin jest badzo podobny do Swinga, wypada więc strategicznie komponować kod zamiast uwailić całe GUI w metodzie init()
Sugestie jak pisać czysty kod w Vaadin znaleźć można w samej aplikacji AddressBook oraz w Book of Vaadin (nie mylić z tym)
PS2. Zapowiada się świetna okazja, by już 20.04.2010 posłuchać paru mądrych słów o Vaadin. Ja z przyczyn obiektywnych niestety nie będę mógł skorzystać, niemniej jednak zapraszam bo na pewno warto!
Kompletny projekt do pobrania





![AddressBook [Vaadin, Java EE6 (Servlets, EJB 3, JPA), Glassfish, Oracle DB]](http://ludera.info/wp-content/uploads/2010/04/3.png)