GWT je technogie, která mi velmi líbí – podařilo se jí dostat téměř bezproblémově Javu do prostředí internetového prohlížeče. Nicméně GWT má některá omezení, která si programátor předem neuvědomí a někdy je těžké odhadnout, v čem je problém. Ukážu tři kódy, na kterých se tyto limity projeví.
Datumočas
Následující kód odmítne GWT kompilátor převést do javascriptu. Problém je ve třídě SimpleDateFormat, kterou GWT odmítá. GWT kompilátor funguje tak, že buď použije knihovnu upravenou pro GWT a pro některé třídy z JDK vytvoří zástupné implementace v javascriptu. Bohužel JDK má rozsáhlé API a všechny třídy nebyly přepsány.
import java.util.Date; import java.text.SimpleDateFormat; public String getDate(){ Date date = new Date(); DateFormat fmt = new SimpleDateFormat("d.M.y"); return fmt.format(date); }
S datumočasem je to v GWT problematické – není podporován java.util.Calendar, o knihovně Joda-Time nemluvě. Časem možná někdo vytvoří knihovnu pro datumočas v GWT a nebo převede Joda-Time do GWT, ale do té doby musíme používat ne příliš přívětivou třídu java.util.Date.
Řazení
V jedné GWT aplikaci jsem vypisoval seznam uživatelů programově do komba. Aplikace byla navrhnutá tak, že řazení uživatelů probíhalo na klientu. K mému překvapení byli uživatelé seřazeni „tak nějak divně“. Kód vypadal podobně jako následující ukázka:
public String compareFlowers(){ String str1 = "Řeřicha"; String str2 = "Zvonek luční"; if(str1.compareTo(str2)>0){ return str1; }else{ return str2; } }
V čem je problém? Metoda String.compareTo() je převedena GWT kompilátorem na obyčejné javascriptové porovnávání dvou řetězců. A to je jádro problému – javascriptové enginy interně používají kódování ISO Latin 1. Samozřejmě řešení je snadné – vytvoříme si vlastní komparátor. Bohužel se tím aplikační kód znepřehlední.
Životní cyklus GWT komponent
Následující kód skončí vyjímkou NPE – proměnná style bude mít hodnotu NULL. Jak je to možné, aby existovala HTML komponenta bez CSS stylu? Je to možné, protože během vykonávání konstruktoru není objekt komponenty napojen na DOM. Je to dosti nepraktické, GWT komponenty totiž neobsahují metodu ve stylu onRender(), vytvoření nějakého mechanismu pozdní inicializace je docela pracné.
public class MyPanel extends HorizontalPanel { public MyPanel(){ setVerticalAlignment(ALIGN_BOTTOM); add(new HTML("<b>ahoj</b>")); Style style=getElement().getStyle(); style.setColor("blue"); } }
Závěr
Možná můj článek vyznívá jako hana na GWT. Tak to není, GWT je výborná technologie, ale je potřeba při jejím používání „přemýšlet jinak“…
10.1.2012 at 08:59
Pro formátování data bych doporučil návštěvu API: http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/i18n/client/DateTimeFormat.html
Sice nevím, co všichni s Jodou máte, ale budiž. Modulů existuje několik, třeba tento: http://code.google.com/p/gwt-joda-time/ , práce s moduly je popsaná v dokumentaci: http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModules
12.1.2012 at 08:45
Z GWT jsem býval nadšený a napsal jsem v něm několik aplikací. Teď si držím trochu odstup. Cituji z ThoughtWorks Technology Radar http://www.thoughtworks.com/articles/technology-radar-july-2011
„GWT is a reasonable implementation of a poor architectural choice. GWT attempts to hide many of the details of the web as a platform by creating desktop metaphors in Java and generating JavaScript code to implement them. First, in many ways, JavaScript is more powerful and expressive than Java, so we suspect that the generation is going in the wrong direction. Secondly, it is impossible to hide a complex abstraction difference like that from event-driven desktop to stateless-web without leaky abstraction headaches eventually popping up. Third, it suffers from the same shortcomings of many elaborate frameworks, where building simple, aligned applications is quick and easy, building more sophisticated but not supported functionality is possible but difficult, and building the level of sophistication required by any non-trivial application becomes either impossible or so difficult it isn’t reasonable.
GWT has an elaborate component model, which tries to hide details about the underlying language (JavaScript) and platform (the web)“
12.1.2012 at 11:37
Som toho nazoru ze ludia (vyvojari) si dopredu vobec neuvedomuju co je vlastne GWT a potom su z toho sklamani. Mozno by mali na matersky web GWT napisat ze GWT nie je j2ee ani j2se , GWT je proste pisanie klientskych aplikacii na platforme javascript pomocou jazyka java. Jediny problem je ze clovek musi poznat javascript aby bol schopny si vydedukovat preco nieco nefunguje tak ako v standardnej jave. Ano je mozne emulovat vsetky triedy sdk, ale potom by bolo gwt uz len docela dost velky zaklad ktory sa musi stiahnut na klienta.
ThoughtWorks Technology Radar ma urcite pravdu v tom ze javascript je silnejsi jazyk ale verim ze dalsimi verziami nam chlapci z GWT teamu dokazu ze ich kompilator do JS dokaze spravne rozoznat a vyuzit tu silu. Avsak v tom ze sa velke a netrivialne aplikacie nedaju naimplementovat nesuhlasim – krasa GWT je prave v tom ze mate volne ruky v architekture vase klientskej aplikacie a preto ake si to urobite take to mate.
12.1.2012 at 12:43
Secondly, it is impossible to hide a complex abstraction difference like that from event-driven desktop to stateless-web without leaky abstraction headaches eventually popping up.
ThoughtWorks Technology Radar obcas ctu a v tomhle s tim nesouhlasim. Je to zdroj psany pro managery, nemuzete to brat jako autoritativni technicky zdroj. Ta veta nahore je hloupost – existuje spousta frameworku ktere dokazi za interface odvozeny ze SWINGU nadherne skryt distribuovanou podstatu webu.
GWT ma sve chyby ktere se projevi na velkych projektech ale tohle neni jedna z nich.
21.1.2012 at 12:46
Ahoj, na co si dát pozor při vytváření seléniových testů u GWT? Vím jen o tom že GWT mění id u elementů, je ještě něco jiného na co si dát pozor? Díky.
23.1.2012 at 18:27
Nezkoušel jsem, ale věřím, že spolupráce Selenia a GWT by mohlo být také zajímavé téma v kontextu tohoto článku….