Java servlety a zejména JavaServer Pages (JSP) usnadňují tvorbu dynamických webových stránek. JSP přináší oproti servletům snadnější a mnohem přehlednější tvorbu výsledné HTML/XML stránky. JSP dovoluje míchat statický obsah stránky spolu s dynamickými úseky tvořenými Javovským kódem, zároveň však plně dovoluje využít vlastností servletů. JSP Standard Tag Library (JSTL) možnosti tvorby výsledné stránky ještě dále posovouvá. Stránka využívající JSTL je XML dokumentem, jež podobně jako JSP umožňuje přístup k objektům JavaBeans, poskytuje řadu implicitních objektů (session, parametry požadavku, aj.) a to vše přímočařejší cestou než stránka JSP. JSTL stránka je tak mnohem podobnější klasickým skriptovacím technologiím používaných na straně serveru (perl, PHP).
Použití JSTL je možné v libovolné stránce JSP. Jsou k tomu nutné pouze tři věci:
Jádrem JSTL je bezesporu jazyk EL (expression language), přesto je možné i nadále používat skriplety JSP. EL (jako každý jiný programovací jazyk) poskytuje výrazové prostředky pro definování proměnných, základní operátory a společně s tagy z JSTL řídící struktury (podmínky, cykly) a řadu dalších zajímavých možností (přístup k databázi apod.).
JSTL je tvořeno čtyřmi knihovnami, každá se svým jmenným prostorem a vymezenou funkčností:
Vložením JSTL tagu do stránky je vyvolána určitá akce (například výpis výrazu) -- proto se často slovem akce označují jednotlivé JSTL tagy, budu je tak označovat i já.
V další části dokumentu se budu podrobněji věnovat základnímu kameni JSTL -- části poskytující základní funkčnost -- JSTL core tag library.
Tagy JSTL Core Tag Library (akce) rozděluje specifikace do několika skupin:
V následujícím přehledu si rozhodně nedělám nároky na vyčerpávající popis -- rozsah seminární práce má být 4 strany, mnou zmiňované kapitoly specifikace zabírají celkem 54 stran.
Umožňuje výpis výrazu na stránku JSP. Výraz je uveden v atributu
value:
<c:out value="EL expression" />
Důležitá akce, umoŽňuje definovat proměnnou v kontextech JSP (page,
session, request, application).
<c:set value="EL expression" var="variable" scope="scope" />
Attribut var obsahuje jméno proměnné, do které bude uložena hodnota v atributu value. Je možno takto nastavovat i vlastnosti (property) objektů JavaBean (atributy target a property).
Odstraní proměnnou z kontextu.
<c:remove var="var" scope="scope" />
Zachycuje výjimku java.lang.Throwable. Jediný parametr
var umožňuje pojmenovat objekt výjimky.
<c:catch var="" />
JSTL podporuje všehcny podmínky běžné o jiných programovacích jazyků: if--then, if--then--else a switch.
Typické if. Pokud podmínka platí, vykoná se tělo příkazu, pokud ne,
nestane se nic. Atribut vardovoluje uchovat výsledek testu v
určené proměnné.
<c:if test="condition" var="testResult">
body
</c:if>
Kombinuje if--then--else a switch v jednom (použitím jediného tagu c:when získáme if--then--else).
Pokud neplatí ani jeden u testů c:when, vykoná se tělo uvnitř
c:otherwise.
<c:choose>
<c:when>
body
</c:when test="condition">
<c:otherwise>
body
</c:otherwise>
</c:if>
<c:forEach var="i" items="collection">
body (například <c:out value="i" />)
</c:forEach>
Základem iterace je tag c:forEach. Dovoluje ve svém atributu items použít libovolnou J2SE kolekci (java.util.Collection) či mapu (java.util.Map). Pokud je procházena mapa, obsahuje proměnná držící aktuální prvek jak klíč, tak hodnotu (${i.value} a ${i.value}).
c:forEach má řadu atributů, zde nezmíněných, dovolujících procházet jen vybraný úsek kolekce, definovat velikost kroku apod.
Zajímavou možností je procházet části datového řetězce (tokeny). Akce
c:forTokens dovoluje definovat oddělovač, který je použit k
rozdělení datového řetězce na tokeny a následně je v každém kroku iterace
vrácen další token.
<c:forTokens items="collection" delims="deliminator" var="i">
body (například <c:out value="i" />)
</c:forTokens>
JSTL se snaží nabídnout tagy pro základní akce související s URL. Jde o (1) pohodlný zápis URL (autor se nemusí starat o tzv. kódování URL (URL encoding) -- převod nepovolených zanků do správné formy), (2) vkládání zdrojů a (3) HTTP přesměrování.
c:param je vnořen do níže popsaných tagů. Dovoluje definovat
parametry daného URL, které jsou připojeny za jeho konec a předány zdroji v
době jeho aktivace (vložení, přesměrování, výpis).
<c:param name="name">
value
</c:param>
nebo
<c:param name="name" value="value" />
Parametry jsou dostupné klasickou cestou -- přes dobře známý request (v JSTL například přes implicitní objekty param a paramValues).
Cílem je dovolit zapsat i složité URL s tím, že JSTL se postará o
správné kódování (mezery v paramatrech nahradí znakem +, nepovolené znaky
hexadecimálně zakóduje). Toto zakódované URL je uložené do proměnné
specifikované v atributu var.
<c:url value="URL" var="finalURL">
<c:param name="name" value="value" />
</c:url>
Posílá klientům HTTP přesměrování na zadanou URL.
<c:redirect value="URL">
<c:param name="name" value="value" />
</c:redirect>
Vkládá zdroj do dokumentu poté, co je zpracován webovým kontejnerem.
<c:import url="urlToImport">
<c:param name="name" value="value" />
</c:import>
Znovu bych rád připomněl, že pro plný výčet atributů a vyčerpávající popis tagů odkazuji čtenáře na zdroj [1]. Zejména tagy c:forEach a c:import obsahují řadu nezmíněných vlastností.
Obecně lze říci, že tagy JSTL zbavují autora stránek mnohých starostí spjatých s Javou:
Mé postřehy z krátkého seznámení s JSTL tagy jsou tyto: