29. prosince 2008

JSF: zkušenosti s NetAdvantage

O NetAdvantage komponentách jsem již několikrát psal (1, 2, 3) a rád bych napsal ještě jednou a tím to uzavřel. Již jsem se dříve snažil o nějaké zhodnocení a na to bych rád dnes navázal. Pokud se od té doby něco změnilo nebo jsou určité věci jinak než dříve, tak to nyní uvedu, jinak platí to co jsem již napsal.

S NetAdvantage komponentami jsme dělali přibližně půl roku, z toho tři měsíce celkem intenzivně. Projekt jsme zdárně stihli, takže (snad) všechny problémy, které jsme s komponentami měli, jsme dokázali nějak vyřešit. O použitých technologiích jsem psal v tomto příspěvku.

Ještě uvedu, že se budu vyjadřovat k verzi 8.2.20082.1003 - od té doby byly vydány dva nové hotfixy, takže něco může být lehce jinak.

Výhody

Seznam výhod nebudu rozšiřovat, stále platí co jsem již napsal. U podpory prohlížečů jsme narazili pouze na jeden problém a to v nastavení modality okénka (ig:dialogWindow) v IE 6 - v této verzi IE se nám prostě modální okénka nepodařilo rozchodit.

Obecně bych jako největší výhody NetAdvantage označil vzhled a AJAX. Komponenty vypadají hned "v základu" moc hezky, vše je možné skinovat. AJAX funguje bez problémů, člověk ho může používat, aniž by o něm něco věděl.

Nevýhody

Seznam nevýhod resp. nedostatků musím celkem rozšířit. Nejdříve bych ale doplnil informace uvedené v předchozím shrnutí:
  • dokumentace - úroveň uvedené dokumentace (JavaDoc a příručka programátora) jsou pořád na stejné úrovni, jen navíc přibyly nové stránky s ukázkami a příklady. Tyto stránky jsou moc pěkně udělány a navíc obsahují hodně vychytávek, které nikde jinde v dokumentaci uvedeny vůbec nejsou.

  • AJAX a MyFaces Orchestra spolu moc nefungují (neplatí) - toto již neplatí, chyba na straně Apache Orchestra (pozn. ona to úplně nebyla chyba, protože nikde není přesně popsáno jak má fungovat JSF a AJAX dohromady) byla opravena.

  • podpora pouze JSF 1.1 (neplatí) - jak jsem již psal, tak je možné již používat JSF 1.2.


Nyní bych rozšířil seznam nedostatků, na které jsme narazili v průběhu vývoje:
  • JSF chybové zprávy - v konfiguraci JSF jsme nastavili odkaz na vlastní properties soubor s chybovými hláškami. Správně se používají u standardních JSF komponent, ovšem s NetAdvantage komponentami (konkrétně např. ig:dateChoose) se pořád používají chybové hlášky z myfaces.jar.

  • nemožnost používat čisté HTML - i když samotné facelets umožňují libovolné používání "čistého" HTML včetně EL bez nějakých tagů (kdekoliv na stránce mohu použít #{data}), tak bohužel toto neplatí pro NetAdvantage komponenty. Uvnitř těchto komponent (my jsme to raději používali všude) je nutné EL volat pomocí h:outputText a čisté HTML tagy (konkrétné DIV) nahrazovat tagy z Tomahawku (t:div).

  • komponenta ig:dropDownList nefunguje s konvertery - o této chybě jsem již psal, zde uvádím znovu jen kvůli úplnosti

  • ig:link nemá onClick() - NetAdvantage náhrada za h:commandLink má navíc hlavně vestavěnou podporu pro AJAX, ale bohužel nemá metodu onClick. To je například problém, když máte tabulku s možností smazání libovolného řádku s tím, že vlastní smazání musí být ještě potvrzeno. Pokud chci AJAX, tak nemám možnost toto udělat, museli jsme použít normální h:commandLink a oželet v tomto případě AJAX.

  • ig:dateChooser ignoruje locale

  • problémy s ig:dialogWindow - ig:dialogWindow vytváří modální/nemodální okénko (ne pop-up okénko). Zde máme občas problémy s tím, že modalita není dodržena (při více aktivních okénkách na stránce) nebo si uživatel občas může všimnout problikávání při načítání stránky. Ale toto jsou pouze "kosmetické" věci, které bohužel uživatel připomínkuje nejčastěji.

  • předávání parametrů do komponent - vytvářeli jsme si Facelets komponenty pro různé tabulky (ig:gridView), protože jednou se tabulka použije v detailu, podruhé v editaci atd. Naše komponenty měly vždy alespoň jeden parametr a to dataSource pro načtení dat do tabulky. Bohužel předávání proměnné datového zdroje jako parametr naší Facelets komponenty nefungoval.

  • rekurzivní vytváření stromu - komponenta ig:tree umožňuje vytvářet stromy. Jednou z možností načtení dat do stromu je rekurzivní přístup, který nám bohužel nefungoval.

  • předávání objektu řádky tabulky pomocí f:setPropertyActionListener - NetAdvantage komponenta pro tabulku ig:gridView nabízí objekt #{DATA_ROW}, který představuje aktuální objekt pro určitou řádku tabulky. Bohužel není možné tento objekt nasetovat pomocí f:setPropertyActionListener.

  • ...


Závěr

Nakonec jsem vypsal jen ty nejdůležitější nedostatky, protože jich je mnohem více. Většina z nich je reportována výrobci jako chyba a většina z reportovaných chyb je označena statusem "In Development", tak snad budou někdy opravené.

Pokud nás během vývoje něco brzdilo, tak to byly NetAdvantage komponenty, protože vždy nějakou dobu trvalo, než jsme našli tu správnou cestičku. Musím hned ale dodat, že absolutní většinu všech nedostatků se nám podařilo vyřešit, obejít. Také je otázka, zda by to bylo výrazně jiné s jinými JSF komponentami? Pro nás to byl první větší projekt s JSF, takže jsme se učili spoustu věcí za běhu. Během vývoje jsme se několikrát ptali sami sebe, zda nezkusit jiné komponenty, ale dobře jsme udělali, že jsme vydrželi.

Závěrečná otázka asi bude "Použít či nepoužít"? Vzhledem k tomu, že již znám "cestičku", kudy jít při vývoji s NetAdvantage komponentami, tak bych se nebál je použít i na dalším projektu. Zvláště pokud by byla možnost do projektu zasahovat již v době návrhu, tak aby se již v této fázi eliminovaly "neprůjezdné cestičky". U nového projektu nevím. Pokud by to mělo být jen pro jeden projekt a nic dále, tak bych do toho nešel, ale pokud je to s vidinou toho, že to budete využívat i na dalších projektech, tak se pak ten čas navíc (u našeho projektu cca 20% času vývoje) celkem vrátí.

Žádné komentáře: