Archiwa kategorii: GWT

Co nowego w GWT 2.5?

Logo GWT

Ostatnimi czasy wydawać by się mogło, że ekipa Googla nieco spowolniła i dość długo kazała nam czekać na kolejne wydania GWT. Rzeczywiście dawniej nowe wersje pojawiały się zdecydowanie częściej i częściej też wprowadzały nowe, ciekawe rozwiązania. W sieci pojawiły się też głosy, że GWT staje się martwe, między innymi za sprawą języka Dart. Ludzie pracujący nad GWT dość szybko rozwiali jednak te wątpliwości i zapowiedzieli wersję 2.5, która przynosi nową, ciekawą funkcjonalność i ponownie wprowadza nieco świeżości w tą znakomitą bibliotekę. Od tamtej pory pojawiły się już dwa wydania kandydujące oznaczone odpowiednio RC1 i RC2, a na finalną wersję przyszło nam jeszcze trochę poczekać.

Od jakiegoś czasu systematycznie przyglądałem się zmianom wprowadzanym na repozytorium GWT, które zwiastowały coraz szybsze nadejście nowej wersji. Tak też się stało, bo zaledwie kilkanaście godzin temu wersja oznaczona numerkiem 2.5 stała się dostępna do pobrania! Czego więc nowego można się spodziewać? Czy warto jak najszybciej przenosić się ze sprawdzonej wersji 2.4?

Czytaj więcej »

Jak działa RequestFactory w GWT?

Jakiś czas temu pisałem na temat alternatywnego mechanizmu komunikacji klient-serwer w GWT, jakim jest RequestFactory. Omówiliśmy wtedy podstawy – zaimplementowaliśmy generyczną klasę DAO i wykonywaliśmy proste operacje CRUD. Przy okazji artykułu na temat JPA i walidacji encji pokazałem, jak w prosty sposób przeprowadzić walidację encji i zintegrować to z RequestFactory. Podczas omawiania relacji wiele-do-wielu i zapytań poprzez Criteria API w JPA 2.0 rozbudowaliśmy projekt wykorzystujący RequestFactory, jednak wtedy nie skupialiśmy się na części klienckiej, gdzie wykorzystywany jest tytułowy mechanizm. W żadnym z tych artykułów nie pisałem jednak na temat zasad działania RequestFactory, a domyślam się, że jesteś ciekaw jak to wszystko chodzi. W niniejszym wpisie chciałbym się skupić właśnie na stronie technicznej.

RequestFactory jest mechanizmem wprowadzonym w GWT 2.1 w celu dostarczenia alternatywy dla GWT-RPC. Alternatywy, dlatego że GWT-RPC dalej pozostaje podstawowym i najprostszym sposobem komunikacji klient-serwer, które nie jest jednak pozbawione kilku wad. RequestFactory jest przede wszystkim zorientowane na pobieranie danych (data-oriented) i doskonale integruje się z framework’ami bazodanowymi takimi jak np. Hibernate. Implementuje też walidację encji według normy JSR 303. Tak naprawdę mechanizm nadaje się do użytku od GWT 2.1.1, w której wprowadzono szereg udoskonaleń. W następnych wersjach pojawiały się mniejsze poprawki, zostały też zmienione pakiety wszystkich klas na mniej związane z samym GWT (z com.google.gwt na com.google.web.bindery), co sugeruje, że być może kiedyś zostanie wykorzystane poza GWT. W tym artykule opieram się na RequestFactory, jakie jest w GWT 2.4.

Czytaj więcej »

Co nowego w Sencha GXT 3?

sencha-logo

Długo oczekiwana kolejna wersja Ext GWT ukazała się niedawno pod nową nazwą: Sencha GXT 3. Obsunięcie wydania było dość spore, bo jak dobrze pamiętam, pierwsze wzmianki o GXT 3 mówiły jeszcze o wakacjach 2011. Czy warto było czekać? Jakie zmiany przynosi nowa wersja? Zaraz się o tym przekonamy.

GXT 3 miało w założeniach skupić się na integracji z rozwiązaniami, które pojawiły się w GWT 2.x. Ext GWT 2 pojawiło się jeszcze za czasów GWT 1.5, gdzie takie dobrodziejstwa jak RequestFactory, UiBinder, Autobean, Code Splitting czy wiele innych, były dopiero w zamysłach twórców GWT. Ext GWT wprowadzało więc własne rozwiązania, niektóre dość ciekawe, np. wsparcie Java Beans za pomocą BeanModel’i. Z czasem jednak w GWT pojawiały się natywne mechanizmy, które rozwiązywały poszczególne problemy na nieco niższym poziomie, chociażby mechanizm Autobean, który jest silnie wykorzystywany przez GWT RequestFactory. Kod Ext GWT był jednak tak zaprojektowany, że korzystanie z nowych udogodnień było bardzo trudne albo zupełnie niemożliwe.

Czytaj więcej »

Integracja Shiro, Guice i GWT

shiro-logo.jpg

Jako że w związku z nadchodzącym dłuższym weekendem majowym (ręce do góry, kto nie bierze urlopu?), nastroje dziś są mocno weekendowe, będzie szybko i przyjemnie :) Poprzednio opisywałem w jaki sposób użyć Shiro w aplikacji GWT. Obecna wtedy wersja Shiro (1.1.0) nie wspierała natywnie Guice‚a, dlatego konfigurację oparliśmy na standardowych plikach shiro.ini oraz web.xml. Oczywiście wersję 1.1.0 da się zintegrować z Guice’m, co wymaga jednak użycia kilku tricków. Jeśli jesteś zainteresowany właśnie tą wersją Shiro, to w sieci można znaleźć kilka dobrych poradników.

Od jakiegoś czasu Shiro dostępne jest w wersji 1.2.0, w której to Guice jest już oficjalnie wspierany. Niestety na oficjalnej stronie Shiro nie wszystko zostało dokładnie wytłumaczone, dlatego chcę zaprezentować Ci najprostszy sposób połączenia tych dwóch framework’ów. Użyjemy do tego poprzednio stworzonej aplikacji, tak aby skupić się tylko na integracji z Guice’m. Czytaj więcej »

Apache Shiro – uwierzytelnić lepiej?

shiro-logo.jpg

Jakiś czas temu opisywałem, jak szybko zaimplementować uwierzytelnianie w aplikacji GWT przy pomocy JAAS’a. Wtedy byłem trochę zafascynowany tym ostatnim i nie dostrzegałem wielu jego wad. Prosty moduł uwierzytelniania (mniej więcej taki, jaki wtedy stworzyliśmy) nie przysparza jeszcze większych trudności, jednak każde dodatkowe wymagania sprawiły, że JAAS coraz bardziej zaczął mnie zniechęcać. Nie twierdzę, że jest zły, tylko jego silna integracja z mechanizmami serwerów aplikacji sprawia, że aplikacja staje się mało przenaszalna i praktycznie przed każdym wdrożeniem na inny serwer moduł logowania trzeba implementować od nowa. Najgorsze w tym wszystkim jest to, że niektóre serwery udostępniają łatwe i przyjazne API do rozszerzania funkcjonalności uwierzytelniania, a inne z kolei utrudniają bądź wręcz to uniemożliwiają. Jeśli wiemy, że nasza aplikacja od początku do końca będzie współpracować z jednym tylko serwerem – problem znika, nie mniej i tak się namęczymy z implementacją kilku rzeczy.

Użerając się wciąż z JAAS’em w końcu postanowiłem spróbować czegoś innego. Padło na Apache Shiro – framework ułatwiający implementację uwierzytelniania, autoryzacji, szyfrowania i zarządzania sesjami w aplikacjach Java. Shiro wywodzi się ze starej biblioteki JSecurity i obecnie jest aktywnie rozwijane przez wielu deweloperów. Może być użyte w zwykłych aplikacjach Java oraz aplikacjach webowych, a mocna modularyzacja kodu pozwala na łatwe podstawianie swoich implementacji do tego co potrzebujemy. Przy okazji zawiera też wiele podstawowych metod uwierzytelniania, z których można skorzystać praktycznie od razu. Dodatkowo jeśli nasza aplikacja musi obsługiwać mechanizmy serwerowe, w Shiro można napisać własną implementację modułu logowania JAAS.

Czytaj więcej »

Google otwiera kod GPE!

Logo GWT

Google na swoim blogu poświęconym GWT ogłosiło, że udostępniło kody źródłowe Google Plugin for Eclipse, łącznie ze źródłami GWT Designer‚a. Kod został wydany na licencji Eclipse Public License (EPL) v1.0.

Co to dla nas oznacza? Od tej chwili każdy może mieć wgląd do źródeł obu projektów, każdy może też dołączyć do ekipy programistów. Można więc się spodziewać, że rozwój obu narzędzi nieco przyspieszy, a poprawki błędów będą pojawiały się szybciej. W przyszłości powstaną też być może komercyjne rozwiązania będące forkami powyższych projektów, mającymi jednak lepsze wsparcie od strony firm je produkujących.

Na uwagę zwraca też fakt ciekawej polityki Google’a, które rozwija projekt o zamkniętym kodzie i otwiera go dopiero w momencie uzyskania pożądanej funkcjonalności. Podobnie jest przecież z poszczególnymi wersjami Androida.

Implementacja weryfikacji obrazkowej CAPTCHA w GWT i JAAS

Istotnym problemem stron internetowych są nieproszone boty, które często uprzykrzają życie nie tylko administratorom serwisu, ale też użytkownikom, którzy chcieliby mieć dostęp do treści jak najwyższej jakości. Nic przecież tak nie drażni jak mnogość bezsensowych komentarzy z reklamami przy wpisie, dla którego np. toczyła się ciekawa dyskusja. Od lat podejmuje się próby rozróżnienia użytkownika będącego po drugiej stronie i stwierdzenia, czy mamy do czynienia z człowiekiem czy komputerem. Jednym ze sposobów jest zastosowanie CAPTCHA. Czy jest to sposób w pełni skuteczny? Jak się domyślasz, bądź wiesz – nie, jednak z pewnością eliminuje zdecydowaną większość mało zaawansowanych botów. Ważne jest też, aby CAPTCHA nie była zbytnim utrudnieniem dla właściwego użytkownika, bo nic tak nie irytuje, jak kilkukrotne odświeżanie obrazka, aby w końcu trafić na ten w miarę czytelny.

W niniejszym wpisie nie będę rozwodził się na temat skuteczności CAPTCHA, jak i przekonywał do używania tego typu zabezpieczenia lub nie. Nie chcę też sugerować konkretnego rodzaju zabezpieczenia, bo przecież oprócz najpopularniejszych  obrazków z mało czytelnymi literami i cyframi, istnieją jeszcze zabezpieczenia głosowe, czy takie polegające na wykonaniu jakiegoś zadania matematycznego, bądź inne bardziej wyrafinowane. Po prostu dostałem zadanie w firmowym projekcie polegające na implementacji weryfikacji obrazkowej i zanim się do tego zabiorę, postanowiłem nieco wcześniej rozeznać się w temacie.

Czytaj więcej »

GWT 2.4 – wsparcie dla programistów Androida i nie tylko

Logo GWT

W poprzedniej wersji GWT było już widać, że Google mocno stawia na rozwój narzędzi programistycznych i chce, aby aplikacje powstawały coraz łatwiej i szybciej. Dlatego też kolejne wydanie GWT nie przynosi wielu zmian w samym sobie, a większość nowości dotyczy narzędzi wspierających tworzenie aplikacji w GWT, jak Google Plugin for Eclipse czy GWT Designer. Mimo wszystko zawsze warto stosować aktualną wersję GWT, więc zapraszam do pobierania.

Poniżej lista najważniejszych zmian:

  • App Engine Tools for Android

    Nowy GPE zawiera wsparcie dla deweloperów Androida upraszczające tworzenie metod serwisów po stronie serwera osadzonych na serwerze App Engine. Dzięki tej zmianie podczas tworzenia nowej usługi serwisu GPE generuje cały niezbędny kod aplikacji androidowej, a programista może skupić się na implementacji właściwej metody.

  • Apps Marketplace Support

    GPE pozwala teraz programiście na szybkie umieszczenie swojej aplikacji w serwisie Google Apps Marketplace, w analogiczny sposób jak do tej pory można było ją wgrać na serwer App Engine.

    Dodatkowo GPE umożliwia wygenerowanie prostego przykładu korzystającego z Google API, posiadającego mechanizmy uwierzytelniania, który można wgrać do Apps Marketplace. Plugin pozwala również na łatwe zarządzanie wgranymi aplikacjami, dzięki czemu ich aktualizacja może przebiegać szybko i bezproblemowo.

  • GWT Designer Enhancements

    Zmian nie ustrzegł się również GWT Designer, który znacznie przyśpieszył względem ostatniego wydania. Oprócz poprawek wydajnościowych został wyposażony w edytor WYSIWYG dla kodu UiBinder‚a. Dzięki temu można równocześnie pracować nad kodem źródłowym i obserwować wyniki wprowadzonych zmian. Znacznemu usprawnieniu uległa również edycja styli CSS, które teraz można edytować na podobnej zasadzie, jak wszystkie inne właściwości elementów GWT.

Te główne zmiany zostały opisane na blogu GWT. Widać, że Google silnie promuje nowe udogodnienia i stara się zachęcić programistów Androida do korzystania z GWT + GPE. Jeśli jednak nie jesteś jednym z nich, z pewnością ucieszysz się z wprowadzenia cache’u wyników kompilacji, dzięki czemu praca nad kodem aplikacji będzie szybsza i przyjemniejsza. Jeśli jesteś ciekaw pozostałych, mniej ważnych nowości, zachęcam do przeczytania pełnej listy zmian.

JPA i walidacja encji w projekcie GWT

Całkiem niedawno opisywałem moje boje z mechanizmem RequestFactory, który okazał się być całkiem fajnym tworem. Za jego pomocą udało się nam wtedy stworzyć aplikację z serwisami zorientowanymi na dane, gdzie warstwę dostępu do danych zapewniał nam Hibernate. Aplikacja potrafiła wykonać jedynie podstawowe operacje CRUD na pojedynczej encji i już wtedy zapowiedziałem, że w dalszym ciągu czekają na nas relacje między encjami oraz walidacja encji. Dzisiaj będę kontynuować stworzony wtedy projekt i zajmę się drugim z zapowiedzianych tematów, czyli normą JSR 303 definiującą reguły sprawdzania poprawności obiektów. Walidacja nie będzie skomplikowana i ma na celu jedynie pokazanie działania wraz z mechanizmem RequestFactory.

Aby materiału na dzisiaj nie było za mało, pokażę jak skonfigurować projekt, aby skorzystać ze standardu JPA, którego API zastąpi nam Hibernate’a. Ten ostatni będzie dalej obecny pod postacią dostawcy implementacji JPA, jednak jak zauważymy później, kod źródłowy będzie całkowicie od niego niezależny. Przy okazji pokuszę się o małe porównanie JPA z Hibernate’m.

Zacząłem trochę inaczej niż zawsze, gdyż na wstępie zazwyczaj skupiam się na sensowności/celu zastosowania danej technologii, a nie na tym co będziemy robić. Jeśli czujesz się trochę zawiedziony, to już to nadrabiam :) Po co używać więc JPA, jeśli mamy w projekcie doskonale działającego Hibernate’a? Po co uczyć się nowego, nieco innego API? Czy użycie JPA ma jakieś zalety, ewentualnie wady? Odpowiedzi na te pytania mogą być różne i wszystko zależy od tego, jaką aplikację tworzymy i w jakim środowisku będzie ona pracować. Przede wszystkim należy pamiętać, że Hibernate nie jest jedynym narzędziem ORM’owym i istnieje cała masa alternatywnych rozwiązań. Możemy np. trafić do zespołu, który będzie faworyzował Oraclowego TopLink‚a, bądź rozwijanego przez fundację Apache – Open JPA. Możemy też być uzależnieni od środowiska, np. osadzenie aplikacji na serwerze Google App Engine będzie wymagało od nas użycia DataNucleus‚a.

Czytaj więcej »

Alternatywa dla GWT-RPC: RequestFactory

Prawdopodobnie znasz już dobrze mechanizm GWT-RPC, który dostarcza podstawowy sposób komunikacji klient-serwer w projekcie wykorzystującym GWT. Mechanizm ten z powodzeniem działa już od pierwszych wersji GWT i mając z początku alternatywę jedynie w postaci ręcznych zapytań do serwletów http, wygrywa prawie każde starcie. Nie ustrzegł się jednak kilku dość istotnych wad (wynikających z ogólnej architektury aplikacji GWT), które nie tyle co coś uniemożliwiają, ale bardziej uprzykrzają życie programiście. O ile GWT-RPC w wywoływaniu prostych akcji sprawdza się świetnie, to implementacja dobrej warstwy pobierania danych jest już dość trudna. Problem leży w tym, że GWT nie potrafi zserializować obiektów encji wybieranych wprost z bazy danych poprzez np. Hibernate’a, które zawierają dowiązania do innych obiektów encji będących z nimi w relacji. W praktyce sprowadza się to do tego, że nie można stosować mapowań relacji typu „lazy”, gdyż informacje o relacjach przechowywane w obiektach encji nie mogą być zserializowane i przesłane do strony klienckiej. Relacje można więc sobie odpuścić (co jeszcze sprawdzi się w małej aplikacji), bądź przesyłać przez RPC obiekty specjalnych klas DTO (Data-Transfer Object), które będą zawierały jedynie niezbędne dla widoku informacje – a tu czeka nas ręczne i wolne przepakowywanie atrybutów obiektów oraz mozolne tworzenie klas DTO. Da się z tym żyć, jednak da się zrobić lepiej! Czytaj więcej »