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”…