13 września 2009

Ciekawostki Grails z książki "Grails 1.1 Web Application Development"

Podczas lektury ostatniej książki o Grails - Grails 1.1 Web Application Development (której moją recenzję można przeczytać w Book review: Grails 1.1 Web Application Development) - zaintrygowała mnie wzmianka nt. Stripes. Jestem w trakcie czytania kolejnej książki o Grails i tam również trafiłem na Stripes. Mam wrażenie, jakby w tym szkielecie aplikacyjnym było coś, co podobnie jak w Wicket sprawia, że jest to całkiem ciekawe rozwiązanie, ale brakuje mu po prostu rozgłosu. Chyba kolejny raz potwierdza się reguła, że dobre samo się nie obroni i potrzeba trochę PRu, aby zademonstrować jego siłę. Pamiętam wystąpienie Jacka Lisa o Stripes, ale było to tak dawno, że nie ukrywałbym swojego zainteresowania, gdyby ktoś zechciał przedstawić go jeszcze raz w ramach spotkań grupy Warszawa JUG.

Jednej z rzeczy, na którą wcześniej nie zwróciłem uwagi było wyświetlanie wyłącznie 6 kolumn klasy dziedzinowej przy użyciu rusztowania (ang. scaffolding) w Grails. Krótki przykład jak najbardziej na miejscu. Zaczynamy od grails create-app barfaw, później cd barfaw, a dalej już pozostaje grails create-domain-class pl.jaceklaskowski.Uzytkownik, edycja klasy i dodanie więcej niż 6-ciu pól do niej, stworzenie kontrolera UzytkownikController (grails create-controller pl.jaceklaskowski.Uzytkownik) i włączenie rusztowania (niezapominając o skasowaniu akcji index), aby ostatecznie uruchomić aplikację poleceniem grails run-app.

(dla zainteresowanych: barfaw to taki na prędce sklecony skrót od BARdzo Fajna Aplikacja Webowa).

Co mnie niezwykle mile zaskoczyło, to fakt, że Grails 1.2-M2 przychodzi z całkiem nową, domyślną szatą graficzną. Niezwykle odświeżający widok.

Dodatkowo Grails chodzi domyślnie na Apache Tomcat! Wiedziałem, że w planach jest uruchomienie Grails na Tomcacie, ale sądziłem, że to jeszcze trochę potrwa. Co za niespodzianka! Mam wrażenie, że gdybym przeczytał Release Notes do tej wersji mógłbym poznać kilka innych ciekawostek, a tak pozostawiam ich spotkanie przypadkowi.

Dowiedziałem się również, że na szczycie hierarchii obiektów w Groovy stoi interfejs groovy.lang.GroovyObject z klasą abstrakcyjną groovy.lang.GroovyObjectSupport. Chcesz być obiektem Groovy a żyjesz na Javie? Wystarczy odpowiednia implementacja.

W końcu również udało mi się przez przypadek znaleźć rozwiązanie dla kwestii aktualizacji Grails bez konieczności aktualizacji wtyczek. Wystarczy zdefiniować zmienną grails.project.plugins.dir w grails-app/conf/BuildConfig.groovy i od tej pory wszystkie wtyczki trafią do wskazanego katalogu. Domyślnie wtyczki są umieszczane w katalogu zależnym od wersji Grails (w ścieżce katalogów jest numer wersji), więc wystarczyła zmiana Grails, aby całą instalację wtyczek zaczynać od nowa. Znając rozwiązanie, już nie.
 jlaskowski@work /cygdrive/c/projs/sandbox/barfaw
$ cat grails-app/conf/BuildConfig.groovy
grails.project.plugins.dir="c:/apps/grails-plugins"

jlaskowski@work /cygdrive/c/projs/sandbox/barfaw
$ grails install-plugin jsecurity
Welcome to Grails 1.2-M2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: c:/apps/grails

Base Directory: C:\projs\sandbox\barfaw
Running script c:\apps\grails\scripts\InstallPlugin.groovy
Environment set to development
Reading remote plugin list ...
Reading remote plugin list ...
Installing plug-in jsecurity-0.4.1
[mkdir] Created dir: c:\apps\grails-plugins\jsecurity-0.4.1
[unzip] Expanding: C:\Documents and Settings\jlaskowski\.grails\1.2-M2\plugins\grails-jsecurity-0.4.1.zip
into c:\apps\grails-plugins\jsecurity-0.4.1
Executing jsecurity-0.4.1 plugin post-install script ...
Plugin jsecurity-0.4.1 installed
Plug-in provides the following new scripts:
------------------------------------------
grails create-auth-controller
grails create-db-realm
grails create-ldap-realm
grails quick-start
Kolejną ciekawostką było przedstawienie różnicy między jawnym definiowaniem typu a użyciem def przy deklaracji pól obiektu, do których zostaną przypisane instancje usług (dzięki mechanizmowi DI). Niby niewinnie wyglądająca deklaracja

def fileService
nie różni się wiele od

FileService fileService
ale w pierwszym przypadku każdorazowa zmiana implementacji FileService będzie automatycznie przeładowana i ponownie przypisana, podczas gdy w drugim przypadku przypisanie nastąpi tylko na początku, a każda kolejna zmiana wymagała będzie ponownego uruchomienia (przeładowania) aplikacji. Zaletą tego drugiego jest wsparcie IDE przy rozwiązywaniu typu zmiennej i tym samym możliwość podpowiadania możliwych metod. Wybór należy do Ciebie.

Kolejna ciekawostka znaleziona w książce to nowe mapowanie usług RESTowych w Grails 1.1 przez resource, np.:

"/api/message/$id?"(resource: "api")
Wystarczy jedynie stworzyć kontroler ApiController, aby metody GET, PUT, POST oraz DELETE były automatycznie kierowane do akcji show, update, save oraz delete. Niewielka zmiana, a ile zaoszczędzi czasu podczas prototypowania (przynajmniej, a kto wie, czy nie w finalnej wersji aplikacji?).

Na koniec ciekawostek z książki padła wzmianka o Google Web Toolkit oraz Wicket. Niestety, ale poza wzmianką niewiele więcej. Ich zaletą jest uproszczone testowanie widoku, co nastręcza dużych trudności przy zastosowaniu GSP. Ostatni komentarz Graeme Rocher do wątku "Wicket plugin and Grails 1.1" na liście dyskusyjnej Grails nie pozostawia jednak złudzeń:

The Wicket plugin needs updating for 1.1, I decided to progress too much further with it until Groovy supports anonymous inner classes and nested classes

i dalej:

> Thx for your response, any idea when Groovy is planned to support anonymous inner classes?

Groovy 1.7


Jeśli miałbym wybierać między GWT a Wicket, to w przypadku integracji z Grails postawiłbym obecnie na GWT. Ale tylko do wersji Groovy 1.7.

9 komentarzy:

  1. To ja się może tu wypowiem skromnie, że dziś zacząłem uczyć się Grailsów a żeby nie było zbyt łatwo to robię od razu mały projekcik, bo jak wiadomo na helloworldach się nauczyć nic nie da. Noi siedzę już 11 godzinę i oderwać się nie mogę bo tak mnie wciągnęło i tak przyjemnie się w tym pisze :)

    Ta część komentarza była dla czytelników bloga Jacka, którzy jeszcze nie zaczęli korzystać z grailsów aby czym prędzej to zrobili :D

    Co do Stripes to również sobie bardzo chwalę ten framework, ponieważ jest bardzo lekki, jednocześnie jego funkcjonalność jest bardzo duża, przy tym jest łatwo rozszerzalny i elastyczny. No i fakt, jest mało popularny, więc kiepski support w sieci, ale jest tak mały, że sposób w jaki działa można nauczyć się na pamięć przeglądając źródła ;)

    OdpowiedzUsuń
  2. Jacek, to może następna recenzja książki będzie o Stripes?

    OdpowiedzUsuń
  3. Dzisiaj wróciłem od klienta, u którego zamierzam pchnąć Grails jako szkielet przewodni. Na razie jesteśmy na poziomie JSF 1.2, ale czuję, że już niewiele trzeba, aby poczuli radość tworzenia z/w Grails. Nie, nie mówię, że jest najlepszy, ale obecnie powiedzmy, że "urzekła mnie jego prostota". Gratulacje dla Sławka za dobry wybór! Czekam na prezentację aplikacji. Może podczas spotkania Warszawa JUG? Wystąpiłbyś w roli nowicjusza, który przedstawia swoje doświadczenia, a któremu sala (przynajmniej niektórzy, wliczając mnie) mogłaby pomóc usprawnić to i owo. Piszesz się?

    @RomeoAD: Chciałbyś :) Najpierw Clojure, a później pewnie powrót do OSGi i Java EE 6. Na brak książek nie narzekam, a raczej na brak pomysłów, jakby tu innych zaangażować do czytania. Chcesz ją przeczytać? Pisz na priv. Mam do przeczytania od nich wspomniane Clojure, ale pewnie dałoby się załatwić coś ponadto.

    OdpowiedzUsuń
  4. > Gratulacje dla Sławka za dobry wybór!
    Dobry i jedyny słuszny :P

    > Czekam na prezentację aplikacji.
    Aplikacja to za dużo powiedziane. Chcę zrobić stronę o moich ostatnich podróżach i choć z powodzeniem można to zrobić w statycznym html'u to w Twoją myśl, którą często powtarzasz na blogu i konferencjach, by łączyć przyjemne z pożytecznym, postanowiłem zrobić tą stronę w grails ucząc się go przy tym.

    > Może podczas spotkania Warszawa JUG?
    > Wystąpiłbyś w roli nowicjusza, który
    > przedstawia swoje doświadczenia, a
    > któremu sala (przynajmniej niektórzy,
    > wliczając mnie) mogłaby pomóc
    > usprawnić to i owo. Piszesz się?
    Wow, wow wow, tego się nie spodziewałem, byłby to dla mnie zaszczyt i ciekawe doświadczenie lecz muszę odmówić, do Warszawy nie blisko, a i chęci nie szczególne, zapał do konferencji i spotkań javowych znikł już dawno, a programowanie przestało być hobby a stało się sposobem na zarobek, w wolnych chwilach więc wolę robić coś ciekawszego niż przygotowywać prezentację o mojej nic nie robiącej "aplikacji" i omawiać ją na WJUGu ;) sorry za szczerość, ale wycieczki rowerem czy wędrówki po górach są jeszcze bardziej ciekawsze niż grails ;)

    OdpowiedzUsuń
  5. Pozostaje jedynie powtórzyć "Gratulacje dla Sławka za dobry wybór!". Mam nadzieję jednak, że nie tylko wypali Twój projekt rowerowo-grailsowy (kolejność nieprzypadkowa) i uda Ci się dojechać rowerem na spotkanie WJUGa. Byłoby niezwykle inspirujące doświadczenie dla obu stron.

    OdpowiedzUsuń
  6. Jacek,
    skoro klient bardziej nastawiony na JSF 1.2 to może spróbować go przekonać do SEAM lub Wicketa który jest na pewno bliższy dżejesefowi niż grails?

    Wszak jeszcze rok temu byłeś zachwycony właśnie Wicketem ;)

    OdpowiedzUsuń
  7. Great minds think alike Dokładnie tak postąpiłem. Wpuściłem ich w JSF 1.2, ale na razie bez Seama, a o Wickecie to nawet nie myślę, bo obawiam się, że jest zbyt wyrafinowany. Wciąż mi się marzy powrót do niego, ale to chyba nastąpi po Groovy 1.7, kiedy pojawi się wsparcie dla "inner classes", które są niezwykle intensywnie wykorzystywane przez Wicket, co "przeszkadza" w integracji z Grails.

    OdpowiedzUsuń
  8. właśnie właśnie,
    Seam a nie SEAM, bo zaraz Paweł W. na mnie nakrzyczy ;)

    OdpowiedzUsuń
  9. Mam nadzieję jednak, że nie tylko wypali Twój projekt rowerowo-grailsowy (kolejność nieprzypadkowa)

    Noi wypalił choć dzień po uruchomieniu padł nam dysk na serwerze ale już wszystko działa. :) Aplikacja jest porściutka stronka + panel admina ale ze względu na treść zapraszam.
    http://knp.uek.krakow.pl/rowerowi/

    Oczywiście całość zrobiona w Grails :)

    OdpowiedzUsuń