Google Web Toolkit (GWT) to framework dostarczony przez Google do budowania aplikacji opartych na języku Java z bogatym front-endem AJAXowym. GWT pozwala pisać aplikacje w Javie dostarczając zestaw bibliotek do tworzenia dialogów, przycisków, formularzy itp. Następnie kompiluje je i optymalizuje tworząc JavaScript, który powinien działać prawidłowo na wszystkich najpopularniejszych przeglądarkach. Kompilacja obejmuje statyczne sprawdzanie typów, wyrzucanie niepotrzebnych parametrów z metod, pól z klas, in-linowaniem metod – wszystko by maksymalnie przyśpieszyć działanie.
Instalacja GWT jest nadzwyczaj prosta. Wystarczy pobrać zzipowaną wersję z http://code.google.com/intl/pl/webtoolkit/download.html i rozpakować w dowolne miejsce. GWT integruje się z eclipse 3.3 i 3.4 poprzez pluginy (instalacja opisana na http://code.google.com/intl/pl/eclipse/docs/download.html).
Po poprawnej instalacji wtyczki na pasku narzędziowym eclipse dostajemy trzy nowe ikony
. Pierwsza z nich tworzy nam nowy projekt GWT, druga kompiluje go, trzecia wreszcie służy do deplyowania projektów Google App Engine.
Podczas pierwszego projektu musimy wskazać miejsce, w którym jest rozpakowane GWT. Domyślnie stworzenie nowego projektu generuje przykładową aplikację. Dodatkowo z menu kontekstowego Run As w projekcie możemy wybrać Web Application i automatycznie ona uruchomiona w dostarczonej z biblioteką przeglądarce, w tzw “hosted mode”


Główne zalety GWT:
- edit – refresh – view – używając “hosted browser” do testowania aplikacji, zmiany w kodzie javy nie wymagają dodatkowej kompilacji czy restartu, wystarczy odświeżyć stronę i zmiany będą widoczne;
- możliwość debugowania aplikacji za pomocą eclipsowego debugera;
- wsparcie dla JSON, XML, a także możliwość łatwego wywoływania procedur po stronie serwera (serializowanie i deserializowanie obiektów, zachowanie jak przy RMI);
- wsparcie dla JavaScript Native Interface przez co możliwe jest samodzielne dodawanie kodu JavaScript do tworzonej aplikacji;
- wsparcie dla przycisku “wstecz” dla przeglądarek, przez modyfikację historii przeglądanych stron;
- współpraca z JUnit, JProfiler;
- praca w 2 trybach – hosted mode (jw z eclipse, po wykonaniu ant hosted, itp bez całkowitej zamiany kodu na javascript) i web mode (zamiana kodu na javascript);
- pisanie interfejsów użytkownika analogicznie jak w Swing;
- możliwość rozbudowania o własne moduły lub inne opensourcowe pluginy (np. wspierające drag and drop w aplikacji);
- szerokie wsparcie dla internacjonalizacji;
- możliwość własnego ostylowania elementów za pomocą CSS.
GWT posiada kilkanaście gotowych elementów do budowy dynamicznych efektownych interfejsów, np:
- panele (DecoratorPanel, VerticalPanel, HorizontalPanel, FlowPanel, AbsolutePanel, DockPanel)
- widgety (CheckBox, RadioButton, Button, CustomButton, FileUpload, DatePicker, Hyperlink)
- listy i menu (ListBox, SelectBox, Tree, MenuBar)
- inputy (TextBox, RichTextArea)
- okna (DialogBox, DecoratedPopupPanel)
- tabele (FlexTable, Grid)
- animacje (Animation)
Możliwości frameworku można obejrzeć na następujących stronach
- http://gwt.google.com/samples/Mail/Mail.html
- http://gwt.google.com/samples/DynaTable/DynaTable.html
- http://gwt.google.com/samples/Showcase/Showcase.html
Dodatkowo istnieje biblioteka GWT-ext która dostarcza zdecydowanie więcej gotowych komponentów. Demo tej biblioteki można zobaczyć na http://www.gwt-ext.com/demo/
GWT docelowo jest zamieniane całkowicie na JavaScript, dlatego choć pisze się go w Javie, są pewne istotne ograniczenia w wykorzystaniu standardowych bibliotek:
- JavaScript obsługuje tylko 64bitową wersję liczby zmienno przecinkowej, dlatego też wszystkie typy numeryczne, jak byte, short, int, są w trybie web zamieniane na double, a to z kolei pozwala na zwiększenie dozwolonego zakresu liczbowego; typ long jest emulowany na podstawie dwóch 32bitowych intów, co może spowodować spadek wydajności poprzez konieczność emulacji;
- try, catch, finally działają poprawnie, jednak Throwable.getStackTrace() nie jest dostępne;
- niektóre wyjątki nie występują w trybie web, np. NullPointerException, StackOverflowException czy OutOfMemoryException; zamiast nich rzucany jest wyjątek JavaScriptException; takie zachowanie wynika z niemożności zmapowania odpowiedniego wyjątku JavaScriptowego na wyjątek Javy;
- multithreading – interpretery JavaScript są jednowątkowe, a zatem, choć GWT akceptuje “synchronized” to tak naprawdę nie robi ono nic specjalnego; inne wsparcie wielowątkowości jak wait() notify() nie jest dostępne;
- wykorzystywanie mechanizmu refleksji – ponieważ GWT nastawione jest na maksymalną optymalizację i szybkość działania dynamiczne ładowanie bibliotek nie jest dostępne; jednocześnie dostępna jest metoda getClass().getName();
- strictfp nie jest dozwolone w GWT
Oto pakiety które zawierają klasy dostępne w aplikacjach GWT (w niektórych przypadkach tylko niektóre fragmenty pakietu) to
W ramach utrzymania pewnych funkcjonalności GWT udostępnia klasy
- com.google.gwt.i18n.client.DateTimeFormat: obsługuje część funkcjonalności java.util.DateTimeFormat.
- com.google.gwt.i18n.client.NumberFormat: obsługuje część funkcjonalności java.util.NumberFormat.
- com.google.gwt.user.client.rpc.IsSerializable : interfejs spełniający rolę java.io.Serializable wykorzystywana przez GWT do wywoływania zdalnych procedur (RPC)
- com.google.gwt.user.client.Timer : uproszczona klasa java.util.Timer, (z powodu jednowątkowości)
GWT wydaje się być ciekawą alternatywą dla standardowej budowy interfejsów za pomocą elementów HTMLowych. W wolnych chwilach warto poeksperymentować i zobaczyć, co Google może wnieść do tematu budowania aplikacji internetowych.
Bibliografia:
- http://code.google.com/intl/pl/webtoolkit/
Autor: Adam Andrzejewski

Jeśli mowa o GWT, to polecam filmik, na którym zademonstrowano działanie Google Wave – najnowszej zabawki tworzonej przez google właśnie na GWT:
http://www.youtube.com/watch?v=v_UyVmITiYQ
Mimo, że GWT pozwala na pisanie RIA tak jak w Swing, to bardziej komfortowe jest użycie szablonów HTML – http://gwtapp.org/