Apache Tapestry
Tapestry je open-source framework pro tvorbu webových aplikací v jazyce Java. Byl vytvořen nezávisle Howardem Lewis Shipem a poté adoptován korporací Apache Software Foundation (ASF). Framework doplňuje a navazuje na standardní Java Servlet API. Tapestry rozděluje webové aplikace do skupin stránek, z nichž každá je složena z komponent. Použití komponent umožňuje výrazně zvýšit produktivitu vývoje webu – to je důvod, proč všechny nové frameworky, včetně Tapestry, JavaServer Faces, a ASP.NET, jsou založené na komponentech. To zajišťuje konzistentní strukturu umožňující frameworku, aby přebíral odpovědnost za klíčové problémy, jako je výstavba URL, přetrvávající stav úložiště na straně klienta nebo na serveru, validace vstupu uživatele, lokalizace / internacionalizace a ohlašování výjimek. Aplikace zahrnují tvorbu HTML šablon pomocí prostého HTML a kombinování těchto šablon s malým množstvím kódu v jazyce Java. Je speciálně navržen tak, aby bylo vytváření nových komponent velmi snadné, neboť se jedná o rutinní postup při vytváření aplikací. Navíc je Tapestry snadno integrovatelný s jakýmkoliv druhem backendu, včetně JEE, Spring a Hibernate. Tapestry framework přináší skutečný objektově orientovaný přístup do tvorby webových aplikací v jazyce Java.
Vývojář | Apache Software Foundation |
---|---|
Aktuální verze | 5.4.5 (6. září 2019) |
Vyvíjeno v | Java |
Typ softwaru | webový aplikační framework |
Licence | licence Apache |
Web | tapestry |
Některá data mohou pocházet z datové položky. |
Tapestry je vydáván pod Apache Software licencí 2.0
Verze
Tapestry má za sebou dlouhou historii. Nejstarší verze se datuje až do ledna roku 2000. V současné době nejsou verze 3 a 4 dále vyvíjeny, veškerá pozornost se směřuje na Tapestry 5.
Novinky v Tapestry 5.1
- Tapestry nyní používá Blackbird JavaScript konzoli.
- Tapestry nyní automaticky spojuje několik JavaScript knihoven v jeden požadavek.
- Požadavek z Ajaxu může nyní vracet instanci MultiZoneUpdate umožňující aktualizaci vícero míst v klientském prohlížeči.
- Značné zvýšení výkonu některých vylepšení oproti Tapestry 5.0.18 (čas pro prvotní referování stránky a čas pro aktualizaci stránky se výrazně snížil)
- Služby Tapestry lze nyní jednoduše aplikovat do Spring Beans při použití Tapestry/Spring knihovny integrace.
- Tapestry nyní komprimuje odpovědi pro klienty, kteří podporují formát GZIP komprese.
- Uspořádané a namapované konfigurace mohou být překrývány.
- Podpora pro volání metod s parametry nebo vytváření seznamů.
- … a další
Distribuce Tapestry
Distribuce Tapestry je k dispozici ke stažení na domovské stránce Tapestry.
Skládá se z těchto částí:
- Jádro Tapestry Frameworku – Tento archív obsahuje všechny základní složky Tapestry. Rovněž obsahuje další třídy, které jsou využívány k poskytování služeb na stránkách a v komponentech.
- Vložené komponenty – soubor výkonných add-on komponent pro Tapestry dodaných veřejností. Obsahuje komponenty, které jsou použity k vytvoření HTML odpovědí pro renderování stránek. Tyto komponenty mohou být použity v aplikacích, aby zahrnuly logickou strukturu v HTML šablonách.
- Třídy pro podporu anotací – Tato knihovna obsahuje anotace. Anotace modifikátory, které mohou být přidány do kódu Javy. To nám umožňuje provádět některé operace přímo uvnitř Java kódu, které by jinak byly specifikovány na stránce nebo komponentě. Anotace vyžadují JDK 1.5 ke spuštění.
- Podpora pro portlety – add-on modul pro Tapestry, který umožňuje použití Tapestry k vytváření JSR-168 portletů.
Tapestry má řadu dalších runtime závislostí, které musí být staženy a přidány k JAR souborům popsaným výše do složky WEB-INF/lib webových aplikací Tapestry. Toho lze docílit pomocí skriptů Antu pro Tapestry, které automaticky stáhnou tyto závislosti. Tyto skripty vyžadují určitou konfiguraci, aby pracovaly správně. Podrobnosti jsou k dispozici na Tapestry Wikipedii. Alternativně lze tyto závislosti stáhnout ze složky quick-start Howarda Lewis Shipa jako tapestry-libraries.tar.gz (21,7 MB).
Příklad Hello World pomocí Tapestry
Tapestry aplikace vždy přikládají stránku nazvanou „Home“. Je to první stránka, která je zobrazena aplikací při prvním spuštění (jinak řečeno, když internetový prohlížeč přistupuje k počáteční URL). Tapestry stránky jsou vždy kombinací tříd Javy a šablon (mohli bychom říct HTML šablon, ale Tapestry není nijak limitováno jen na HTML). V mnoha případech Tapestry použije vestavěnou Java třídu, když mu sami nějakou nepřipravíme. Ukázku začneme vytvořením šablony Home.html:
<html>
<head>
<title>Tutorial: HelloWorld</title>
</head>
<body>
= HelloWorld Tutorial =
</body>
</html>
Zatím v této HTML šabloně není nic zvláštního.
Nyní můžeme nastavit web. xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Tutorial: HelloWorld</display-name>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app</url-pattern>
</servlet-mapping>
</web-app>
Zde jsme dali naší aplikaci jméno „app“. Používáme standardní Tapestry třídu ApplicationServlet jako náš servlet a namapovali jsme ho do /app. Jméno aplikace je relativně nepodstatné, Tapestry se přizpůsobí jakémukoliv jménu, které zadáte.
Cesta na druhou stranu musí být /app. Není to pevně stanoveno v Tapestry, ale pokud bychom chtěli použít jinou cestu, vyžadovalo by to malé nastavování.
Změníme teď naší Home stránku přidáním současného data a času. Upravená šablona vypadá takto:
<html>
<head>
<title>Tutorial: HelloWorld</title>
</head>
<body>
= HelloWorld Tutorial =
<p>
The current data and time is:
'''<span jwcid="@Insert" value="ognl:new java.util.Date()">June 26 2005</span>'''
</p>
</body>
</html>
Speciální atribut „jwcid“ je náznakem Tapestry, že je to komponenta a ne jen obyčejné HTML. Hodnota „@Insert“ atributu jwcid může být považována za „instanci komponenty Insert“. Je to jedna z mnoha zabudovaných Tapestry komponent.
Možná je zde trochu matoucí text “ June 26 2005“ v těle tagu <span>. Ten je zde proto, abychom viděli, jak stránka bude vypadat bez spuštění aplikace. Stránku Home.html můžeme spustit v prohlížeči nebo editorech jako Dreamweaver nebo HomeSite. Tím vlastně obejdeme Tapestry servlet a přistoupíme ke stránce přímo a pak se nám zobrazí právě zadaný text místo vygenerovaného data a času.
Vraťme se nyní ještě k výrazu „ognl:new java.util.Date()“. Prefix „ognl:“ je signálem pro Tapestry, že se jedná o výraz, který má být vyhodnocen, a ne jen obyčejný String řetězec. Vyhodnocením výrazu získáme novou instanci třídy java.util.Date spojenou s komponentou Insert. Parametr value umožní komponentě Insert přístup k této hodnotě a tato komponenta dále zkonvertuje typ Date do textového řetězce a zobrazí ho na vygenerované stránce.
A tím máme hotovou naší malou ukázku Hello World v Tapestry.
Tapestry 5
Další část článku pracuje s Tapestry 5, proto je zapotřebí upravit HelloWorld příklad uvedený výše. Nová verze souboru web.xml bude vypadat nyní takto:
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Tapestry</display-name>
<context-param>
<param-name>tapestry.app-package</param-name>
<param-value>cz.vse.tapestry5</param-value>
</context-param>
<filter>
<filter-name>app</filter-name>
<filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>app</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Změny
Odpadá mapování servletů z předchozí verze. Nová verze méně připomíná web.xml známý z Java EE. Tento deployment descriptor se v různých aplikacích Tapestry nyní příliš nemění, jeho obsah je možno zkopírovat z domovské stránky Tapestry a následně lehce poupravit pro naši aplikaci. Je potřeba změnit nastavení tagu <context-param>, který obsahuje informace a uložení zdrojových kódů souvisejících se jednotlivými komponentami aplikace. Tímto se framework Tapestry poněkud liší od ostatních Java frameworků. Adresa v tomto tagu totiž skutečně odkazuje na uložení zdrojových kódů aplikace (v kontextu aplikace) a nikoli zkompilovaných class souborů. Tapestry vyžaduje přístup ke zdrojovým kódům tímto způsobem pro umožnění detekcí a aplikací změn v aplikaci bez nutnosti nového deployování aplikace na server. Tato vlastnost velmi zvyšuje produktivitu vývoje. Po ukončení vývoje aplikace, je samozřejmě možno celou aplikaci zbuildovat a nahrát na server obvyklým způsobem. Nastavení <filter-mapping> obsahuje nastavení url odkazů, které bude Tapestry filtrovat. Toto nastavení je zapotřebí změnit pouze v případě, že webová aplikace využívá framework Tapestry pouze pro některé své části. Pro většinu případů zde postačuje ponechat výchozí nastavení zkopírované z domovské stránky Tapestry. Jako součást nastavení IOC Containeru Tapestry je jako index stránka nastavena stránka s názvem Start. V případě přístupu na stránky Tapestry aplikace pomocí odkazu http://localhost/Tapestry, (Tapestry je názvem aplikace uvedený ve web.xml, možno změnit) bude IOC Container hledat stránku s názvem Start na adrese uložené v částí context-param v souboru web.xml. V případě, že stránka nebude nalezena, aplikace vyhodí výjimku. Aplikace však nemusí nutně tuto stránku obsahovat. Pokud stránka Start není z nějakého důvodu žádoucí, je možno přistupovat k aplikaci přes odkaz http://localhost/Tapestry/nazev_stranky. V Tapestry 5, se každá webová stránka dělí na 2 soubory.
Na Java třídu a Tapestry HTML šablonu. Java třída musí být umístěna v balíčku uvedeném ve web.xml v podbalíčku pages. Tato třída obsahuje java kód spojující stránku se zbytkem aplikace a kód pro získání dynamických dat. Pro náš HelloWorld příklad bude třída Stat.java obsahovat pouze metodu pro získání aktuálního data
public class Start {
public Date getActualDate() {
return new java.util.Date();
}
}
Tapestry HTML šablona je xml soubor s příponou „tml“. Tento soubor musí mít název stejný jako stránka, ke které patří, v tomto případě se bude jmenovat Start.tml a musí být umístěn v adresáři Web Content. Pro náš HelloWorld příklad bude soubor Start.tml vypadat takto:
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Hello world</title>
</head>
<body>
HelloWorld <br />
${actualDate}
</body>
</html>
Za povšimnutí stojí zejména deklarování Tapestry namespace a extension(„${actualDate}“), kterým je propojena šablona se svojí Java třídou. Takto je zavolána property actualDate.
Property
Property je atribut stránky, je většinou reprezentován class-member proměnou Java třídy spojené s danou stránkou. Není to však nutné, pro zobrazení obsahu property je pouze požadována getter metoda s názvem getJmenoProperty(). Pro nastavení je obdobně nutná metoda setter. Pro zavolání metody, bez odkazu na property by extension vypadala takto: ${getActualDate()}. Takto se Tapestry oznámí, že má zavolat přímo jméno uvedené metody.
Hlášení chyb
Tapestry obsahuje vlastní mechanismus pro hlášení chyb. V případě, kdy aplikace vyhodí programátorem nezpracovanou výjimku, dojde k zobrazení chybové hlášky na obrazovce. V Tapestry 5 je možno tyto chybová hlášení přesměrovat do jiného výstupu a uživatele přesměrovat na všeobecnou chybovou stránku, kde je možno uživateli poradit, jak postupovat dále. Přímé zobrazování chybové zprávy na stránce, tak aby tyto zprávy uživatel viděl, není doporučováno. Uživatelé by tak dostávali informace o vnitřní stavbě a stavu aplikace místo informací o tom, co se stalo a jak mají dále postupovat. V Tapestry 5 došlo k výraznému vylepšení chybových hlášení. Tyto nyní obsahují výpis stack trace vyvolané výjimky, kontext výjimky a v některých případech i postup, jak výjimku odstranit.
Debugování
Použití IOC Containeru umožňuje spouštění aplikace v debug módu a využívat tak všech možností debugování pro ladění aplikace.
Předávání hodnot mezi stránkami
Webové aplikace obsahují velké množství stránek, v některých případech je nutno mezi těmito stránkami přímo předávat některé hodnoty. Například pokud uživatel vyplní a odešle formulář. Tapestry umožňuje tuto událost zpracovat zavoláním metody ze zdrojového kódu stránky. Tato metodu, aby byla zavolána, buď musí splňovat určité nároky kladeny na její pojmenování nebo musí být označena příslušnou anotací.
Jmenná konvence
Při použití jmenné konvence se jméno metody skládá z několika částí. Návratový typ metody, ani její parametry nejsou ovlivněny. Jméno metody začíná slovem „on“ následovaným názvem události, která se zpracovává. Dále následuje slovo „from“ doplněné o id komponenty, ve které byla událost vyvolána. V případě události submit vyvolané formulářem StartForm by se metoda jmenovala onSubmitFromStartForm.
Anotace
Pro vyšší čitelnost kódu je možno pojmenovat metodu podle programátorova uvážení a metodu označit anotací @onEvent. Anotace @onEvent vyžaduje 2 parametry. Název události a název komponenty, kde byla událost vyvolána. V případě události submit vyvolané formulářem StartForm by celá anotace vypadala následovně @onEvent(value="submit", component="startForm")
Tyto dva přístupy lze v rámci jedné aplikace libovolně kombinovat. Použití jmenných konvencí vede ke kratšímu, čitelnějšímu kódu ale na stránce s vyšším počtem komponent nebo událostí se však stává nepřehledným. Zde se vyplatí využití anotací.
Stav aplikace
Tapestry poskytuje implementaci návrhového vzoru Singleton. Pro jeho využití je pouze potřeba anotovat objekt anotací @ApplicationStateObject. Tapestry v tomto případě zajistí vytvoření instance při prvním volání a její předávání při další práci v instancí. K použití této instance se poté stránka přihlásí deklarací proměnné daného typu a anotováním proměnné anotací @ApplicationStateObject. Tapestry povoluje dle specifikace návrhového vzoru pouze jeden ApplicationStateObject od každého typu. Pokud stránka deklaruje dvě tyto proměnné stejného typu s různými názvy, budou aplikací považovány za totožný a obě budou obsahovat odkaz na totožný objekt. Pokud stránka potřebuje pracovat s jinou instancí stejného typu jako je ApplicationStateObject na této stránce použitý, lze to. Avšak z těchto pouze jedna smí být anotována jako ApplicationStateObject.
Page Pooling
Page pooling je název strategie práce s webovými stránkami aplikace. Velmi připomíná práci JVM s instancemi třídy String. V případě žádosti o zobrazení webové stránky se IOC Container podívá do poolu stránek, zda je zde instance požadované stránky k dispozici. Pokud ano, pak ji použije, v opačném případě vytvoří novou instanci. Tuto instanci poté naplní požadovanými parametry – upraví vzhled a obsah stránky dle aktuální lokalizace a vloží do stránky předané parametry z předchozí akce. Například vyplní údaje o uživateli do textových polí z předaného objektu uživatele. Takto připravená stránka je poté zobrazena uživateli. Tato příprava stránky se nazývá aktivace. IOC container se v této fázi podívá do zdrojového kódu stránky, zda obsahuje metodu onActivate a provede ji. Zobrazení stránky lze takto velmi jednoduše upravit. Po ukončení práce se stránkou (zavření okna prohlížeče, nebo přechodu na jinou stránku), je tato stránka uvedena zpět do původního stavu, vyčištěna a vrácena do poolu pro další použití. Tato fáze se nazývá pasivace stránky a je možno ji upravit obdobně jako aktivaci stránky, tentokrát metodou onPassivate. Stránky, na kterých došlo při běhu aplikace k chybě, jsou považovány za znehodnocené a do poolu se již nevrací. Tato politika výrazně snižuje časy potřebné pro nahrání stránek, šetří systémové prostředky a současně zachovává stabilitu aplikace.
Tapestry tým
- Howard Lewis Ship – tvůrce Tapestry a také autor knihy TapestryInAction.
- Erik Hatcher – konzultant, spisovatel, mluvčí. Často přednáší na NoFluffJustStuffSymposiums circuit, kde mluví o Tapestry a dalších tématech.
- Geoff Longman – tvůrce Spindlu, Eclipse pluginu pro tvorbu Tapestry aplikací.