pondělí 21. dubna 2008

Informace o WebBeans

O víkendu jsem shlédl video, ve kterém Gavin King přednášel o WebBeans. Z daného videa mám vcelku dobrý pocit a pokusím se zjednodušeně sepsat, co v přednášce bylo a jak asi bude vypadat psaní takových Web Beans.

Web Beans jsou novou specifikací, která se objeví v Java EE 6. Mezi hlavní účel patří zjednodušení vývoje webových aplikací. Samotné Web Beans jsou inspirovány (kopie) webového frameworku Seam. Jelikož je autorem jeden a tentýž člověk (Gavin King), je vcelku jasné, že lidé, kteří znají Seam budou na Web Beans přecházet stejně jednoduše jako třeba v případě Hibernate -> JPA.

Takže, co například Web Beans poskytují a nabízejí:

  • možnost psát komponenty jako Stateful EJB, které se anotací vystaví jako Web Beans se všemi vlastnostmi Stateful EJB

  • dependency injection, jednoduché vstříknutí do JSF stránek; tak jako v Seamu

  • konverzace

  • ovládání persistence context, která může např. řešit lazy loading

  • integrace s JSF, Servlety či JPA

  • JSF backing beana může být vystavena jako Web Beana

  • atd.


Nikoho asi nepřekvapí, že samotné Web Beans jsou řízeny pomocí anotací. Samozřejmě opět existuje možnost používat xml, ale myslím, že tato volba bude zřídkakdy využívána a nejsem si jist, že všechny možnosti budou v xml obsaženy.

Jak tedy takové Web Beans vypadají? Příkladem může být jednoduchá komponenta:
@Component
public class Komponenta {
public String pozdrav(String jmeno) {
return "Ahoj " + jmeno;
}
}

Samotnou anotací @Component označujeme, že se jedná o Web Bean komponentu. Kontejner nám takovouto třídu inicializuje jako Web Beanu. Nic převratného.


Dependency Injection

Při psaní definování závislosti mezi jednotlivými komponenty můžeme použít několik možností:
@Component
public class Printer {
@Current Komponenta komponenta;

public void pozdrav() {
System.out.println(komponenta.pozdrav("Ales"));
}
}

Další možností, jak definovat závislost je např:
@Component
public class Printer {
private Komponenta komponenta;

public Printer(Komponenta komponenta) {
this.komponenta = komponenta;
}

public void pozdrav() {
System.out.println(komponenta.pozdrav("Ales"));
}
}

Gavin tento způsob názývá "constructor injection" :)

Aby toho nebylo málo, máme zde další možnost nazvanou "initializer injection":
@Component
public class Printer {
private Komponenta komponenta;

@Initializer
initKomponent(Komponenta komponenta) {
this.komponenta = komponenta;
}
}


A nyní jednoduché vstříknutí do JSF stránky:


Další věcí, která stojí za zmínku je definování "binding type". Jde o to, že mohu vzít komponentu, tu podědit a při stríknutí závislosti chtít podědenou komponentu. No raději to předvedu :)

Definice vlastniho "binding type":
@BindingType
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER}}
public @interface Casual{}

Nyní již stači napsat vlastní komponentu dědicí moji "komponenta".
@Casual
@Component
public class Cau extends Komponenta {
public String pozdrav(String jmeno) {
return "cau " + jmeno;
}
}


A nyní již vstříknu vlastní komponentu do Printeru.
@Component
public class Printer {
@Casual Komponenta komponenta;

public void pozdrav() {
System.out.println(komponenta.pozdrav("Ales"));
}
}

Výsledkem bude: "Cau Ales".


Věcí, které Gavin King představil je opravdu hodně. Já zde ukážu poslední věc, která je jistě neméně zajímavá.

Nazval bych to "zástupnými anotacemi". Jak jsem na začátku psal, Web Beans jsou řízeny pomocí anotací, což ovšem může vyvolat určité rozpaky ve chvílích, kdy samotná Web Beana bude obsahovat hromadu anotací, které se často opakují.

Představme si, že máme takovouto Web Beanu:
@Component
@Transactional
@Production
@Secure
public class Komponenta {}

Výčet anotací může být i delší, což mě trochu děsí :)

Je však možné použít následující:
@Secure
@Transactional
@Named
@Production
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface Action {}

A nyní již použít:
@Action
public class Komponenta {}



Alespoň že tak :)

Všem, kteří se alespoň trochu zajímají o nové specifikace v oblasti J2EE by si měli dané video prohlédnout.
Já osobně jsem si alespoň udělal lepší obrázek o tom, jak vlastně WebBeans budou vypadat.

Zatím musím uznat, že jsem nadmíru spokojen. Pokud bude vše tak, jak Gavin King ukazuje, asi pošlu jeho Seam do věčných lovisť :) Nenarazil jsem v podstatě na nic podstatného, co by Seam měl a WebBeans nikoli. Zatím to vypadá na pravý opak.

neděle 20. dubna 2008

Richfaces pro JSF

Komponentový framework jakým je JSF, má několik kladů, mezi kterými také nalezneme možnost rozšíření o vlastní komponenty. I když psaní vlastních komponent pod JSF není zrovna triviální záležitost.

JSF ve verzi 1.2. nabízí základní komponenty, které mohou být i rozšířitelné, ovšem ne vždy nám vyhovují.  Existence různorodých komponent za nás řeší knihovny třetích stran, které nabízejí zajímavé možnosti. Mezi nejčastějšími požadavky na komponenty jsou různé formulářové objekty, modální panely, stromy, menu, tabulky, atd. Navíc je očekávána podpora AJAXu. Jinými slovy, komponenty, které se svou vizuální a funkční podobou blíží desktop aplikacím.

Pro srovnání různých komponentových knihoven můžeme použít např. AJAX JSF Matrix. Možnost výběru je skutečně obrovský a to nepočítám další, které vznikají téměř každý den.

Samotná volba není zrovna jednoduchá. Já jsem prošel asi 3 různé knihovny z nichž jsem si vybral jasného favorita: RichFaces.

RichFaces

RichFaces má v současné době v  rukou JBoss. Jedná se klasickou JSF komponentovou knihovnu, která ovšem navíc obsahuje i přímou vazbu a podporu A4J (Ajax4JSF). A4J, jak už její název vypovídá se zaměřuje čistě na AJAX a snaží se naučit JSF komponenty asynchroní práci. Jelikož je RichFaces společně s A4J dodávaná jako jedna knihovna (projekt), může nás těšit fakt, že máme jednu z nejlepších kombinaci mezi AJAX-JSF-Komponenta.

V současné době je RichFaces ve verzi 3.2.0, která vyšla vcelku nedávno. Mezi jejími novinkami můžeme najít věci jako: vlastní combo box, progress bar, file upload, atd.

I když je pravda, že s každou novou verzí můžeme nalézt v bugtraceru hromadu opravených a hromadu nový bugů, přesto je tato knihovna použitelná v produkčním nasazení.

Mě nezbývá, než tuto knihovnu doporučit všem, kteří nemají svého favorita a hledají nejakou slušnou podporu pro JSF komponenty. Psát modální okna, kontextová menu či rozbalovací stromy už nemusí být jen výsadou programátoru desktop aplikací.

Pro zběžný přehled doporučuji samotné demo, které je plně přístupné po zaregistrování na RedHat stránkách, kde si jednotlivé vlastnosti můžete ihned vyzkoušet.