25 kwietnia 2007

Teoretyczne wprowadzenie do GWT

Zanim podejdę do przedstawienia Google Web Toolkit (GWT), uczynię swoją powinność jak napisano na stronach Google:

Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 2.5 Attribution License.

Nie długo trwało zanim okazało się, że chciałem zacząć ten wpis tymi samymi słowami, jakimi rozpoczął swoje przedstawienie GWT Rafał Malinowski na swoim blogu. Natrafiłem na jego blog przeszukując materiały o GWT po polsku (nota bene, przypomniałem sobie, że o Rafale wspominał również Brzezi po moim pytaniu o wprowadzenie do GWT - Kilka pytań początkującego o GWT (było: Re: Spring + GWT) na grupie pl.comp.lang.java) .

Sercem GWT jest konwerter kodu w Javie (wersja 1.4.2 i poprzednie) na JavaScript.

I możnaby na tym poprzestać, gdyby nie fakt, że dla wielu (do niedawna również i dla mnie) JavaScript nie kojarzył się nierozerwalnie z technologią AJAX (mimo, że powinien, chociażby z samej nazwy AJAX - Asynchroniczny JavaScript i XML). I mimo, że GWT to konwerter Java do JavaScript to niekoniecznie musiało to implikować również zawarcie AJAXa. W przypadku GWT mamy do dyspozycji możliwość tworzenia kodu w Javie, który jest bardzo zbliżony do tworzenia aplikacji z wykorzystaniem biblioteki JFC/Swing, w tym i obsługą zdarzeń, która ostatecznie kończy swój "żywot rozwojowy" jako aplikacja napisana w JavaScript, właśnie ze wsparciem dla AJAX.

Dla mnie osobiście, ważne jest, że GWT pozwala zapomnieć o (X)HTML, DHTML, JavaScript i ostatecznie AJAX (czyli interakcją z XMLHttpRequest wraz z modyfikacją DOM) oraz o różnicach w realizacji ich w przeglądarkach - IE, FF, Safari i Opera (zobacz: Cross-browser Support).

Istotnym elementem jest również wykorzystanie dostępnych elementów HTML do konstrukcji aplikacji korzystającej z GWT. Strona HTML z kodem tworzonym przy pomocy GWT (ang. HTML host page) jest możliwa do uruchomienia bez specjalnych wtyczek/rozszerzeń po stronie klienta-przeglądarki, co czyni tworzenie aplikacji internetowej z wykorzystaniem GWT bezinwazyjnym i nie nakłada (prawie) żadnych wymagań, będąc wyłącznie "czystym" JavaScriptem.

Strona GWT (tymczasowa nazwa dla HTML host page) jest tworzona jako wynik transformacji kodu napisanego w Javie, gdzie mamy możliwość skorzystania z silnego typowania języka i skorzystać z dostępnych zintegrowanych środowisk programistycznych (ang. IDE - integrated development environment) wspierających tworzenie aplikacji w tym języku, do strony całkowicie pozbawionej elementów pisanych w Javie, a jedynie JavaScript.

Jak z każdą aplikacją HTML tak i w przypadku aplikacji GWT (która docelowo staje się aplikacją HTML z JavaScript) do ustawiania wizualizacji (stylu) kontrolek (ang. GWT widget) służy kolejny ustandaryzowany język - język styli CSS (zobacz: Style Sheets). Jest to kolejne wykorzystanie istniejącej technologii/języka, co czyni rozpoznanie i korzystanie z GWT prostszym.

Mamy dwa tryby pracy z GWT - tryb hosted (rozwojowy), w którym następuje uruchomienie testowe aplikacji przy pomocy specjalnie stworzonej dla GWT przeglądarki bez translacji kodu w Javie do kodu wynikowego w JavaScript oraz web (produkcyjny), gdzie klientem jest typowa przeglądarka (zobacz: Debugging in Hosted Mode). Większość naszego czasu nad rozwojem aplikacji GWT będziemy spędzali na pracy w trybie rozwojowym. Pozwala to na pełne wykorzystanie dostępnych narzędzi do tworzenia aplikacji Java. Podczas pracy w trybie rozwojowym, w przeglądarce GWT możemy skorzystać z przycisku Compile/Browse do wygenerowania odpowiedniego kodu w JavaScript bądź skorzystać ze skryptów tworzonych automatycznie podczas zestawiania projektu GWT.

Ważna podkreślenia jest ciągle powtarzana, ale jednocześnie trudna do zapamiętania, fundamentalna cecha GWT, która sprawia, że w trybie produkcyjnym aplikacja GWT to wyłącznie JavaScript i inne technologie klienckie (interpretowane przez przeglądarkę, jak CSS, DHTML, XML). Tym samym nie wymaga się żadnej wtyczki/rozszerzenia ani wirtualnej maszyny Java (JVM) do produkcyjnego uruchomienia aplikacji GWT.

GWT dostarcza skrypty tworzące projekt oraz skrypty uruchomieniowe dla narzędzi pomocniczych (zobacz: Command-line Tools):
  • projectCreator - służy do utworzenia struktury katalogowej projektu i opcjonalnych plików projektowych dla Ant i Eclipse.
  • applicationCreator - służy do utworzenia aplikacji, skryptów do uruchomienia jej w trybie rozwojowym oraz transformacji (kompilacji) do JavaScript.
  • junitCreator - służy do utworzenia testów jednostkowych JUnit i skryptów do uruchomienia w trybie rozwojowym i produkcyjnym (w zwykłej przeglądarce).
  • i18nCreator - usprawnia proces umiędzynarodowienia aplikacji (ang. i18n - internationalization), czyli dostosowywania aplikacji do wymagań specyficznych dla danego kraju.
W GWT mówi się o dwóch stronach aplikacji - stronie klienckiej (przeglądarka) oraz serwerowej (Client-side Code oraz Server-side Code). Mimo, że cała aplikacja GWT staje się ostatecznie wyłącznie zbiorem plików z JavaScript, HTML i CSS, i nie byłoby mowy o stronie innej niż przeglądarka, to w przypadku korzystania z AJAX (czyli GWT RCP - remote procedure call (RPC)) odbiorcą jest część aplikacji (w zasadzie powinienem napisać rozwiązania, aby nie wprowadzać zamieszania z ponownym użyciem słowa aplikacja w innym kontekście), która uruchamiania jest po stronie serwera i która w żaden sposób nie jest modyfikowana przez GWT. Strona serwerowa nie leży w gestii zainteresowania GWT poza udostępnieniem możliwości jej wywołania za pomocą RCP.

Przechodząc do samego tworzenia aplikacji GWT, wyróżnić należy kilka z nim związanych pojęć (patrz: Modules):
  • Moduł - module - pliki XML z konfiguracją GWT odpowiadającą jednostkom funkcjonalnym aplikacji. W module znajdują się wszystkie ustawienia konfiguracyjne niezbędne do poprawnego uruchomienia aplikacji GWT. Zalecane jest, aby moduł (plik konfiguracyjny XML aplikacji GWT) występował w pakiecie głównym projektu. Moduły definiują klasy, które podlegają translacji do JavaScript.
  • Punkt dostępowy - entry-point - jest klasą rozszerzającą interfejs EntryPoint. Podczas uruchamiania modułu, każdy punkt dostępowy jest tworzony i wywoływana jest jego metoda EntryPoint.onModuleLoad().
GWT korzysta z pojęcia pakietów do tworzenia struktury projektu. Domyślny układ pakietów GWT rozdziela części klienckie (uruchamiane w przeglądarce) od serwerowych (uruchamianych na serwerze i nie modyfikowanych przez GWT). Patrz: Project Structure.

Po lekturze wprowadzającej do GWT (Developer Guide Fundamentals) nie pozostaje nic innego jak próba zbudowania projektu GWT z użyciem M2 (najprawdopodobniej za pomocą wtyczki maven-antrun-plugin) oraz skorzystania z części serwerowej opartej o technologie przemysłowej 5-tki (Java EE 5). Już nie mogę się doczekać.