Ph: 10272007

Není AJAX jako AJAX - GWT vs. DWR

V projektu, na kterém v souÄasné dobÄ› pracuji, bylo navrženo pomÄ›rnÄ› extenzivní použití AJAXových funkcí. Proto jsem se, coby AJAXem dosud netknutý vývojář, vrhnul do studia knihoven, které by mi realizaci usnadnily. Výsledkem mi bylo zjiÅ¡tÄ›ní, které uvádím v titulku příspÄ›vku - není AJAX jako AJAX. Každá z knihoven tento problém Å™eší velmi odliÅ¡nÄ› - a pÅ™estože mé první kroky vedly k GWT, brzy jsem tento zámÄ›r opustil.

Jelikož pracuji ve spoleÄnosti, která své krédo staví na velmi propracovaných webech - co se týká použitelnosti, přístupnosti, validity a grafickém vzhledu (o tuhle stránku vÄ›ci se naÅ¡tÄ›stí nestarám já ;)) - bylo nutné zajistit, aby stejná funkcionalita byla přístupná s AJAXem i bez nÄ›j. Mým prvotním zámÄ›rem tedy bylo:

HTML generovat servlety, AJAX by pouze oživoval nÄ›které prvky tak, že místo odeslání odkazu / formuláře provede operaci na pozadí a modifikoval DOM bez nutnosti reloadu stránky, minimalizovat logiku na klientovi a maximum provést na serveru - z důvodů pokrytí testy, mít možnost pracovat pod pÅ™ihlášeným uživatelem - tzn. i v AJAXovém volání mít přístupnou session, pokud možno se vyhnout nÄ›jakému ohýbání kódu, kvůli integraci AJAXu, minimalizovat kód, který by sloužil pouze AJAXu, docílit pÅ™enositelnosti mezi hlavními prohlížeÄi, aniž bych to já musel nÄ›jak příliÅ¡ Å™eÅ¡it.

GWT - Google Web Toolkit

První knihovna, kterou jsem zkoumal byl GWT. Ze zcela racionálních důvodů jsem si myslel, že je to pro mne to pravé. HodnÄ› se o nÄ›m mluví, stojí za ním velká korporace (tudíž by mÄ›l být pomÄ›rnÄ› propracovaný), JavaScript se píše v JavÄ›, což je pro Java programátora pÅ™eci to ideální. Po nÄ›kolika vÄerech jsem doÅ¡el k nÄ›kolika poznatkům:

GWT mÄ› nutí dÄ›lat vÄ›ci jeho stylem - každá odchylka se draze platí; musíte použít buÄ vÅ¡echno nebo nic (to je vidÄ›t už na tom jak si GWT vlastnÄ› vÅ¡echno Å™eší - vÄetnÄ› takových drobností jako je napÅ™. internacionalizace) jeho použití mÄ› dost pÅ™ipomíná session beany v J2EE - straÅ¡nÄ› práce kvůli niÄemu; musíte nadefinovat dva interfacy - které si navíc ani v deklaraci metod neodpovídají (RemoteService + AsyncCallback), dále pak implemenaci remote služby na stranÄ› serveru (? implements vaÅ¡i RemoteService) + implementaci EntryPointu, který pÅ™edstavuje klientskou Äást + jednu statickou HTML page, ve které se to bude celé odehrávat + CSS + popisný *.gwt.xml soubor - a to ani nemluvím o tom, že vÅ¡echny DTO, které si vyměňujete pÅ™es AJAXové rozhraní musí implementovat marking interface IsSerializable - Äímž se vám dependence na GWT dostává i do nižších vrstev (pokud nechete furt pÅ™ekopírovávat data z interních bean do “gwt” bean a zpÄ›t) GWT jde stylem, že do vybraných DOM elemenů stránky dovytvoří dynamicky celou vnoÅ™enou HTML strukturu - skoro mi to pÅ™ipadá, jako by se HTML stránka rozdÄ›lila na dvÄ› Äásti - Äást spravovanou GWT a tu druhou; v Äásti spravované GWT se dostanete k objektům, které jsou potomky třídy Widget a můžete s nimi sluÅ¡nÄ› manipulovat - v té druhé Äásti (kterou jste si sami nevytvoÅ™ili ale už v HTML prostÄ› byla) už takové možnosti nemáte; dostanete se pouze k objektu Element, se kterým nic moc neudÄ›láte, akorát ho můžete vyměňovat pÅ™es JSNI (JavaScript Native Interface = vámi natvrdo napsané javascriptové metody) - kde už nemáte takových výhod jako v Java režimu jak tedy Google Å™eší, když uživatel nemá zapnutý javascript? Kouknul jsem se na gmail.com - hned na první stránce na vás jukne informace o vypnutém javascriptu a můžete jít na tzv. “noscriptovou” verzi - ovÅ¡em ta má pravdÄ›podobnÄ› úplnÄ› oddÄ›lený zdrojový kód od té AJAXové verze (myslím na úrovni prezentaÄní vrstvy) - já ale nechci psát GUI 2x - na to prostÄ› nemám Äas další dost matoucí vÄ›c je ta statická HTML stránka - už jenom takováhle hloupost vám zabere dost Äasu - typicky budete mít totiž tuhle stránku generovanou nÄ›jakým servletem; takže budete nÄ›jakou dobu stejnÄ› jako já hledat zda a jak tohle jde vůbec udÄ›lat na stránce můžete mít pouze jeden jediný GWT modul - reuse GWT komponent je totiž na úrovni Widgetů a nikoliv na úrovni EntryPointů (tak jsem tedy alespoň pochopil) ke GWT je pomÄ›rnÄ› dost dokumentace, ale ani v jedné vám neÅ™eknou to co pÅ™esnÄ› vy potÅ™ebujete - poznatky, které tu píšu jsem nikde na webu neobjevil - vždy jen nÄ›jaké náznaky a ÄásteÄná Å™eÅ¡ení problémů; napÅ™. i v GWT in Action je více ménÄ› jen podrobnÄ›ji popsáno to, co psal Dagi na intervalu.cz

RozhodnÄ› nechci GWT jen strhat. Velkou výhodu GWT vidím v tom, že v nÄ›m můžete vytvářet (a znovupoužívat) pomÄ›rnÄ› rozsáhlé a kombinované JS komponenty a vůbec vytvářet v nÄ›m velké AJAX aplikace, aniž byste se dostali do stavu, kdy bude obtížné kód udržovat natož rozÅ¡iÅ™ovat. ProstÄ› GWT je vhodný na rozsáhlá Å™eÅ¡ení - pokud byste jej chtÄ›li použít na vÄ›ci jako sem tam Å¡oupnout naÅ¡eptávaÄ, sem tam nÄ›jakou funkci volat asynchronÄ› atd. je to absolutní overkill.

JeÅ¡tÄ› bych rád uvedl, že mé poznatky vycházejí asi z týdenního studia po veÄerech. Pokud na nich chcete stavÄ›t, jeÅ¡tÄ› si je stejnÄ› radÅ¡i prověřte - nerad bych nÄ›koho pÅ™ivedl na scestí. Ale věřím, že pokud je tu nÄ›co Å¡patnÄ›, uvedou zastánci GWT vÄ›ci na pravou v komentářích pod Älánkem.

DWR - Direct Web Remoting

Další knihovna, po které jsem na doporuÄení mého kolegy sáhnul, byla DWR - Direct Web Remoting. U ní jsem také zůstal, jelikož splňuje vÅ¡echny mé požadavky. IdeálnÄ› se hodí právÄ› pro AJAXové oživení jinak stále bezjavascriptovÄ› funkÄních web prezentací. Learning curve u této knihovny je asi 2 hodiny, oproti GWT do kterého jsem ÄuÄel nÄ›kolik dní

DWR poskytuje v podstatě pouze dvě služby - za to je poskytuje kvalitně a jednoduše:

zpřístupnění Java tříd z klienta - tedy zpřístupnění rozhraní na serveru a marshalling / unmarshalling přenášených POJO poskytnutí základní knihovny odladěných JavaScriptových funkcí pro použití na klientovi (např. nahrazení výběrů v selectech, řádků v tabulkách, nastavování a získávání hodnot aj.)

DWR mÄ› poskytnul vÅ¡e, co jsem hledal. PÅ™edevším generuje JavaScript ad hoc - tzn. nemusím nic pÅ™ekompilovávat do *.js, které bych nÄ›jak musel složitÄ› pÅ™enášet do mé web aplikace. Ve web.xml si pouze zaregistruji DWR servlet, který mi poskytne vÅ¡echny *.js on the fly jak je zapotÅ™ebí. V konfiguraÄním souboru dwr.xml (pokud integruji DWR se Springem, vypadne mi i tento konfigurák) si nadefinuji třídy, které budou zvenÄí (AJAXem) přístupné a seznam POJO tříd, které v komunikaci proteÄou. U tříd je možné odfiltrovat pouze urÄité metody, které mají být přístupné atd. atd.

Další skvÄ›lou vlastností DWR je to, že vlastnÄ› svůj kód nepotÅ™ebujete vůbec nijak upravovat proto, aby jste ho mohli používat AJAXem. Žádné zanášení tříd interfacy DWR a podobnÄ›. Místo interfaců, které by stejnÄ› na klientovi a serveru nemohly sedÄ›t (ani u GWT nesedí) se DWR drží přístupu convention over configuration. Víte, že na stranÄ› klienta (v Javascriptu) zavoláte svou metodu stylem server: “nazevMetod(parametr1, parametr2)” - klient: “nazevVystaveneBeany.nazevMetody(parametr1, parametr2, asyncCallback)”. To je ten základní a jednoduchý způsob - asyncCallback pÅ™edstavuje JavaScriptovou metodu, která se provede jakmile ze serveru pÅ™ijde odpovÄ›Ä. DWR se dále soustÅ™edí na Å™eÅ¡ení případných výjimeÄných stavů - tzn. můžeme mít různé callbacky pro případ, kdy volání skonÄí exception.

Dalším cennou tÅ™eÅ¡niÄkou na dortu je integrace do rozšířených frameworků - budu jmenovat jen pár: Spring, Hibernate, Acegi Security, JSF … Můžu z vlastní zkuÅ¡enosti říct, že napÅ™. integrace do Springu je naprosto skvÄ›lá (od chvíle, kdy jsem zaÄal studovat DWR mi trvalo asi jen 20 minut, než jsem si zavolal první metodu beany z klienta). StaÄí registrovat DWR namespace a pak už jen u vybrané beany oznaÄit elementem <dwr:remote …/>. Kompletní návod lze nalézt na blogu Bram Smeetse. Vývojáři DWR opravdu mysleli na nás ostatní vývojáře - POJO, kterých může být pomÄ›rnÄ› dost lze oznaÄit wildcardy … napÅ™. vÅ¡echny třídy v package “cz.novoj.ajax.dto.*” - prostÄ› pohodiÄka. Na serveru se dostanete v případÄ› potÅ™eby k session uživatele (což v případÄ› GWT jde urÄitÄ› taky), jednoduÅ¡e integrujete bezpeÄnostní opatÅ™ení (jak pÅ™esným oznaÄením povolených metod, tak případnÄ› integrací Acegi Security frameworku).

Faktem je, že DWR by se asi nehodil na rozsáhlé kódování na stranÄ› klienta - pÅ™eci jen vám s JavaScriptem pomůže jen svou “Utils” knihovnou a vÅ¡e co potÅ™ebujete navíc si musíte napsat sami. Tím pádem už zaÄínáte riskovat, že nebude váš kód tak pÅ™enositelný mezi prohlížeÄi jak byste chtÄ›li.

Závěrem

Znovu jsem se pÅ™esvÄ›dÄil jak je důležité používat správné nástroje na správné vÄ›ci. Pro mé potÅ™eby je DWR to ideální - GWT bych musel velmi pracnÄ› ohýbat. Å koda jen, že jsem pÅ™i hledání toho správného kladiva nenarazil na žádný Älánek, který by mi Å™ekl to, co jsem se snažil já zachytit ve výše uvedených odstavcích. To byl důvod, proÄ jsem tento příspÄ›vÄ›k napsal - snad mé zkuÅ¡enosti nÄ›komu pomohou.

Zajímavé odkazy

Google Web Tolkit

GWT - Google Web Toolkit Úvod do GWT v ÄeÅ¡tinÄ› od Dagiho velmi luxusní demíÄko o podpoÅ™e GWT v IntelliJ Idea integrace GWT se Springem zajímavý tutorial od Philipa McCarthyho - zajímavá je vÄ›ta v závÄ›ru: “GWT is a comprehensive framework that provides a great deal of useful functionality. However, GWT is something of an all-or-nothing approach, targeted at a relatively small niche in Web application development market.”

Direct Web Remoting

A trochu bokem


Podělte se s ostatními:
These icons link to social bookmarking sites where readers can share and discover new web pages.
Digg del.icio.us De.lirio.us Technorati
OhodnoÅ¥te Älánek:
Takovéhle Älánky už radÅ¡i ne!Nic nového pod sluncem.PrůmÄ›r - obsahuje zajímavé střípky informací.Hodnotný Älánek - lecos nového jsem se dozvÄ›dÄ›l.SkvÄ›lý Älánek - informace se mi dost hodí. (7 hlasů, průmÄ›rnÄ›: 4.57 z 5)
Loading ... Loading ...

1 reakce to “Není AJAX jako AJAX - GWT vs. DWR”

rob:

DRW je dobra knihovna, proprve jsem ji pouzil na projektu uz pred rokem. Skvele na ni je, ze se da dobre integrovat v podstate s libovolnym MVC web frameworkem u me konkretne s Tapestry 3 nebyl zadny problem.

Petr Ferschmann:

Zdravím,

podobnou integraci, kterou popisujete má v sobě integrovanou i Seam. Nevýhoda je, že to vyžaduje použití Seamu - což v případě, že Seam používáte není nevýhoda :-)

Wenca:

Ahoj, Obecne jze rici, ze GWT pouzijte jen tehdy pokud nemate nic a nechcete resit i Grafiku (CSS, tam totiz staci jen replejsnout kody barev) tak pouzijte cokoliv jineho. Za uvahu by stalo i Prototype

Vlasta:

Knihovnu DWR jsem si také vyzkoušel a mám stejné zkušenosti. Jeho integrace je tak jednoduchá, že snad jednodušší být ani nemůže.

hisaak:

Duch GWT je popsan velmi vystizne - velka vec resici skoro vsechno. Mam jen par komentaru:
- V DTO neni potreba implementovat IsSerializable z GWT, staci klasicky java.io.Serializable, i kdyz jakesi limity tam jsou (vse je pekne zdokumentovano).
- Diskuse jestli je nutna podpora prohlizecu bez javascriptu, je podle me stejne “hodnotna” jako jestli je podporovan IE verze 4.0. Podle statistik jde o jednotky procent (coz by bylo samozrejme dost), ale kdo zna cloveka, ktery ma javascript vypnuty? A proc to dela? Je to jeste uzivatel nebo podivin z fakulty informatiky s lynxem? :-)
- Za nejvetsi nevyhodu GWT (a zatim jedinou, protoze mame ve firme zcela odlisne pozadavky nez otec Fura) povazuji _nutnost_ delat GUI komponenty pomoci GWT trid. Clovek pak ztrati dost casu programovanim, misto aby jen “maloval” primitivni HTML form a taky se silne svazuje s danym frameworkem.

Novoj:

S druhým bodem moc nesouhlasím, sice se možná jedná o jednotky procent, ale stále se jedná o statisticky významnou skupinu (na nÄ›kterých webech máme podle naÅ¡ich statistik mezi 4-5% - podle W3C je tento podíl jeÅ¡tÄ› vyšší - viz: http://www.w3schools.com/browsers/browsers_stats.asp). Z naÅ¡eho pohledu je to prostÄ› MUST HAVE fíÄura. Jelikož dÄ›láme intranety a webové prezentace, nemůžeme si dovolit říct zákaznikovi, že Å¡est ze sta uživatelů nebude moci s jeho prezentací pracovat. Jediné co si můžeme dovolit říct je, že 6 ze sta uživatelů nebude mít práci se stránkami tak komfortní jako ten zbytek. Tzn. GWT je pro naÅ¡e úÄely prostÄ› nepoužitelné. Což mi opravdu dalo chvíli, než jsem k tomu doÅ¡el - tohle by mÄ›li mít na první stráce ve Quick startu ke GWT.

Nechte zde svůj komentář

[image] Opište prosím text z obrázku:


You are viewing a mobilized version of this site...
View original page here

Mobilized by Mowser Mowser