Posts tagged grails

Integracja Grails z Flex

Ci, którzy śledzą “życie” technologii Grails, prawdopodobnie zauważyli kształtujący się od pewnego czasu trend wykorzystania tandemu Grails oraz Flex do budowy systemów internetowych. Nie jest to póki co trend dominujący w świecie Grails i prawdopodobnie nim nie będzie. Z całą pewnością jednak jest dość ciekawym pomysłem na wytwarzanie RIA (ang. Rich Internet Application).

Zasadnicza koncepcja jest prosta: użyć Flex jako front-end, Grails jako back-end i zintegrować jedno z drugim. Brzmi łatwo, ale bardziej doświadczeni developerzy (szczególni Ci, zajmujący się systemami rozproszonymi) zapewne dostali właśnie dreszczy, widząc magiczne słowo: “zintegrować”. Mam dobrą wiadomość: w tym przypadku integracja obu technologii jest łatwa, szybka i przyjemna. Wydaje mi się, że jest to jedna z głównych przyczyn rosnącej popularności omawianego rozwiązania.

Na początek warto zastanowić się po co właściwie nam Grails + Flex. Można przecież zbudować aplikację internetową w Grails od początku do końca, podobnie zresztą jak we Flex. Użycie kombinacji obu technologii ma sens w przypadku, gdy robimy RIA, ale implementację logiki biznesowej chcielibyśmy pozostawić na serwerze, a także, dodatkowo, chcemy to wszystko wykonać w możliwie dobrych technologiach, które całą sprawę nam ułatwią, a nie utrudnią i zapewnią, przy okazji, realizację kilku wymagań niefunkcjonalnych (jak choćby duża przenośność), na których na pewno nam zależy. Grails + Flex = dokładnie to. Flex jest świetną technologią, która oferuje nam pełną potęgę graficzną Flash’a, ale w formie przyjaznej programiście (a nie grafikowi). Grails natomiast pozwala wykorzystać w całości moc platformy Java EE (czyli również jej bogactwo bibliotek, framework’ów oraz innych narzędzi), czyniąc jednak programowanie łatwiejszym i szybszym dzięki takim cechom jak choćby zasady DRY (Don’t Repeat Yourself – Nie powtarzaj się) i Convention Over Configuration (Konwencja ponad konfigurację), język programowania Groovy czy technologie Spring i Hibernate podane “na tacy”, bez żadnego dodatkowego wkładu pracy w konfigurację itp. Więcej na ten temat przeczytać można we wcześniejszym wpisie Pawła.

Teraz czas na właściwą integrację. Po stronie Grails nie musimy właściwie nic robić, bo wszystko załatwia jeden plug-in. Wystarczy go zainstalować, wydając z konsoli (w katalogu głównym projektu Grails) polecenie:

grails install-plugin flex

oraz dodać w klasie usługowej (ang. service), która implementuje logikę biznesową, którą chcemy udostępnić aplikacji Flex, jedno pole statyczne:

static expose = ['flex-remoting']

i to wszystko! Usługa będzie od teraz udostępniona. Powiedzmy, że wygląda ona tak:

class HelloService {
    static expose = ['flex-remoting']
    def hello() {
        return "Hello World!"
    }
}

W aplikacji Flex wystarczy powołać obiekt RemoteObject:

<mx:RemoteObject id="myService" destination="helloService"/>

by móc korzystać z naszej usługi. Przykładowa aplikacja może wyglądać tak:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:RemoteObject id="myService" destination="helloService"/>
    <mx:Button label="Hello" click="myService.hello()"/>
    <mx:TextInput text="{myService.hello.lastResult}"/>
</mx:Application>

Nic dodać, nic ująć. Zero konfiguracji. To po prostu działa… i już!

Ale właściwie… jak to działa? Otóż nie ma tu żadnej “magii”, wbrew temu co widać na pierwszy rzut oka. “Pod maską” siedzi magiczny komponent BlazeDS i odrobina Convention Over Configuration. BlazeDS jest technologią serwerową, która obsługuje styk Grails <=> Flex (a tak naprawdę to Java <=> ActionScript) poprzez implementację mechanizmu RPC, tak jak to pokazano wyżej. Przez “obsługuje” rozumiem wszystko, co jest potrzebne do zdalnego wywołania metody logiki biznesowej: udostępnienie usługi w sieci (pod konkretnym URL), ustalenie protokołu komunikacyjnego ponad warstwą HTTP oraz zapewnienie konwersji typów między światem Java, a światem ActionScript. Część “magii”, jak sądzę, została już wyjaśniona. Idźmy dalej. Przenieśmy naszą aplikację Flex do osobnego projektu, czyli rozdzielmy całość na projekt Grails i projekt Flex. Okaże się, że nagle wszystko przestało działać, co zresztą nie dziwi, bo niby skąd aplikacja Flex ma mieć pojęcie co zrobić z:

<mx:RemoteObject id="myService" destination="helloService"/>

skoro nie wie gdzie jest helloService (przypominam, że aplikacja Grails jest już osobnym projektem). Oto rozwiązanie: uruchamiamy naszą aplikację Grails poleceniem:

grails run-app

i (zakładając, że aplikacja jest dostępna pod adresem http://localhost:8080/hello) modyfikujemy powyższą definicję obiektu RemoteObject:

<mx:RemoteObject id="myService" destination="helloService"
    endpoint="http://localhost:8080/hello/messagebroker/amf"/>

Mamy URL, pod którym udostępnione są nasze obiekty usługowe, i mamy “magika” łączącego świat typów Java ze światem typów ActionScript, którym są biblioteki BlazeDS. Dodam tylko (żeby nie pozostawić żadnych wątpliwości), że protokołem komunikacyjnym nad warstwą HTTP jest AMF (ang. ActionScript Message Format), którym “rozmawiają” aplikacja Flex (wykonująca zdalne wywołanie metody) i BlazeDS (uruchamiający na żądanie metody logiki biznesowej i zwracający ich rezultat).

Groovy i Grails – rewolucja czy ewolucja Javy? cz.2

Czyli ta druga częśc w której zastanawiam się po co, komu i dlaczego jest Grails.

Jak wspomniałem wcześniej Grails jest framework’iem wzorowanym na Ruby on Rails, jako bazę wykorzystującym język Groovy. Po swoim poprzedniku przejął podstawowe zasady:

  • DRY (Don’t Repeat Yourself – Nie powtarzaj się)
  • Convention Over Configuration (Konwencja ponad konfigurację)

Co stanowi o dodatkowej sile Grails’a to wykorzystanie dla popularnych i mających bardzo dobrą opinię bibliotek Javovych: Spring Framework, Hibernate, Sitemesh. Dla użytkownika końcowego mogą byc one niewidoczne, ukryte za interjefsami napisanymi w Groovy, ułatwiającymi ich używanie i redukującymi ilośc potrzebnej kofiguracji (to jest właśnie siła wspomnianej wcześniej zasady!). W każdym momencie możliwe jest jednak pełne ich wykorzystanie oraz samodzielna konfiguracja.

W skrócie więc Grails = elastycznośc Groovy + moc bibliotek Javy

Jak to wygląda w praktyce? Prosty przykład, wydajemy polecenia:

grails create-app
grails create-domain-class [nazwaKlasy] , edytujemy stworzony plik .groovy dodając odpowiednie pola
grails generate-all
grails run-app

… i możemy już w przeglądarce uruchomic aplikację, ze stronkami do dodawania nowych instancji dla stworzonej klasy, edycji i usuwania. Stworzone mamy kontrolery wykorzystujące Spring’a, mapowania Hibernate’owe, strony GSP (podobne do JSP), dane zapisywane są też już do bazy i parę jeszcze użytecznych plików. Ciekawe ile zajęłoby zrobiebienie takiej funkcjonalności w Javie…

Co dodatkowo stanowi o sile Grails jest system plugin’ów. Sprawnie działająca społecznośc skupiona wokół projektu tworzy coraz to nowe pluginy (aktualnie około 40) pozwalające na współpracę m.in. z Flex’em, JSF, GWT, Acegi, OpenLaszlo, Yahoo UI, i wieloma innymi technologiami.

Z punktu widzenia programisty szybkośc tworzenie aplikacji wzrasta więc niesamowicie a dodatkowo to wciąż jest Java (no i troche Groovy). Kolejna rewolucja? Znowu tak, o tym projekcie jest już teraz głośno, będzie jeszcze bardziej.

W następnej części cyklu postaram się przedstawic jakie plusy może miec stosowanie Groovy / Grails w tzw. prawdziwym świecie czyli dlaczego klienci biznesowi mogą byc tym wszystkim zainteresowani.

Groovy i Grails – rewolucja czy ewolucja Javy? cz.1

Witaj świecie!

W pierwszym cyklu wpisów na blogu chciałem poświęcic kilka słów dwóm technologiom o którym od jakiegoś już czasu głośno na blogach poświęconych Javie, mianowicie językowi Groovy oraz opartemu na nim framework’owi Grails. W skrócie dla tych co ostatnie pół roku (przynajmniej) przespali: Groovy jest to dynamiczny język programowania, działający na JVM i bardzo dobrze integrujący się z Java (dzięki temu, że jest kompilowany do postaci bytecode), natomiast Grails to framework zworowany na Ruby on Rails, służący do budowy aplikacji webowych opartych na modelu MVC (model-widok-sterownik), wykorzystujący m.in. Groovy, Spring Framework, Hibernate. Tyle tytułem wstępu, przejdźmy do detali.

Groovy jako język programowania jest obecny od kilku lat, jednak dopiero teraz nastąpił drastyczny wzrost jego popularności. Można to przypisywac kilku przyczynom, jednak moim zdaniem największy wpływ miały na to Ruby i RoR, które pokazały, że język skryptowy może w niektórych zastosowaniach przewyższac język kompilowany. Przynajmniej tak wyglądała moja historia, po pierwsze usłyszałem o Ruby, zacząłem czytac na ten temat i w ten sposób znalazłem Groovy, który ma dużo podobieństw jednak przewyższa Ruby w jednej zasadniczej sprawie – współpracy z Javą, która jest jednak wciąż najpowszechniej stosowanym językiem programowania. Co Groovy daje więc programiście? Jest językiem skryptowym, zawiera domknięcia (ang. closures), właściwości (ang. properties), możliwośc stosowanie niezdefiniowanych typów, ułatwia zasadniczo tworzenie i parsowanie XML, tworzenie komponentów Swinga, pisanie testów jednostkowych (ang. unit tests). Można takich udogodnień wymienic jeszcze dużo, jednak najlepsze w w tym wszystkim jest to, że możemy w dowolnym momencie przełączac sie pomiędzy kodem napisanym w Groovy i w Javie i wywoływac jeden z drugiego. Przynajmniej dla mnie wygląda to rewelacyjnie. Nie przyłączyłbym sie może jeszcze do stwierdzenia ,że w przeciągu 2-3 lat Groovy całkowicie zastąpi Javę ale na pewno jego udział będzie coraz większy i w niektórych zastosowaniach dominujący. Rewolucja? Dla mnie tak, dla innych śledzących rozwój Groovy od dłuższego czasu zapewne naturalny krok w ewolucji Javy. Czy z punku widzenia programisty Javy warto się uczyc Groovy? Moim zdaniem zdecydowanie i wręcz trzeba.

Jeśli chce ktoś przetestowac Groovy i dowiedziec się więcej polecam oficjalną stronę projektu oraz swietną książke Groovy in Action, dostępną na razie jedynie po angielsku.

c.d.n. W następnej cześci opiszę zapowiadany framework Grails.