JSTL Core Tag Library verze 1.0

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).

Úvod

Použití JSTL je možné v libovolné stránce JSP. Jsou k tomu nutné pouze tři věci:

  1. Webový kontejner musí mít instalovány příslušné .jar knihovny.
  2. Soubor web.xml musí definovat použití JSTL (tag <taglib>).
  3. Příslušná JSP stránka musí definovat použití JSTL (direktiva taglib). Součástí direktivy je i atribut prefix vymezující jmenný prostor JSTL, viz níže.

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í:

  1. Základní funkčnost (core) (prefix c)
  2. Zpracování xml (prefix xml)
  3. Podpora přístupu k SQL databázím (prefix sql)
  4. Zpracování xml (prefix xml)

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.

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.

Tagy pro všeobecné použití

<c:out>

Umožňuje výpis výrazu na stránku JSP. Výraz je uveden v atributu value:

<c:out value="EL expression" />

<c:set>

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).

<c:remove>

Odstraní proměnnou z kontextu.

<c:remove var="var" scope="scope" />

<c:catch>

Zachycuje výjimku java.lang.Throwable. Jediný parametr var umožňuje pojmenovat objekt výjimky.

<c:catch var="" />

Podmíněné akce

JSTL podporuje všehcny podmínky běžné o jiných programovacích jazyků: if--then, if--then--else a switch.

<c:if>

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>

<c:choose>

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>

Iterace

<c:forEach>

<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.

<c:forTokens>

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>

Tagy pro práci s URL

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>

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:url>

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>

<c:redirect>

Posílá klientům HTTP přesměrování na zadanou URL.

<c:redirect value="URL">
    <c:param name="name" value="value" />
</c:redirect>

<c:import>

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>

Závěr

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:

  1. Syntax jazyka EL -- závorkování a středníky Javy mohou být zapomenuty (XML je jednoznačné, díky DTD editory mohou kontrolovat syntax již při psaní kódu).
  2. Typová kontrola -- v řadě případů není nutné přetypování, což je v řadě případů u HTML/XML stránek jen výhodou.
  3. Snazší používání -- autor nemusí přesně znát rozhraní mnoha tříd Javy, ale vystačí s jednoduššími prostředky EL a tagy.

Mé postřehy z krátkého seznámení s JSTL tagy jsou tyto:

  1. Oceňuji menší důraz na typovou kontrolu -- dynamická tvorba HTML/XML stránek je práce s textem, kde všechna data jsou přenášena jako text a využití přísně typového jazyka (Java) znamená neustálé přetypovávání. Jazyky jako perl, PHP jsou v tomto směru vhodnější, JSTL to částečně vyrovnává.
  2. Naopak, vyzdvihovaná iterace je podle mého názoru příliš těžkopádná a osobně dávám přednost skripletům. To bohužel znamená používat sice dobré, ale typově přísné rozhraní tříd Javy, a tak se ochudit o i o výhodu menší typové kontroly.
  3. JSTL rozhodně nabízí vývojáři lepší přístup k datům aplikace, zejména údajům zasílaných z formulářů, což není dle mého názoru v Javě řešeno dobře.
  4. Klíčová slova jsou volena zvláštněm tj. odlišně od bežných zvyklostí -- proč se v podmínkách od zaběhnutého if--then--else používá choose--when? S tímto souvisí i podle mého přílišná upovídanost jazyka -- názvy klíčových slov jsou zbytečně dlouhé.

Reference