Google Web Toolkit
Transkrypt
Google Web Toolkit
Narzędzia Google Web Toolkit Czyli AJAX na szynach Google Web Toolkit (GWT), to nowe dziecko Google, wydane na świat niespełna dwa lata temu. Swoją karierę GWT rozpoczął na sympozjum JavaOne w 2006 roku i od tego czasu jego popularność lawinowo wzrasta. Niedawno ogłoszono, że GWT ściągnęło już ponad milion użytkowników. Można zaryzykować stwierdzenie, że świat Javy oszalał na punkcie GWT. Dowiesz się... Powinieneś wiedzieć... • Jakie są zalety GWT. • Przydatna będzie podstawowa znajomość JAVA. Poziom trudności D laczego w dzisiejszym świecie Web 2.0 GWT się liczy? Odpowiedź jest prosta, daje możliwości wykorzystania rozbudowanych i dojrzałych narzędzi języka Java, przy pracy z JavaScript–em. Dzięki GWT , możemy teraz refaktorować swój JavaScript, debugować go, używać mechanizmu podpowiadania nazw i składni. Już samo to, daje duże możliwości w pracy z JavaScriptem, ale GWT idzie dalej! Wyobraźmy sobie, że możemy wykorzystać w JavaScript–cie wszystkie zalety silnie obiektowego języka wysokiego poziomu, a przy tym dalej tworzyć kod zrozumiały dla przeglądarek internetowych. To jest np. możliwość używania interfejs’ów, typowania zmiennych (a co za tym idzie i przeładowania konstruktorów czy metod) i wielu, wielu innych. Posiada cechy, które zawiera język Java, a które nie są dostępne w JavaScript. Jak to możliwe? To niesamowicie proste, GWT pozwala Ci tłumaczyć aplikacje napisane w Javie na JavaScript, przy zachowaniu pełnej kontroli nad wynikowym kodem. W artykule tym dowiesz się, co tak naprawdę to oznacza i dlaczego jest to tak rewolucyjne. Cała treść podzielona została na cztery części: • wprowadzenie do GWT – gdzie poznasz podstawowe informacje, jak rozpocząć pracę z GWT; 46 • pierwsza aplikacja – gdzie pokażemy jak to działa, ale na razie tylko po stronie klienckiej; • GWT i RPC / AMFPHP – gdzie przedstawimy bardziej zaawansowany przykład, w którym komunikujemy się z serwerem; • dodatkowe informacje – gdzie wejdziemy mocniej w szczegóły, które, mamy nadzieję, przekonają do GWT tych jeszcze nieprzekonanych. Wprowadzenie do GWT Teraz, gdy już wiemy, że Google Web Toolkit to narzędzie do tłumaczenia kodu Java na JavaScript, warto wspomnieć, że to także doskonały framework, którego zaletą jest prostota w wykorzystaniu AJAX. Tak naprawdę GWT składa się z trzech części, zamkniętych w pojedynczych plikach JAR (Java ARchiwe): • – to paczka przechowująca gotowe do wykorzystania w środowisku JS komponenty i narzędzia; • gwt–servlet.jar – paczka implementująca mechanizmy pozwalające na kogwt–user.jar Listing 1. Uruchamiamy projectCreator C:\gwt>projectCreator –overwrite –eclipse SmallBear –ant smallbear –out c:\workspace\ smallbear w wyniku czego powinniśmy zobaczyć: Created directory c:\workspace\smallbear\src Created directory c:\workspace\smallbear\test Created file c:\workspace\smallbear\smallbear.ant.xml Overwriting existing file c:\workspace\smallbear\.project Overwriting existing file c:\workspace\smallbear\.classpath a następnie aplicationCreator poleceniem: C:\gwt>applicationCreator –overwrite –eclipse SmallBear –out c:\workspace\smallbear pl.rmalinowski.client.SmallBear w wyniku czego powinniśmy zobaczyć: Created directory c:\workspace\smallbear\src\pl\rmalinowski Created directory c:\workspace\smallbear\src\pl\rmalinowski\client Created directory c:\workspace\smallbear\src\pl\rmalinowski\public Created file c:\workspace\smallbear\src\pl\rmalinowski\SmallBear.gwt.xml Created file c:\workspace\smallbear\src\pl\rmalinowski\public\SmallBear.html Created file c:\workspace\smallbear\src\pl\rmalinowski\client\SmallBear.java Created file c:\workspace\smallbear\SmallBear.launch Created file c:\workspace\smallbear\SmallBear–shell.cmd Created file c:\workspace\smallbear\SmallBear–compile.cmd 06/2007 GWT munikację serwera napisanego w Javie z aplikacją napisaną w JS. (My nie używamy); • gwt–dev–windows.jar lub gwt–dev–linux. jar – serce GWT, mechanizmy tłumacząca Javę na JS. Aby rozpocząć pracę z GWT musimy: • mieć zainstalowaną wirtualną maszynę Java (min wersja 1.4), jeśli jej nie masz, ściągnij i zainstaluj Sun Java Standard Edition SDK (http://java.sun.com/javase/downloads/ index.jsp); • ściągnąć Google Web Toolkit package (http://code.google.com/webtoolkit/download. html); • posiadać podstawy w rozumieniu języka Java 1.4. • eclipse tworzy konfiguracje uruchamiającą projekt eclipsowy w trybie debug; • out folder do zapisania plików wynikowych (domyślnie bieżący); • overwrite nadpisuje istniejące pliki; • ignore ignoruje istniejące pliki, (nie nadpisuje); • className pełna nazwa tworzonej startowej klasy aplikacji. Pierwsza aplikacja Przechodzimy do stworzenia pierwszej aplikacji w GWT. Jeśli pojawiły się już jakieś niejasności, to ten krok prawdopodobnie większość z nich rozwieje. Na początku stwórzmy nowy projekt w Eclipse. W tym celu klikamy: Menu –> File –> New –> Project. Z wyświetlonych kreatorów wybieramy Java Project , nazywamy go SmallBear i klikamy na przycisk Finish, zapamiętując położenie naszego nowo powstającego projektu, (ramka Contents pole Direcotry) w naszym przypadku to c:\workspace. Teraz przechodzimy do nadpisania tak powstałego zalążka nowego projektu, przez szkielet generowany przy użyciu narzędzi GWT. Uruchamiamy projectCreator poleceniem: (Listing 1.). Po wykonaniu przedstawionych komend i odświeżeniu projektu w Eclipse, Do pracy przydatny będzie też edytor tekstu, posiadający możliwości analizowania składni Java, my używać będziemy Eclipse, ponieważ ma on bezpośrednie wsparcie dla i w GWT. GWT nie trzeba instalować, wystarczy ściągnąć i rozpakować np. do katalogu c:\gwt. Wraz z GWT dostajemy narzędzia do tworzenia szkieletu projektu i aplikacji zgodnej z zaleceniami developerów z Google. Prawidłowa aplikacja GWT składa się z: • pliku HTML, w którym osadzana zostanie nasza aplikacja JS, musi tu też zostać zainicjowany podstawowy moduł GWT; • plik nazwa_mojego_modułu.gwt.xml, w którym opisane są dodatkowe parametry dla translatora GWT; • klasy, implementującej interfejs EntryPoint, jest to miejsce w którym rozpoczyna pracę nasz program. Rysunek 1. Widok szkieletu aplikacji GWT w Eclipse Przyjrzymy się teraz, jak działają wspomniane narzędzia: • projectCreator – tworzy szkielet nowego projekt, jego składnia to: ProjectCreator [–ant projectName] [– eclipse projectName] [–out dir] [– overwrite] [–ignore] gdzie: • • • • • • generuje Ant buildfile do kompilacji źródeł (.ant.xml będzie dodany); eclipse generuje projekt eclipsowy out folder do zapisania plików wynikowych (domyślnie bierzący); overwrite nadpisuje istniejące pliki; ignore ignoruje istniejące pliki, (nie nadpisuje); applicationCreator – tworzy szkielet startowej aplikacji, jego składnia to: ant ApplicationCreator [–eclipse projectName] [–out dir] [–overwrite] [–ignore] className gdzie: www.phpsolmag.org Rysunek 2. Widok działającej aplikacji w trybie HostedMode 47 Narzędzia szkielet aplikacji GWT powinien wyglądać tak, jak na Rysunku 1. Warto w tym miejscu zauważyć, że tworząc aplikację, klasę startową umieściliśmy w pakiecie client. Jest to zalecane przez developerów Google i jeśli tego nie zrobimy, skrypt generujący schemat aplikacji powinien pokazać nam mniej więcej taki komunikat: (Listing 2.). Warto o tym pamiętać, by w przypadku takiego przeoczenia nie marnować czasu na zastanawianie się, gdzie popełniliśmy błąd. Ponieważ skorzystaliśmy z generatora szkieletu aplikacji, tak przygotowany projekt możemy od razu uruchomić. Do wybo- ru mamy dwa tryby: HostedMode i WebMode. Tryb HostedMode jest trybem w pełni zarządzanym przez GWT, oznacza to, że możemy tu debugować uruchamiany kod i śledzić kolejne jego kroki, analizując dokładnie to, co dzieje się z powołanymi do życia zmiennymi czy obiektami. Tryb WebMode to już domyślny tryb, w jakim będzie pracować nasza aplikacja, czyli wskazana przez nas przeglądarka internetowa. Developerzy GWT dają nam gwarancję, że aplikacja uruchamiana w trybie Hosted, będzie działała identycznie jak w trybie Web. Warto tu zauważyć, że oznacza to też, że niezależnie od tego, czy uruchomimy nasz Rysunek 3. Widok działającej aplikacji w przeglądarce Firefox (WebMode) Rysunek 4. Przeglądanie serwisów – AMFPHP. 48 skrypt w Internet Explorerze czy też w Firefoksie, będzie on działał tak samo. Aby uruchomić aplikację w trybie Hosted wywołujemy wygenerowany w katalogu domowym projektu skrypt SmallBear–shell, efekt oczekiwany widoczny jest na Rysunku 2. Aby uruchomić aplikację w trybie Web uruchamiamy skrypt SmallBear–compile, który to jednak nie otworzy nam domyślnej przeglądarki, a jedynie przetłumaczy aplikację Java na JavaScript. Wynik tego tłumaczenia widoczny jest w katalogu www (jest to domyślny katalog generowania JS – można to zmienić). Warto zauważyć, że tak wygenerowana aplikacja, jest zwykłą stroną html, którą możemy otworzyć bezpośrednio na dysku twardym, innymi słowy, nie potrzebujemy do tego serwera WWW. Efekt uruchomienia pliku SmalBear.html w przeglądarce Firefox widoczny jest na Rysunku 3. Prześledźmy teraz kod programu (Listing 3.), aby sprawdzić co się tak naprawdę stało. Stworzyliśmy klasę SmallBear, która implementuje interfejs EntryPoint. EntryPoint to miejsce, w którym rozpoczyna pracę aplikacja. Pisząc dokładniej, przy ładowaniu strony internetowej, w pierwszej kolejności ładowane jest i inicjowane środowisko GWT (plik gwt.js). W kroku następnym ładowana jest nasza aplikacja, a po zakończeniu uruchamiana jest metoda onModuleLoad. Tu rozpoczyna się praca programu. Jak widać, nie ma tu trudności, w kroku 1. tworzony jest nowy przycisk z etykietką Click me, w kroku 2. tworzona jest pusta etykieta. Następnie oprogramowujemy zdarzenie onClick przycisku button krok 3., tworząc do tego calu tak zwaną klasę anonimową, czyli klasę bez nazwy, implementującą metodę onClick (4). Metoda ta zostanie wywołana za każdym razem, gdy przycisk button zostanie kliknięty. Sprawdzamy tu, czy etykieta label jest wciąż pusta (5), jeśli tak, to ustawiamy nowy tekst do wyświetlania (6), jeśli nie (7) to czyścimy nazwę etykiety (8). Na koniec jeszcze wstawiamy przycisk (9) i etykietę (10) na stronę tak, by użytkownik mógł je zobaczyć. Na koniec warto jeszcze spojrzeć na to, jak wygląda plik htmlowy (Listing 4.]. Ciekawsze miejsca to (1), gdzie dodajemy wygenerowany przez GWT kod JavaScript aplikacji. (2) to opcjonalne włączenie emulatora historii, dzięki tej linii kodu w przyszłości będzie można używać przycisku przeglądarki cofnij mimo, że nie doszło ani razu do przeładowania strony internetowej. W punkcie (3) tworzona jest tabelka z dwoma identyfikatorami slot1i slot2, łatwo skojarzyć to z punktami (9,10) Listingu 3., by zauważyć, że jest to miejsce, gdzie zostaną wstrzyknięte przycisk i etykieta aplikacji. Dzięki takiemu zapisowi możemy two06/2007 GWT rzyć oddzielnie własną strukturę HTML, wypełniając tylko odpowiednie elementy, w pełni zarządzanymi przez GWT obiektami. Aby upewnić się, że wszystko jest zrozumiałe, proponujemy dokonać własnych zmian w kodzie, sprawdzając, jak zareaguje (albo czy w ogóle zareaguje) na to aplikacja GWT. Po więcej ciekawych przykładów wykorzystania GWT odsyłamy na stronę domową projektu: http: //code.google.com/webtoolkit/documentation/ examples/. Warto obejrzeć dema, zanim przejdziemy do następnego tematu. Aby w najprostszy z możliwych sposobów zaprezentować działanie powyższego, zmieńmy bazową aplikację tak, by na zdarzenie kliknięcia pobierała informację o naszym numerze IP z witryny http:// whatismyip.org/. W tym celu zmieniamy implementację metody onClick w klasie SmallBear (patrz Listing 5.), tak by w kroku 1. zapytać serwer o nasz numer IP, w kroku 2. zareagować na odpowiedź serwera, wyświetlając odpowiedź w kroku 3. – JavaScriptowy alert. To nam wystarczy, by upewnić się, że komunikacja asynchroniczna działa. GWT i HTTPRequest Jak na razie pokazaliśmy jedynie, że tłumaczenie Javy do JavaScrpt–u działa, ale nie było w tym nic z asynchronicznej komunikacji z serwerem (AJAX). Powoli przejdziemy do wywoływania zdalnych metod na serwerze PHP. Zaczniemy od odrobiny teorii. Dla naszych potrzeb, komunikacją z serwerem w GWT, zajmuje się klasa HTTPRequest. Posiada ona cztery statyczne metody implementujące asynchroniczną wymianę informacji. W poniższym przykładzie wykorzystamy tylko jedną z nich: GWT i AMFPHP Potrafimy już wysyłać i odbierać proste dane z serwera. Bardziej skomplikowane struktury danych trzeba niestety serializować. My do tego celu będziemy używać formatu JSON (JavaScript Object Notation), który doczekał się implementacji parserów w większości znanych języków programowania, a napewno w PHP i GWT. Pozostaje nam tylko odebrać komunikat po stronie PHP, zdeserializować go, przetworzyć zapytanie i wysłać odpowiedź do GWT. Sprawa prosta, ale dla bardziej zaawansowanych aplikacji, gdy serwer implementować będzie wiele zdalnie wywoływanych metod, należałoby przewidzieć możliwość dobrego zarządzania takimi metodami. Z pomocą przychodzi dojrzała już aplikacja AMFPHP. AMFPHP w wersji 1.9 na dzień pisania tego artykułu był dostępny jedynie na blogu twórcy projektu (http:// www.5etdemi.com/blog/) (dla niecierpliwych asyncGet(String url, ResponseTextHandler handler) gdzie: url to – to URL (musi być adresem bezwsględnym) handler –to obiekt, który zostanie poinformowany w momencie odpowiedzi serwera. R www.phpsolmag.org E K L A M Listing 2. Komunikat skryptu generującego schemat aplikacji Please use 'client' as the final package, as in 'com. example.foo.client.MyApp'. It isn't technically necessary, but this tool enforces the best practice. link bezpośredni: http://www.5etdemi.com/ uploads/amfphp-1.9.beta.20070513.zip). Po ściągnięciu wystarczy rozpakować archiwum do katalogu hdocs serwera apache i przejść do katalogu bazowego aplikacji, czyli {$HTDOC_DIR}/amfphp/services. To tutaj będziemy umieszczali nasze usługi dla GWT. Zasada działania AMFPHP jest bardzo prosta, jeśli wywołamy na serwerze www zapytanie postaci: http://localhost//amfphpjson/ json.php/MyService.myRemoteMethod/arg1/ arg2 to zostanie ono obsłużone w następujący sposób: • AMFPHP powoła do życia instancje klasy MyService (której definicja musi znajdować się w pliku MyService.php w katalogu /services); • sprawdzi, czy myRemoteMethod jest metodą ze zdefiniowanym zdalnym dostępem; • uruchomi metodę myRemoteMethod z argumentami arg1, arg2 odpowiednio deserializując parametry, jeśli trzeba; • na koniec serializuje i zwraca wynik. A Narzędzia Przykład klasy implementującej prosty serwis dla AMFPHP widać na Listingu 5. W Punktach:1., 2. i 3. definiujemy odpowiednio nazwę udostępnianej metody, jej opis i zdalny typ dostępu. Punkt 4. to już implementacja metody, której nazwę zdefiniowaliśmy w Punkcie 1. Dla tak zdefiniowanego serwisu, możemy uruchomić dostarczoną przez AMFPHP przeglądarkę do testowania usług. Wystarczy otworzyć plik browser/index.html i powinniśmy zobaczyć jak AMFPHP widzi nasz serwis (Rysunek 4.). Tu możemy też, po raz pierwszy, sprawdzić czy działa on poprawnie. Przetestujmy meto- dę getSum, wpisując w odpowiednie pola wybrane wartości i uruchamiając metodę poprzez naciśnięcie przycisku call. Wynik spodziewany, widoczny jest na Rysunku 4. Pozostaje teraz wywołać daną metodę poprzez aplikację GWT. Po stronie AMFPHP serializacja i deserializacja robiona jest automatycznie, po stronie GWT musimy obsłużyć ją sami. Do tego przykładu wykorzystamy wbudowaną w GWT bibliotekę (com.google.gwt. json.JSON). Aby móc ją wykorzystać, musimy do pliku SmallBear.gwt.xml (w tym przypadku plikten znajduje się w katalogu c:\workspace\ smallbear\src\pl\rmalinowski\) dodać do- datkowy wpis: <inherits name= 'com.google.gwt.json.JSON'/> Poinformuje on kompilator GWT, że do wygenerowanego JavaScript–u należy dodać wskazaną bibliotekę. Użycie biblioteki wygląda następująco: • serializacja: JSONNumber jsonNumber = new JSONNumber(12.0); // zwraca zakodowaną wartość //numeryczną JSONNumber.toString(); • deserializacja : try { JSONObject jsonObject = (JSONObject) JSONParser.parse( jsonStringWith SerializedObject); } catch (JSONException e) { } Window.alert('JSON parse error!'); Możemy teraz przejść do etapu komunikacji z serwerem AMFPHP. W tym celu URL z Listingu 5., kroku 1., zamieniamy zgodnie z szablonem przedstawionym powyżej. Wywołanie zdalnej metody powinno wyglądać jak na Listingu 7. Tak przygotowaną aplikację możemy już uruchamiać. Dodatkowe informacje Rysunek 5. Debugowanie aplikacji GWT w Eclipse IDE Przedstawiony przykład komunikacji GWT z PHP jest bardzo prosty i dla bardziej zaawansowanych aplikacji wymaga rozbudowania. Zanim zdecydujemy się, czy używać GWT we własnych projektach, warto jeszcze zapoznaćsię z kilkoma dodatkowymi funkcjonalnościami, jakie zapewnia ten framework. Debugowanie Uruchamiając aplikację GWT w tzw. hosted mode, mamy możliwość debugowania jej, co oznacza, że możemy śledzić krok po kroku jak wykonuje się aplikacja, jeszcze przed przetłumaczeniem jej na JavaScript. Używając eclipse wystarczy z menu wybrać Run –> Debug a następnie z listy Java Aplication wybrać nazwę projektu i kliknąć w przycisk Debug. Jeśli wcześniej zostały ustawione breakpoint–y, to powinniśmy zobaczyć widok podobny do ekranu z Rysunku 5. Testy jednostkowe Rysunek 6. Wynik testów jednostkowych w Eclipse IDE 50 GWT wspiera również testy jednostkowe. Wraz z narzędziami ProjectCreator i AplicationCreator dostajemy JunitCreator. Jest to 06/2007 GWT narzędzie do automatycznego generowania testów i osadzenia ich we wskazanym projekcie. Składnia JunitCreator-a to: Listing 3. Plik SmallBear.java package pl.rmalinowski.client; // klasy, które będziemy wykorzystywać w tym przykładzie • JUnitCreator – junit pathToJUnitJar – module moduleName [–eclipse projectName] [–out dir] [–overwrite] [–ignore] className gdzie: • • • • • • • określa ścieżkę do junit.jar (wymagane); module nazwa testowanego modułu GWT (wymagane); eclipse tworzy konfiguracje integrujący junit z eclipse; out folder do zapisania plików wynikowych (domyślnie bierzący); overwrite nadpisuje istniejące pliki; ignore ignoruje istniejące pliki, (nie nadpisuje); className pełna nazwa tworzonej klasy testowej. junit Aby móc przeprowadzać testy jednostkowe projektu SmallBear uruchamiamy junitCreator : C:\gwt>junitCreator –junit c:\junit\ junit.jar –module pl.rmalinowski. SmallBear –eclipse SmallBear –out c: \workspace\smallbear pl.rmalinowski. client.SmallBearTest Używając junitCreator–a należy wskazać ścieżkę dostępu do biblioteki junit.jar, w tym przypadku jest to c:\junit\junit.jar. Jeśli nie posiadasz biblioteki junit.jar, możesz ją ściągnąć ze strony projektu (http://junit.org) lub użyć biblioteki wbudowanej w eclipse: ({$ECLIPSE_DIR}\plugins\ org.junit_3.8.1\junit.jar) wynik to: Listing 8. Po odświeżeniu projektu w oknie eclipse, powinniśmy zobaczyć nowy katalog test, a w nim wygenerowany test. Klikając prawym przyciskiem na pl.rmalinowski.client.SmallBearTest, a następnie wybierając Debug as –> Java application rozpoczynamy test aplikacji. (Test uruchomić możemy również, wybierając z menu Run –> Debug –> Junit –> SmallBearTest). Do wyboru mamy dwa rodzaje testów, testy w trybie hosted i web. Tak jak to zostało już na początku wspomniane, pierwszy tryb wykonuje aplikację bez tłumaczenia jej na JS, a drugi tryb najpierw konwertuje Javę do JS i dopiero wtedy ją uruchamia. W tym przypadku testy zostaną wykonane już na domyślnym kodzie JS. Rysunek 6. przedstawia ekran, prezentujący wynik sumaryczny uruchomionych testów. JavaScript Native Interface GWT nie byłby tak popularny, gdyby zamykał drzwi tym, którzy chcieliby mimo wszystwww.phpsolmag.org import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.Widget; // i jeszcze to co będzie wykorzystywane w następnych przykładach import com.google.gwt.user.client.HTTPRequest; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ResponseTextHandler; import com.google.gwt.json.client.JSONException; import com.google.gwt.json.client.JSONNumber; import com.google.gwt.json.client.JSONParser; public class SmallBear implements EntryPoint { public void onModuleLoad() { final Button button = new Button("Click me"); //(1) final Label label = new Label(); //(2) button.addClickListener(new ClickListener() { //(3) public void onClick(Widget sender) { //(4) if (label.getText().equals("")) //(5) label.setText("Hello World!"); //(6) else //(7) label.setText(""); //(8) } }); RootPanel.get("slot1").add(button); //(9) RootPanel.get("slot2").add(label); //(10) } } Listing 4. Plik SmallBear.html <html> <head> <title>Wrapper HTML for SmallBear</title> <style> body,td,a,div,.p{font–family:arial,sans–serif} div,td{color:#000000} a:link,.w,.w a:link{color:#0000cc} a:visited{color:#551a8b} a:active{color:#ff0000} </style> <script language='javascript' src='pl.rmalinowski. SmallBear.nocache.js'></script> <!–– (1) ––> </head> <body> <iframe src="javascript:''" id="__gwt_historyFrame " style="width:0;height:0;border:0"></iframe> <!–– (2) ––> <h1>SmallBear</h1> <p> This is an example of a host page for the SmallBear application. (...). </p> <table align=center> <tr> <td id="slot1"></td><td id="slot2"></td> <!–– (3) ––> </tr> </table> </body> </html> 51 Narzędzia Listing 5. Przykład asynchronicznej komunikacji button.addClickListener(new ClickListener() { public void onClick(Widget sender) { HTTPRequest.asyncGet("http://whatismyip.org", new ResponseTextHandler() { //(1) public void onCompletion(String responseText) { //(2) Window.alert("My ip is: " + responseText); //(3) } }); } }); ko uruchamiać natywny kod JavaScript. Kiedy zachodzi taka potrzeba? Przede wszystkim w przypadku, gdy mamy już napisane sporo w JS i w nieinwazyjny sposób chcielibyśmy połączyć taki kod z GWT. Inną potrzebą wykorzystania JSNI, jest przekazywanie parametrów z PHP do GWT. Możemy wtedy generować stronę, w której osadzany jest moduł GWT z wygenerowanym przez PHP kodem JS np.: Array wypełnionymi danymi, a poprzez JSNI odwoływać się do tej tablicy. Listing 6. Przykład klasy implementującej serwis wAMFPHP Podsumowanie <?php class MyService{ function MyService(){ $this–>methodTable = array( "getSum" => array( //(1) "description" => "Returns sum of two int", //(2) "access" => "remote"//(3) ) ); } public function getSum($a, $b) { //(4) return $a + $b; } } ?> Listing 7. Przykład klasy komunikującej się z serwisem AMFPHP button.addClickListener(new ClickListener() { public void onClick(Widget sender) { JSONNumber arg1 = new JSONNumber(12.0); JSONNumber arg2 = new JSONNumber(100.0); String url = "http://localhost//amfphp/json.php/MyService.getSum/"+arg1.toString()+ "/"+arg2.toString(); HTTPRequest.asyncGet(url, new ResponseTextHandler() { //(1) public void onCompletion(String responseText) { //(2) try { } JSONNumber jsonNumber = (JSONNumber) JSONParser.parse(responseText); Window.alert("Sum = " + jsonNumber.getValue()); catch (JSONException e) { } Window.alert("JSON parse error!"); } }); } Przedstawiliśmy zaledwie zarys możliwości, jakie daje Google Web Toolkit. Nic nie wspomnieliśmy o prostocie dodawania dodatkowych komponentów do naszej aplikacji, a pojawia się ich coraz więcej. Nie zostało też wspomniane o zarządzaniu historią przeglądarki, dzięki czemu, nawet jeśli cała interakcja z użytkownikiem przebiega na jednej nieprzeładowanej stronie, to cały czas mamy do dyspozycji przycisk cofnij, który może dla nas zapamiętywać poprzednie stany aplikacji. Nie wspomnieliśmy też o jednym z najważniejszych, że GWT to opensource. Odsyłamy do stron projektu (http://code. google.com/webtoolkit/), gdzie wszystkie te i wiele innych informacji można doczytać. Na koniec postaramy się jeszcze odpowiedzieć na jedno pytanie. Kiedy warto wybrać GWT? Przede wszystkim, gdy planujemy stworzyć rozbudowaną aplikację kliencką. Przy naprawdę małych skryptach, tam gdzie istotna jest wielkość ściąganego przez przeglądarkę kodu, GWT nie jest dobrym wyborem. Zawsze, gdy tylko zaczynamy myśleć, jak ułatwić użytkownikowi administrowanie naszym sklepem, czy CMS'em. Tam gdzie rodzą się pomysły na dynamiczne pojawianie się list rozwijanych, automatyczne uzupełnianie nazw artykułów, czy choćby walidacja kodów pocztowych, tam też jest miejsce dla GWT. Najlepsze jednak jest to, że kod GWT napisany raz, działa na wielu przeglądarkach, a jeśli nie działa, jest duże prawdopodobieństwo, że za chwilę będzie wszystko w porządku. Dlatego jeśli tylko mamy wybór, uczyć się JS, czy uczyć się Javy pod kątem GWT, proponujemy wybrać GWT. }); Listing 8. Wynik użycia biblioteki wbudowanej w eclipse Created directory c:\workspace\smallbear\test\pl\rmalinowski\client Created file c:\workspace\smallbear\test\pl\rmalinowski\client\SmallBearTest.java Created file c:\workspace\smallbear\SmallBearTest–hosted.launch Created file c:\workspace\smallbear\SmallBearTest–web.launch Created file c:\workspace\smallbear\SmallBearTest–hosted.cmd Created file c:\workspace\smallbear\SmallBearTest–web.cmd 52 RAFAŁ MALINOWSKI (http://rmalinowski.pl) – zawodowo pracuje jako Java EE 5 projektant i programista, bierze udział w kilku projektach opensource rozwijanych w technologii PHP i Flash. 06/2007