Frontendové frameworky javovských webových aplikací, to je bolest. Sice se javisti vymezují třeba oproti Ruby on Rails, jak jsou rychlejší, ale pak to zabijí něčím takovým, jako jsou JavaServer Faces (JSF). Nic naplat, když chcete rychle vyvíjet z dostupných komponent, jsou JSF jednou z možností. Shrnuji pár poznatků, které vám pomůžou rychlejší rozjezd projektu s JSF a knihovnou komponent PrimeFaces. Uvítám i konfrontace zkušenějších kolegů. Nejedná se o podrobný návod, spíš rozcestník.

Proč PrimeFaces

PrimeFaces jsou knihovna komponent pro JSF, pod licencí Apache 2.0 Nabízí se ještě konkurenti RichFaces a IceFaces. Prohlédněte si PrimeFaces ShowCase. Jako výčet pozitiv na svých stránkách uvádějí: jediný jar bez závislostí, Spring Roo addon a hlavně graf z Google Trends.

Doporučuji ovšem srovnat s job trends.

Proč ne PrimeFaces

Sice jsou PrimeFaces open source, ale bohužel s poslední verzí 3.5.0 ohlásili, že bugfixing je placený. Major a minor verze (major.minor.bugfix) jsou nadále zdarma. Zaráží to s ohledem na takřka tři roky staré, neopravené, respektive prohlášené za opravené, chyby. Přitom nejde o žádný výjimečný případ použití, viz LazyDataTable.setRowIndex throws arithmetic exception: division by 0. Dále v extensions, konkrétně u dynamických formulářů, jsem nenašel ani řádek javadocu, asi si se mnou hraje na schovávanou

Spring

JSF od verze 2 přicházejí s ViewScope, nemusíte už plývat prostředky na Session scope managed beany. Pokud ovšem chcete, aby je spravoval Spring, tak si musíte implementovat ViewScope sami. Pozor, s ViewScope budete mít problém, pokud se třeba rozhodnete v ui:include použít EL.

Spring Security je realizováno webovým filtrem, login provádíte POST requestem na url /j_spring_security_check Jenže nechcete kvůli tomu mít manage beanu, že? Nepoužijete tedy h:form, ale normální html form a submit vyvoláte javascriptem. Spring Security a JSF to je vůbec téma na samostatný článek. Třeba o tom, jak se řeší expirace session, tak aby to správně fungovalo i s ajaxem.

404 Page Not Found

Nepříjemně mě překvapilo, že se JSF nechovají jako webová aplikace, jak bych to od ní čekal. Pokud přistoupíte na adresu, která neexistuje, nicméně odpovídá mapování Faceletu, nedostanete http status kód 404 stránka nenalezena, ale 500 vnitřní chyba serveru. Je to kvůli výjimce java.io.FileNotFoundException Vyřeší to následující implementace filtru

Logování

V době mavenu mi nepřijde jediný jar bez závislostí jako výhoda, spíš naopak. PrimeFaces používají java.util.logging, chcete-li tedy použít například slf4j, tak musíte do logging.properties přidat SLF4JBridgeHandler z jul-to-slf4j

handlers = org.slf4j.bridge.SLF4JBridgeHandler

Ignorování komentářů

V souborech s definicí JSF view nelze používat scripletové komentáře no a html komentáře budou vidět ve výsledné stránce. Pokud nenastavíte facelet, aby je přeskakoval.

<context-param>
	<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
	<param-value>true</param-value>
</context-param>

Cancel

Storno tlačítko pro odchod z obrazovky překvapivě volá validace v případě jejich selhání vám nedovolí odejít. Vyřešíte nastavením atributu immediate=”true”. Pro reset formuláře má PrimeFaces šikovnou komponentu resetInput

Validace

Vstupní formulářové políčka mají atribut maxlength omezující maximální délku. To funguje, ale při stylu práce ctrl+c a ctrl+v vám nadbytečné znaky tiše ořízne. Řešením je validátor

<f:validateLength maximum="254" for="myField" />

Nejspíš budete řešit i zobrazení validačních hlášek přes komponentu messages Globální rozchodíte jistě hned, ale nezapomeňte u command buttonu přidat atribut update=”form_id”, který zajistí aktualizuje hodnoty zpráv u jednotlivých formulářových políček.

Verzování skriptů

Již dříve jsem psal, že máte verzovat skipty. Jsf zvolilo nešikovnou cestu přes adresáře. Např. /resources/css/1_0_2 Lze se tomu vyhnout (adresář neměnit), sice nepěkným, ale funkčním zápisem.

<link 
href="#{request.contextPath}/javax.faces.resource/screen.css.xhtml?ln=css&v=#{initParam['applicationVersion']}"
rel="stylesheet" type="text/css" />

Výkon

Spíš dříve než později si všimnete, že se gettery volají až příliš často. Pokud by managed beany byly obyčejné POJO, tak by to nevadilo, ale možná jste provolávali přes servisní vrstvu databázi, ne? Takže si výsledek budete cachovat do fieldu, který je ale pak někdy potřeba přenačíst… Podrobněji Why JSF calls getters multiple times.

Literatura

Papírově i pro kindle je dostupná kniha PrimeFaces Cookbook. Máte-li ji, přečtěte si, jinak můžete ušetřit a projít si jen příklady z knihy.

Závěr

V JSF lze obyčejné formuláře nabušit rychle a PrimeFaces vám poskytnou pěkné komponenty. I když se zpoplatněním můžou přijít o popularitu. Narazíte-li na něco nestandardního, znamená to mnohdy zásek a složité dohledávání, jak věci fungují. V té chvíli blahořečíte JSP, i když jen do té doby, než byste tam měli ručně zapojovat podobný ajaxový šavlostroj. Ideální řešení prostě neexistuje.