17. listopadu 2008

JSF - sestava sedmi statečných

V předchozím článku jsem zmínil naší sestavu sedmi frameworků resp. knihoven, které používáme pro vývoj s JSF. Některé knihovny byly dané již od začátku, některé se ukázaly jako nezbytné až v průběhu samotného vývoje.

  • Apache MyFaces - úplně na začátku jsme začali se SUNovskou implementací JSF, ale asi po měsíci jsme přešli k MyFaces. Jednak jsme měli pár problémů s NetAdvantage komponentama, které se přechodem vyřešily a jednak jsme dostali pocit, že MyFaces implementace "více" žije, že je lepší bug-fixing apod. Ale toto může být subjektivní. Používáme JSF verze 1.2.

  • NetAdvantage komponenty - o těchto komponentách jsem již něco napsal (1, 2). Snad jen dodám, že někdy v září vyšla nová verze podporující JSF 1.2, která zejména ve spojení s Facelets obsahuje celkem dost chyb. Hodně jsme přemýšleli, zda pokračovat nebo zkusit nějaké jiné komponenty a rozhodli jsme se pokračovat - reportovali jsme hodně chyb a teď víceméně čekáme na nový hotfix. Verze 1.1 a bez Facelets (platí pro obě verze) je mnohem více odladěná.

  • Tomahawk komponenty - primárně využíváme NetAdvantage komponenty, ale sem tam potřebujeme něco jiného nebo něco více. Například tagy t:htmlTag a t:div používáme celkem dost, protože NetAdvantage nedovolují používat čisté HTML ve svých tagách (i když používáme Facelets). Zkoušeli jsme také Trinidad, hlavně kvůli komponentě na výběr barvy, ale od toho jsme nakonec ustoupili - jednak je tato knihovna celkem invazivní (vyžaduje použití vlastního ViewHandleru) a jednak už jsme začali cítit, že těch knihoven máme v projektu nějak moc.

  • Spring framework - bez Springu si už nedovedu představit snad žádnou aplikaci, takže zde nebylo co řešit. Velkou výhodu to přineslo díky MyFaces Orchestra, která implementuje nové konverzační rozsahy pro Spring beany. Používáme Spring EL resolver, takže nemusíme skoro nic definovat přímo v JSF. O bezpečnost aplikace se nám stará Spring security.

  • MyFaces Orchestra - s pomocí Springu implementuje nové konverzační rozsahy, více v tomto článku.

  • Facelets - když už JSF, tak jedině s Facelets. Díky Facelets je JSF mnohem více stravitelnější, je to výborný šablonový systém. Při použití JSF s JSP resp. JSTL si je potřeba dát pozor na spoustu možných problémů (popsáno v tomto článku), které s Facelets odpadají.

  • URL rewriter - díky URL rewriteru jsme byli schopni vyřešit asi největší nedostatky JSF - nemožnost bookmarkovat stránky, nemožnost efektivního zabezpečení stránek pomocí Spring security a problém s "opožděnými" URL (uživatel vidí v prohlížeči URL, které odpovídá předchozí stránce). Také jsme tím mohli zcela vynechat konfiguraci navigace v JSF a nadefinovat jí (dle mého názoru efektivněji) pomocí URL rewriteru.

5 komentářů:

cyril.sochor řekl(a)...

Hezka kombinace, asi vam trvalo nejakou dobu, nez jste ji sestavili. Ja jsem vsadil na jednoho statecneho s obdobnou funkcnosti - Jboss Seam. Pravda v jistych ohledech se lisi (napriklad pouziva komponenty Rich). Seam je dodavan jako jeden celek - odladeny. Takze neni nebyva problem kdyz se dva ze sedmi statecnych rozhadaji.

Petr Jůza řekl(a)...

Hezky napsané :).
My jsme od začátku určitě nechtěli znovu vynalézat kolo, ale tak nějak jsme se k tomu postupně dostali, jak jsme se v tom JSF více rozhlíželi (trvalo nám to cca 2 měsíce, což není tak hrozné). Já jsem na začátku znal JSF víceméně jen z článků, a proto jsem chtěl začít s JSF v té základní formě - jenže pak jsem zjistil, že potřebuji šablony, že mi vadí URL, že mi vadí používání sessions, že potřebuji aplikaci zabezpečit atd. až jsem došel k této sestavě.

Teď mohu říci, že ty technologie známe a máme je zcela pod kontrolou. Samozřejmě nějaký čas trvalo, než si to "sedlo".

sm4rtus řekl(a)...

Jaké IDE používáte pro vývoj? Jde mi hlavně o podporu facelets a code-completition v xhtml.

Petr Jůza řekl(a)...

Používám MyEclipse. Nevím přesně, jaké pluginy MyEclipse používá, ale celkem jsem s podporou JSF resp. facelets spokojený.

svoro řekl(a)...

problém s "opožděnými" URL (uživatel vidí v prohlížeči URL, které odpovídá předchozí stránce), sme riesili jednoducho pridanim <redirect/> do navigacnych pravidiel

<navigation-case>
<from-outcome>otcome</from-outcome>
<to-view-id>mypage.jsp</to-view-id&gt
<redirect/>
</navigation-case>