Představení aplikačního frameworku JBoss Seam
February 17th, 2008
V rámci tzv. čtvrtletního motivačního plánu, který každý
zaměstnanec naší firmy
pravidelně plní, jsem si dal jako jeden z úkolů podívat se na zoubek
opěvovanému frameworku JBoss Seam a obeznámit s ním následně
i své kolegy. Stručné představení tohoto frameworku ve formě článku,
který jsem v té souvislosti napsal a uveřejnil na firemním intranetu, se
může třeba hodit i někomu jinému, proto jej publikuji i zde na svém
blogu. V češtině přece jen moc materiálů o Seamu k dispozici
zatím není.
Integrační framework
Softwarové frameworky jsou výborná věc. Zapouzdřují návrhové vzory, znovupoužitelné komponenty a nejrůznější služby. Usnadňují programátorům práci. V jednom projektu ale architekt zpravidla používá frameworků hned několik, často i desítky. Nevyhnutelným vyústěním jsou pak nezanedbatelné kusy programového kódu (Data Transfer Objects, správa komponent, atd.), který nemá co do činění s logikou samotné aplikace, ale pouze umožňuje použitým frameworkům koexistovat a spolupracovat. Projekt pak také obsahuje velké množství rozsáhlých XML konfiguračních souborů, jejichž velikost roste rychlým tempem přímo úměrným s rozvojem funkcí aplikace.
Příkladem takových frameworků, které v Java Enterprise aplikacích používáme jsou např. Hibernate, Spring, Struts, příkladem dalších frameworků v podobě implementací standardů jsou např. Servlet/JSP, JSF, EJB, JMS, JTA, JCA, Web Services, atd. Hlavní náplní práce Java EE programátora je tedy především zvládnout všechny tyto frameworky a práci s nimi.
Problémem tolika frameworků je ale skutečnost, že každý z nich poskytuje jiný programový model, odlišné pojetí práce s komponentami. Právě proto existují tzv. integrační frameworky, které usnadňují práci s ostatními frameworky v enterprise aplikaci.
Jedním z takových frameworků je právě JBoss Seam. Specifikuje nezbytné „lepidlo“ mezi jednotlivými vrstvami aplikace. Hlavní úlohu této skládačky hrají dva základní standardní JEE frameworky a to EJB (Enterprise Java Beans) pro aplikační vrstvu a JSF (Java Server Faces) pro prezentační vrstvu.
Duchovním otcem a hlavním vývojářem Seamu není nikdo menší než Gavin King, autor objektově relačního nástroje Hibernate a vedoucí specifikační komise pro WebBeans, které budou hrát v příštích letech první housle v oblasti webových aplikací postavených na stacku Java EE v následující verzi 6.
Co je třeba kromě Seamu dále nastudovat
Z technologií určených pro psaní views je možné v Seamu používat v podstatě dvě. Jednak JSP stránky a jednak Facelets. Použití JSP je však již považováno za přežitek a všechny knihy a články o Seamu používají a doporučují výhradně Facelets.
Jedná se o intuitivní „šablonovací“ systém, který je radost používat. Disponuje jednoduchou strukturou (v podstatě obyčejná XHTML stránka s funkčními tagy navíc, žádné importy a další složitosti jako u JSP), inteligentním výpisem chyby, viz. příklad (ne jako v JSP, kde je třeba procházet Java stacktrace, aby se programátor dopátral chyby), přehledným zápisem (který je však s JSP stránkou s JSTL značkami velmi podobný), nezávislostí na výstupním formátu (XML, XHTML, SOAP, PDF, WML,…) a v neposlední řadě rychlostí – nedochází k překladu na servlet jako u JSP.
Vytvořit funkční kostru Seam aplikace není žádná legrace. Seam aplikace potřebuje ke svému běhu mnoho knihoven přesně daných verzí (navíc ve spojitosti s JSF, jejichž některá implementace bývá již v aplikačním serveru a Apache MyFaces a Sun Reference Implementation nefungují kompatibilně prostou záměnou, dále pokud chce programátor používat i další podpůrné knihovny jako JBoss Drools, AJAX knihovny, atd) a mnoho konfiguračních souborů, viz. dále. Hledal jsem tedy co nejjednodušší způsob, jak takovou kostru vytvářet. Podpora pro Maven je zatím v plenkách a vhodný použitelný Maven archetype jsem neobjevil. Aplikace seam-gen, jež je součástí distribuce Seamu, a která by měla kostru vygenerovat, zase na druhou stranu podporuje pouze sestavování a deploy pomocí nástroje ant, což není zcela ideální řešení.
Nakonec jsem skončil u vynikajícího Seam pluginu z JBoss Tools (sada pluginů do Eclipse IDE), který nejen že krásně vygeneruje kostru aplikace s oddělenými projekty pro EAR, EJB, WEBAPP a všechny potřebné konfigurační soubory a hlavně knihovny, ale navíc jeho struktura podporuje deploy možnosti Web Tools Platform a celý projekt je tak pohodlně nasaditelný do aplikačního serveru JBoss přímo z Eclipse jediným kliknutím.
Stavový framework
Jako svou hlavní devizu prezentuje Seam tzv. správu stavovosti (Stateful Management). Snaží se za programátora řešit problém bezestavového HTTP protokolu a poskytuje pro tento účel mnoho prostředků.
Michael Yuan: Today's „stateless“ architectures are very awkward and hard to use. It is time to deprecate the stateless architecture!
Filozofie frameworku Seam je postavena na stavových EJB komponentách (Stateful EJB Session Beans), které byly a stále jsou považovány za cosi „nepohodlného“ pro běžné použití v enterprise Java aplikacích. Autoři Seamu však tento zvyk boří coby mýtus a naopak vyzdvihují výhody používání stavových EJB komponent oproti bezestavovým EJB komponentám, kdy je kompletní stav v aplikaci uchováván v HTTP session a v databázi. Programový model Seam aplikace se naopak snaží minimalizovat ukládání dat do HTTP session (tím odpadá problém s memory leaks v dlouhotrvající session) a také minimalizovat přístupy do databáze v průběhu jedné „konverzace“ kvůli rychlosti (konverzace jako pojem v Seamu, viz. dále).
Svůj úspěch staví Seam na anotacích. Odbourává nutnost programování tradičního controlleru z MVC návrhového vzoru tak, že JSF stránkám tvořícícm view umožňuje podstrčit místo klasických JSF Backing Beans přímo JPA entity jako model a EJB Session Beany jako Event Handlery (tzv. koncept Unified Components). Veškerou tuto funkcionalitu poskytuje „out-of-the-box“ po dodání několika anotací EJB komponentám.
Co to všechno vlastně umí
Framework Seam obsahuje velké množství funkcí, které může programátor ve svých aplikacích využít. Jejich podrobný popis obsahuje např. kniha [1], která je k dispozici ve Státní technické knihovně, odkud jí mám zapůjčenou. Kniha má cca 400 stran, popsat zde všechny vlastnosti Seamu tedy není možné. Zde se omezím pouze na stručné seznámení hlavních rysů s jednoduchými příklady použití.
Výčet hlavních vlastností Seamu
Aplikační část
- správa komponent a jejich stavu v různých scopech/kontextech
- injekce, outjekce a bijekce komponent
- podpora aplikačních konverzací a tzv. konverzačního kontextu
- správa transakcí a výjimek
- jednou pro vždy vyřešení lazy loadingu (extended Entity Manager), už nikdy více ohavná LazyInitializationException
- podpora tzv. workspaces umožňující autonomní funkci aplikace ze dvou záložek téhož browseru (conversation-id)
- podpora integrace řízení aplikace business procesy pomocí frameworku JBoss jBPM
- podpora pro JBoss Drools a autorizaci pomocí tzv. sémantických pravidel
- jednoduché programování CRUD databázových aplikací, resp. CRUD operací nad entitami (vytvoř / získej / aktualizuj / smaž) v podobě předpřipravených tříd a komponent v tzv. Seam CRUD Application Framework
- podpora pro EJB3 komponenty stejně tak jako obyčejné POJO objekty, aplikační komponenty nemusejí být EJB a aplikace tak může bez problému běžet i v běžném Servlet Containeru, např. Tomcat či Jetty.
- podpora pro testování, obsahuje embedded JBoss a integraci testovacího
frameworku TestNG, pomocí embedded JBossu je možné rozjet EJB3 aplikaci
i pod Tomcatem – nastává tak zvrácená kuriozita, že JBoss běží
v Tomcatu

- Seam komponenty pro integraci JSF a EJB3 z hlediska uživatele, např. injekce Faces Messages pro předání zpráv z EJB uživateli, už žádné pomocné ValidationException pro předání zprávy z aplikační do prezentační vrstvy
Prezentační část
- vylepšení JSF o sadu ready-to-use komponent a UI tagů
- JBoss EL – vylepšení Unified Expression Language o další možosti, např. je možné volat ve view libovolné metody z backing bean komponenty
- Seam filter, automatická správa request parametrů a trigger akcí při zobrazení JSF stránek
- podpora pro Facelets jako view technologii
- automatické vystavování kolekcí dat jako DataModel JSF tabulek (tzv. Seam Data-Binding Framework)
- podpora pro generování PDF, e-mailů a formátovaných výstupů (Rich Text)
- propojení validací modelu s prezentační vrstvou (projekce Hibernate validátorů do JSF formulářů)
- koncept tzv. Bookmarkable Web Pages, jednoduše je možné vytvořit stránky aplikace odpovídající REST konceptu
- příjemnou možnost nastavení vlastních chybových stránek pro jednotlivé typy vyjímek
- pohodlný vývoj díky přehledné debug stránce JBoss Seam Debug Page s konfigurovatelným obsahem (přehled zahájených konverzací, kontexty jednotlivých scopes, přhledný výpis výjimek i s příčinami atd.)
- podpora pro JBoss AJAX RichFaces knihovnu (pěkné UI komponenty, widgety, AJAX validace atd.) a další AJAX frameworky jako např. ajax4jsf, ICEfaces, a jiné
Kostra Seam aplikace
Ať už dojde k sestavení výsledné aplikace přes ant, seam-gen, maven, Web Tools anebo třeba ručně, výsledná podoba EAR archivu se základní sadou knihoven pro Seam aplikaci, bude vypadat takto:
mywebapp.ear
|- app.war
|- web pages (*.xhtml Facelets)
|- CSS
|- images
|- WEB-INF
|- web.xml - web deployment descriptor
|- faces-config.xml - standard JSF configuration
|- navigation.xml - JSF page navigation rules
|- components.xml - Seam specific options
|- pages.xml - Seam pages settings (page flow, actions)
|- lib
|- jsf-facelets.jar - Facelets library
|- jboss-seam-debug.jar - Seam Debug library
|- jboss-seam-ui.jar - Seam UI libary
|- antlr.jar - tag support
|- app.jar
|- Java classes
|- seam.properties - prázdný, existuje-li, hledá Seam komponenty
|- META-INF
|- persistence.xml - JPA settings
|- ejb-jar.xml - EJB deployment descriptor
|- jboss-seam.jar - Seam Core library
|- jboss-el.jar - JBoss Expression Language
|- el-api.jar - Expression Language API
|- el-ri.jar - Expression Language Reference Impl.
|- META-INF
|- application.xml - Mail EAR deployment descriptor
|- jboss-app.xml - JBoss specific descriptor
Aplikace předpokládá nasazení na aplikační server JBoss 4.2, ten již obsahuje implementaci JSF, proto nemusí být součástí aplikačního archivu. JBoss 4.2 obsahuje v adresáři server/default/deploy/jboss-web.deployer/jsf-libs implementaci JSF Sun RI (Reference Implementation), na rozdíl od verze 4.0, kde byly přibaleny Apache MyFaces. Na to je tedy třeba dávat pozor při sestavování web.xml descriptoru.
Zajímavé vlastnosti podrobněji
Zde se pokusím vypíchnout vlastnosti, které mi při objevování Seamu přišly jako nejvíce zajímavé.
Spojení EJB3 komponenty a JSF stránky
Spojení aplikační a prezentační vrstvy nebylo nikdy jednodušší. Žádný obligátní lookup EJB komponenty nebo nahrávání dat z JPA entit do formuláře před Data Transafer Object. Stránka JSF za pomocí fragmentu Facelets vypadá následovně:
Tvoje jméno: <h:inputText value="#{osoba.jmeno}"/>
<br/>
Ahoj #{osoba.jmeno}
<br/>
<h:commandButton type="submit" value="Vypiš" action="#{manager.processPerson}"/>
Kde další třídu tvoří standardní JPA entita Person, která je anotovaná pomocí @Entity a @Name(„osoba“) a dále jedna EJB3 Session Bean:
@Stateless
@Name("manager")
public class ManagerAction implements Manager {
@In @Out
private Person person;
public String processPerson {
// nejaka akce s osobou
}
}
Na výše uvedeném příkladu je vidět i použití tzv. bijekce, tj. současné použití anotace pro injekci a outjekci objektu do EJB komponenty.
Návratová hodnota String metody processPerson je standardně dle specifikace JSF event handleru klíčem do JSF Page Flow a udává, na jakou JSF stránku má být uživatel přesunut.
Seam komponenty a dostupné kontexty
V čem je Seam opravdu silný jsou scopy/kontexty pro Seam komponenty, je jich celkem sedm:
- Stateless – bezestavové komponenty
- Event – průběh jednoho JSF requestu
- Page – komponenta vztažená ke stránce, je přístupná během všech akcí odeslaných z jedné JSF stránky
- Conversation – jádro Seamu, konverzace = série requestů za účelem předem daného cíle, blíže viz. následující kapitola
- Session – správa jako http session objekt, platné po dobu platnosti session
- Business process – tento kontext dlouží pro dlouhotrvající business procesy spravované pomocí JBoss jBMP frameworku, tento kontext může být rozprostřen dokonce mezi více uživatelů
- Application – globální kontext držící statické informace, není vztažen k webovým uživatelům
Stavovost komponent
Koncept „stavovosti“ se prolíná celým Seamem. Stavové nemusejí být jen EJB komponenty, ale také entity. Pokud potřebujeme, aby naše entita Osoba žila v rámci celé HTTP Session, stačí ji napsat jako:
import static org.jboss.seam.ScopeType.SESSION;
@Entity
@Name("person")
@Scope(SESSION)
public class Person implements Serializable {
...
}
A je hotovo, žádné ruční laborování s atribury HTTP Session kontextu. Všechny injekce a outjekce s touto entitou se nyní budou dít v session kontextu.
Stavové komponenty mimo jiné také eliminují vliv tlačítka Zpět v prohlížeči. Nikdy se nestane, že by uživatel po kliknutí na tlačítko „Zpět“ dostal neplatný stav aplikace.
Seam konverzace
Pojem konverzace je velkou předností frameworku Seam. Dovoluje nám programovat webovou aplikaci jako by vůbec neexistoval bezestavový HTTP protokol.
Konverzaci (tzv. Long Running Conversation) nazýváme souslednost několika requestů, které v konečném důsledku tvoří celek, mají nějaký cíl. Takovým cílem může být odbavení nákupního košíku, dokončení vyplňování wizardu nebo odsouhlasení výberu rezervace hotelu.
Konverzace je řízena anotacemi, komponenta je označena jako @Conversational a metody spouštějící a ukončující konverzaci jako @Begin a @End. Během konverzace jsou automaticky dostupné objekty v kontextu konverzace.
Seam obhospodařuje také tzv. konkurentní konverzace (Concurrent Conversations) a zavádí pojem Workspace. V jednom browseru na více záložkách je tak možné v téže webové aplikaci provádět více konverzací a tak např. provádět booking několika hotelů nezávisle. Pro každou záložku je založena vlastní konverzace. Toto je možné díky přesunu stavovosti z HTTP Session do stavové EJB komponenty. K jednotlivým Workspaces je možné i programově přistupovat.
Validace vstupních dat
Tato featura mě doslova nadchla. Nikdy mě nenapadlo, že validace vstupních dat vlastně píšeme dvakrát! Jednou ve formě constraintů u vlastností entit a podruhé ve formě validátorů formulářových polí.
Seam přináší možnost práci si ušetřit. Validační kritéria z entit přenáší do JSF formulářů. Formulářové značky stačí pouze uzavřít do tagu <s:validate/> a práce je hotova. Stránky JSF automaticky prováději validace definované na datovém modelu.
Pro tento účel využívá Seam knihovnu Hibernate Validators, kde jsou implementovány všechny potřebné anotace od @Length, @Max, @Min, přes časové @Past, @Future, specializované jako @Email, @Size, @Range až např. po nastavitelný @Pattern.
Jednoduché CRUD aplikace
Velkou část kódu na každém projektu tvoří CRUD (Create, Retrieve, Update a Delete) operace. Programátoři řeší tuto úlohu pomocí návrhového vzoru DAO (Data Access Object). Protože jsou takové DAO objekty v podstatě neustále dokola se opakující kusy kódu, obsahuje Seam přepřipravené komponenty pro jejich stavění.
DAO objekt pro naší Osobu můžeme tedy naprogramovat pouhým poděděním EntityHome třídy Seamu, anebo jej dokonce nadefinovat deklaratorně v XML souboru (components.xml). Pro tento účel stačí jen aplikaci správně nakonfigurovat, v tomto případě přidat do faces-config.xml tzv. phase-listener ve forměTransactionalSeamPhaseListener třídy. Ten poskytuje Entity Manager spravovaný Seamem a veškeré CRUD operace za nás tak Seam provede na základě deklarované DAO komponenty automaticky.
Integrace business procesů ve webové aplikaci
Business procesy a pravidla jsou jádrem asi většiny enterprise aplikací. Procesy jsou často definovány analytikem, tedy neprogramátorem. Jsou vyjádřeny formou grafů, přechodů a pravidel pomocí specializovaného software. Aplikační programátor pak převede procesy do programu. Analytik pak ale těžko pozná, jestli programátor všechna pravidla a procesy převedl doprogramové podoby korektně.
Zde nastupuje Seam a jeho integrace s jBPM, Business Process Management řešením z dílny JBoss. Jeho popis je vysoce nad rámec tohoto článku a tak jen stručně.
V podstatě jde o to, že ve webové aplikaci může programátor specifikovat UI akce (např. klik na tlačítko), která spustí nějaký business proces. Metodu reprezentující daný UI event handler stačí pouze označit anotací @CreateProcess. Business procesem rozumíme obvykle nějaký úkol, sled událostí, který musí být provedeny v daném pořadí různými uživateli. Pomocí anotací @BeginTask a @EndTask lze anotovat metody, které startují nebo ukončují určitý úkol. Jakmile je nějaký úkol dokončen, ví jBPM přesně dle definice procesu kam aplikaci posunout, jaký úkol jakými uživateli je třeba provést tak, aby se proces posunul směrem je svému cíli.
Školní příklad implementace procesu objednávky vstupenky asi netřeba blíže popisovat:
@Name("ticketSystem")
public class TicketSystemAction {
@CreateProcess(definition="TicketProcess")
public String newTicket() {
...
return "home";
}
@BeginTask
public String reply() {
...
return "reply";
}
@EndTask
public String sendAnswer() {
...
System.out.println("Answered");
return "home";
}
}
Seam dále obsahuje speciální UI značky, které umožňují vypisovat informace o procesech, jejich stavu atd.
JBoss Expression Language
Chválihodný počin přináší Seam také ve vylepšení standardního Unified Expression Language z JSP a JSF.
Významný posun je především ve volání metod na Backing Bean komponentě z view. Kromě standardních getterů pomocí tečkové notace je možné volat libovolnou metodu a té navíc přímo z view předávat parametry. Už žádné pomocné beany pro zapouzdření strukturovaných dat k zobrazení.
Plugin v JBoss Tools umožňuje navíc autocomplete funkci v EL výrazech Facelets stránky, což posunuje komfort programátora o úroveň výše v porovnání s kódování JSP stránek v jiných frameworcích. JBoss EL je možné navíc v Seamu použít téměř všude, nejen v UI, stává se jakýmsi univerzálním vyjadřovacím prostředkem, je možné jej použít k definici parametrů např. v OQL dotazech, v XML konfiguračních souborech nebo v pravidlech JBoss Rules.
Podpora pro PDF a e-maily
Seam obsahuje ve svých knihovnách jboss-seam-pdf.jar a jboss-seam-mail.jar podporu pro pohodlné vytváření PDF, resp. emailů v aplikaci.
Pro vytváření PDF se využívá knihovna iText. Seam obsahuje sadu UI značek, s nimiž je možné nadefinovat Facelets stránku, kterou pak Seam převede do PDF formátu. Ve stránkách je možné využívat všech výhod Seam Expression Language atd. Odpadá tedy použití dalšího šablonovacího frameworku pro definici stránek (např. FreeMarkeru). Jednoduchá Facelets stránka pro vygenerování PDF:
<p:document title="Testováni PDF" author="Lukáš Kubásek">
<p:image alignment="right" wrap="true" value="/obr.jpg" />
<p:font size="12">
<p:paragraph spacingBefore="16" spacingAfter="40">
Objednávka #{currentOrder.orderId}
</p:paragraph>
</p:font>
</p:document>
Plánovač a asynchronní zpracování
Pokud je třeba stavět aplikaci mimo EJB kontejner (pomocí POJO v Tomcatu) a programátor tak nemá k dispozici funkce EJB3 timeru, přichází Seam s podporou Quartz Scheduleru a asynchronního spouštění akcí.
Vše je opět řízeno elegantně anotacemi:
@Asynchronous
public QuartzTriggerHandle schedulePayment (
@Expiration Date when,
@IntervalCron String cron,
@FinalExpiration Date stoptime) {
// vlastni implementace
}
Řízení autorizace na základě pravidel
A jako třešnička na dortu je pro účely autorizace k dispozici integrace s frameworkem JBoss Rules (dříve známé jako Drools). Jedná se o tzv. koncept Rule-Based Security.
Problémem klasických webových aplikací je roztříštěnost informace o povolených uživatelích a uživatelských rolích na mnoha místech. Udržování autorizace je pak věcí nesnadnou. V konfiguračním XML souboru použitého webového frameworku (např. Jumanji) označit akce, na které má ta či ona role právo, podmíněně zobrazit ve view odkazy/ikony/části stránek dle aktuální role uživatele a dále a to především označit anotacemi business metody v aplikační vstvě. Často jsou navíc různě po aplikaci (jak v UI metodách tak v business metodách) roztříštěné programové autorizace na základě nějaké jednoduché logiky naprogramované v Javě.
Seam a potažmo framework JBoss Rules přichází s myšlenkou tzv. pravidel (Rules), které určují atomické akce. Např. „uživatel může prohlížet historii“, „uživatel může editovat smlouvu“ atd. Tato pravidla, jednou na začátku vydefinovaná, se pak používají napříč aplikací pro výše uvedené účely. Seam má samozřejmě příslušnou programovou podporu k dispozici, např.:
@Stateful
@Name("manager")
public class ManagerAction implement Manager {
@Restrict#{s:hasPermission('manager', 'editContract', null)}
public String editContract(Contract contract) {
// kod
}
}
Výše uvedené volání lze i zjednodušit, framework automaticky doplní jako parametry volání s:hasPermission název komponenty a metody, takže stačí napsat:
@Stateful
@Name("manager")
public class ManagerAction implement Manager {
@Restrict
public String editContract(Contract contract) {
// kod
}
}
Konfigurační soubor JBoss Rules pak obsahuje pravidlo:
rule CanUserEditContract
when
c: PermissionCheck(name == "manager", action == "editContract")
Role(name == "admin")
then
c.grant()
end;
Název pravidla může být libovolný. Napojení na pravidlo je totiž právě přes parametry volání s:hasPermission.
Tato pravidla lze samozřejmě použít i na prezentační vrstvě. Informace o autorizaci jsou tedy uložena díky Drools na jednom místě v jednom konfiguračním souboru pravidel.
Seam verze 2.0
Poslední verzí Seamu, která byla uvolněna koncem roku 2007, je verze 2.0. Obsahuje spoustu dalších novinek a jen dokládá, jak projekt žije a na co dál se můžeme těšit. Novinek je dle oficiální zprávy přes 300, takže zde jen několik nejzajímavějších:
- Webové služby – libovolná Seam komponenta může být webovou službou, ve WS navíc fungují konverzace
- Groovy – Seam komponenty mohou být psány v jazyce Groovy
- Hot Deploy – doplněna možnost hot-deploye Seam komponent aniž by bylo třeba restartovat celý WAR / EAR archiv. Tuto featuru jsem zatím nezkoušel, ale jsem opravdu zvědav, až se pokusím tuto věc rozjet. Údajně by měly být komponenty při zapnutí debug režimu načítány speciálním Seam Class Loaderem…
- Odstranění závislosti na JSF – od této verze by mělo být teoreticky možné napojit další webové frameworky místo JSF, existuje experimentální podpora Google Web Toolkit a další budou následovat
- Podpora nových vlastností JSF 1.2, další vylepšení v JBoss Expression Language
- Integrace dalších knihoven, např. Hibernate Search nebo JFreeChart pro přímou podporu generování grafů do PDF
- Vylepšená podpora pro Eclipse ve formě stále se vyvíjejícího JBoss Tools pluginu
Budoucnost Seamu a zhodnocení
Výše uvedený text jistě nemůže nikoho nechat na pochybách, že se jedná o progresivní a živý projekt. Možnosti, které nabízí, jsou vskutku oslnivé a programátorům zase o kousek usnadní cestu k pohodlnému vývoji Java Enterprise aplikací.
Znalost Seamu do budoucna nemůže zůstat znehodnocena. Už jen proto, že autor Gavin King je vedoucí specifikační komise pro WebBeans, což bude standardní rozhraní pro psaní webových aplikací nad budoucí verzí Java Enterprise Edition 6. WebBeans dle prvních draftů ze Seamu vycházejí a osoba Gavina Kinga je důkazem toho, že se máme opravdu na co těšit.
Abychom jen nechválili, odpůrci vytýkají přístupu Seamu jednu důležitou věc a to porušení architektury vrstev JEE aplikace. Pravidlem bývá, že závislosti jdou jen jedním směrem. Vyšší vrstva (v tomto případě aplikační EJB vrstva) by neměla nic vědět o tom, že je pod ní nějaký Seam. A přesto se EJB komponenty i entity hemží Seam anotacemi a mnohdy i JSF objekty (např. možnost injekce FacesMessages objektu do EJB komponenty).
Diskusí na toto téma jsou na Internetu tisíce, zatím se však zdá, že
příznivců je více, než odpůrců. Já osobně však stojím spíše na
straně Seamu a fandím mu. Striktní oddělení vstev je sice počinem
chválihodným, ale v případě většiny aplikací pouze zvyšuje
náročnost, složitost a nepřináší žádné kvalitativní zlepšení.
Teoretické úvahy typu „a co kdybychom jednou někdy v budoucnu
chtěli…“ mají svou váhu, ale váha rychlého a pohodlného vývoje
aplikace teď hned u mě vítězí ![]()
Použitá literatura
[1] Michael Juntao Yuan, Thomas Heute: JBoss Seam, simplicity and power beyond Java EE, Prentice Hall, Crawfordsville, Indiana, 2007.
[2] JBoss Seam Reference and Tutorial:
http://docs.jboss.com/seam/latest/reference/en/html/
[3] JBoss Seam Wiki: http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossSeam
[4] JBoss Seam article on TheServerSice.com:
http://www.theserverside.com/tt/articles/article.tss?l=JBossSeamFramework
[5] Facelets Reference:
https://facelets.dev.java.net/nonav/docs/dev/docbook.html

diky, ja takovy strucny uvod uvitam. Kdyz to (nejake tema, technologii, aby nevznikly dohady) clovek potrebuje, neni cas se to ucit, je potreba uz znat. Kdyz se mate ucit do zasoby „az to bude potreba“, muze to byt ztraceny cas a ten taky neni.