Tapestry

Z FI WIKI
Přejít na: navigace, hledání


Tapestry je projekt z rodiny Apache. Nepoužívá JSP, je postaven přímo nad Servlet API. Má vlastní systém šablon úzce provázaný s kontrolérem.

Výhody

  • snadná spolupráce programátorů s web designery, šablony jsou HTML soubory
  • silná objektová orientace
  • skládání stránek z komponent
  • při využití anotací minimum konfigurace

Nevýhody

  • strmá křivka učení, špatná dokumentace
  • závislost na mnoha knihovnách
  • ošklivá URL
  • každá verze je nekompatibilní s předešlými
  • neprůhledný životní cyklus stránek

Popis verze 4

Vývojář vytváří šablony HTML stránek, ve kterých jsou některé HTML tagy označené speciálním atributem jwcid tak, že místo jejich obsahu se zavolá kód vykreslující určitou komponentu. Komponenty je možné vnořovat jednu do druhé.

Principem Tapestry je objektová orientovanost a odstínění od Servet API. Každá šablona stránky může mít svoji ovládací třídu, podle implicitního nastavení stejně pojmenovanou. Tj. např. šabloně Home.html přísluší ovládací třída Home v package, který se určí v konfiguraci aplikace. Tím se ušetří značná část konfiguračních popisů.

Výhodou Tapestry je, že obsah HTML šablon vypadá jako normální HTML, protože obsah HTML tagů označených jwcid může simulovat potenciální vzhled komponenty. Takže web designeři můžou pro editaci používat normální nástroje, což u JSP neplatí.

Pro i18n textů lze použít speciální konstrukci <span key="klic">. Texty pro klíče se hledají v ResourceBundle .properties souborech pojmenovaných stejně jako šablona a ovládací třída, umístěných v adresáři /WEB-INF. Pro šablonu Home.html se tedy texty hledají v /WEB-INF/Home_*.properties.

V šablonách lze využívat speciální jazyk OGNL (Object Graph Navigation Language), trochu podobný JSP EL jazyku, pro přístup k datům a metodám Java tříd.

 
<html>
  <head>
    <title>Tapestry</title>
  </head>
  <body>
  <p>
  <span key="soucasna.hodnota">The current value is</span>: <span jwcid="@Insert" value="ognl:counter">37</span>
  </p> 
 
  <p>
   <a href="#" jwcid="@DirectLink" listener="listener:doClick">increment counter</a>
  </p>
        
  <table>
  <tr>
    <th>First Name</th>
    <th>Last Name</h>
  </tr>
  <tr jwcid="loop">
    <td><span jwcid="insertFirstName">John</span></td>
    <td><span jwcid="insertLastName">Doe</span></td>
  </tr>
  <tr jwcid="$remove$">
    <td>Frank</td>
    <td>Smith</td>
  </tr>
  <tr jwcid="$remove$">
    <td>Jane</td>
    <td>Jones</td>
  </tr>
</table>
 
  </body>
</html>

Obsah HTML tagů <span> a <a> se zahodí a zavolá se vykreslení komponent Insert, DirectLink, a komponent pojmenovaných loop,insertFirstName a insertLastName.

HTML tagy s atributem jwcid="$remove$" se prostě vynechají, slouží právě pro web designery jako náhled.


Události se pak získávají přes ovladače stránek či komponent.

 
import org.apache.tapestry.annotations.Persist;
import org.apache.tapestry.html.BasePage;
 
public abstract class Home extends BasePage {
{
    @Persist
    public abstract int getCounter();
    public abstract void setCounter(int counter);
    
    public void doClick()
    {
        int counter = getCounter();
        counter++;
        setCounter(counter);
    }
}

Při kliknutí na odkaz "increment counter" se vyvolá metoda doClick().

Obsluha formulářů

Ovladač stránky může implementovat rozhraní PageBeginRenderListener, pak je upozorněn na začátek vykreslování stránky, a může např. nastavit hodnoty ve formuláři.

Data pro formulář jsou držena v JavaBeanu. Dynamicky generovaná data jsou zpřístupněna přes getXXX() metody ovladače stránky a OGNL. Např:

 
public abstract class ObsluhaFormulare extends BasePage implements PageBeginRenderListener {
 
    //Fazole je JavaBean pro data formuláře
    public abstract Fazole getFazole();
    public abstract void setFazole(Fazole f);
 
    //inicializace dat formuláře
    public void pageBeginRender(PageEvent event) {
        Fazole fazole = getFazole();
        if (fazole == null) {
            fazole = new Fazole();
            fazole.setZacatek(50);
            fazole.setKonec(100);
            fazole.setKrok(20);
            setFazole(fazole);
        }
    }
    //metoda poskytujici DateFormat v locale požadovaném prohlížečem
    public DateFormat getPlnyFormat() {
        return DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, this.getLocale());
    }
    //metoda poskytujici aktualni okamžik
    public Date getOkamzik() {
        return new Date();
    }
 
    //obsluha události odeslání formuláře
    public IPage odesli() {
        Fazole fazole = getFazole();
        if (fazole.getText() == null || fazole.getText().length() == 0) {
            this.setFazole(fazole);
            return this;
        }
        Obrazky obrazky = getObrazky();
        obrazky.setFazole(fazole);
        return obrazky;
    }
 
    //injekce odkazu na další stránku
    @InjectPage("Obrazky")
    public abstract Obrazky getObrazky();
 
}

může být ovladač stránky k šabloně:

 
  <span key="tedje">Presny cas</span>:
  <span jwcid="@Insert" value="ognl:okamzik" format="ognl:plnyFormat">32.13.2006</span>
 
  <form jwcid="form@Form" success="listener:odesli">
   <table>
     <tr>
       <th><span key="od">Od</span></th>
       <td><input jwcid="@TextField" value="ognl:fazole.zacatek" /></td>
     </tr>
     <tr>
       <th><span key="do">Do</span></th>
       <td><input jwcid="@TextField" value="ognl:fazole.konec" /></td>
     </tr>
     <tr>
       <th><span key="krok">Krok</span></th>
       <td><input jwcid="@TextField" value="ognl:fazole.krok" /></td>
     </tr>
     <tr>
       <th><span key="text">Text</span></th>
       <td><input jwcid="@TextField" value="ognl:fazole.text" /></td>
     </tr>
     <tr>
       <td colspan="2"><input type="submit" jwcid="odeslani@Submit" value="message:odeslat" /></td>
     </tr>
     </table> 
  </form>

Z příkladů je vidět, že kód aplikace nezávisí na Servlet API, je tvořen metodami poskytujícími data nebo obsluhujícími události klikutí na odkaz nebo odeslání formuláře.


Metody ovladačů stránek poskytující properties musí být abstract. Instance ovladačů stránek jsou sdíleny všemi uživateli, proto je nutné data udržovat pomocí properties, ne přímo v ovladačích.

Podrobnější informace jsou v Tvorba aplikace v Tapestry