JSF 2.2 Faces Flow ja HTML5 friendly layout

Odotellessa tulevaa Java EE 7 sekä Java SE 8 standardia olen seuraillut yksittäisten spesifikaatioiden kehitystä. Yksi mielenkiintoinen päivitys on Java EE 7:n tuleva JavaServer Faces 2.2 versio. Se on näennäisesti taas minor update, eli ei arkkitehtuurin uusintaa kuten aikanaan 2.0 päivitys – mutta pienet päivitykset kasaantuvat aika mielenkiintoisesti.

Mitäpä on odotettavissa JSF 2.2 versiossa? Yksi kiintoisa piirre on Wicket-frameworkin tapainen mahdollisuus käyttää HTML5 pohjaa ja id attribuutteja aiemman tag-mallin sijasta. Tässä esimerkki uudesta JSF 2.2 leiskasta tähän tapaan tehtynä:

< !DOCTYPE html>
< html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:jsf="http://java.sun.com/jsf" xmlns:f="http://java.sun.com/jsf/core">
    < head jsf:id="head">
        < title>Putting it all together < /title>
        < script jsf:target="body" jsf:name="js.js"/>
        < link jsf:name="css.css" rel="stylesheet" type="text/css" />
    < /head>
    < body jsf:id="body">
        < form jsf:id="form" jsf:prependId="false">
            < label jsf:for="name">Name < /label>
            < input jsf:id="name" type="text" jsf:value="#{complex.name}">
                < f:ajax execute="@this" render="progress"/>
            < /input>
            < label jsf:for="tel">Tel < /label>
            < input jsf:id="tel" type="tel" jsf:value="#{complex.tel}">
                < f:ajax execute="@this" render="progress"/>
            < /input>

            < label jsf:for="email">Email < /label>
            < input jsf:id="email" type="email" jsf:value="#{complex.email}">
                < f:ajax execute="@this" render="progress"/>
            < /input>

            < label for="progress">Progress < /label>
            < progress jsf:id="progress" max="3">#{complex.progress} of 3 < /progress>

        < /form>
    < /body>
< /html>

Kiintoisaa? Miksei, onhan se. Toinen itseä kiinnostava tutkaan osunut piirre on JSF Faces Flow. Idea on itselle tuttu Spring Web Flow moduulin puolelta – sensijaan että navigointisäännöt naputellaan sivuihin, määritellään sivuilla liikkuminen ja eri vaihtoehdot erilliseen tiedostoon. Tässä ei ole kuitenkaan kyseessä vain navigointi, vaan page flow voi myös sisältää logiikkaa, virhekäsittelyä, jne. Faces Flow on valittu ns ’Big Ticket Feature’:ksi, eli on merkittävä osa JSF alustaa ja sen ympärille rakentuu paljonkin pientä.

Yksi osa on uusi Scope annotaatio, @FlowScoped, joka määrittää luokan elinkaareksi senhetkisen Flown (kääntäisikö tuon virtaukseksi? Aika kömpelö käännös). Tarkoittaa että scope voi olla yli yhden requestin mutta vähemmän kuin session verran. Tätä voisi vertailla hieman @FlashScoped-laajuuteen, mutta viimekädessä elinkaaren määrittää siis määritelty flow, ei se montako kutsua serverille tehdään.

@FlowScoped ottaa flow id parametrin joka määrittää mihin flow-virtaukseen se kuuluu.

Esimerkki @FlowScoped beanistä:

@Named
@FlowScoped(id = "someFlowName")
public class SomBean {
    public String someReturn() {
        return "/somePage.xhtml";
    }
}

Käytössä on oletuksia mitkä helpottavat elämää: flow oletussivu voidaan luoda luomalla kansio jonka nimi on sama kuin flow id, sekä .xhtml tiedosto jonka nimi on edelleen sama kuin flow id, esim:

/someFlowName/someFlowName.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:j="http://java.sun.com/jsf/flow"
>
    <f:metadata>
        <j:faces-flow-definition>
            <j:faces-flow-return id="someReturnName">
                <j:navigation-case>
                    <j:from-outcome>#{someBean.someReturn}</j:from-outcome>
                </j:navigation-case>
            </j:faces-flow-return>
        </j:faces-flow-definition>
    </f:metadata>

    <!-- Rest of view -->
</html>

Flow-tiedostojen välillä voi navigoida flow-id:n avulla, eli navigaatiojärjestelmä tunnistaa nyt flow id:n. Flow id voi olla sama kuin tiedostonimi, tai se voidaan määrittää j:faces-flow-definition elementin id-attribuutilla jos tiedostonimeä ei haluta käyttää. Navigointi flow-sivulta toiselle tapahtuu tähän tapaan:

 <h:commandLink value="Enter flow" action="someFlowName" />

No niin, tässähän ei ole mitään uutta. Aiemminkin JSF:ssä on voitu navigoida sivulta toiselle sivunimen perusteella. Uutta onkin se, että flow node (virtaussolmu? :p) voi olla muutakin kuin näkymä, view. Se voi olla myös Switch (EL lause joka evaluoi mikä on seuraava node), Return (virtauksen paluuarvo),  Method Call (vapaavalintaisen metodin suoritus ja navigaatio), tai Faces Flow Call (uuden flow-sarjan käynnistys).

Ja tässä vähän mehukkaampi Faces Flow määritys:

 

<f:metadata>
        <j:faces-flow-definition>

            <j:initializer>#{someBean.init}</j:initializer>
            <j:start-node>startNode</j:start-node>

            <j:switch id="startNode">
                <j:navigation-case>
                    <j:if>#{someBean.someCondition}</j:if>
                    <j:from-outcome>fooView</j:from-outcome>
                </j:navigation-case>
            </j:switch>

            <j:view id="barFlow">
                <j:vdl-document>barFlow.xhtml</j:vdl-document>
            </j:view>
            <j:view id="fooView">
                <j:vdl-document>create-customer.xhtml</j:vdl-document>
            </j:view>

            <j:faces-flow-return id="exit">
                <j:navigation-case>
                    <j:from-outcome>/exit</j:from-outcome>
                </j:navigation-case>
            </j:faces-flow-return>
            <j:faces-flow-return id="error">
                <j:navigation-case>
                    <j:from-outcome>/error</j:from-outcome>
                </j:navigation-case>
            </j:faces-flow-return>

            <j:finalizer>#{someBean.finish}</j:finalizer>

        </j:faces-flow-definition>
    </f:metadata>

 

Joten tällaista tänä vuonna. Vuosi 2013 on Javan kannalta jännä vuosi tulevien standardien johdosta. Spring Framework 4 tulee luonnollisesti sisältämään tuen myös EE 7 ja SE 8 piirteille, se on jo työn alla.

 

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s