Vlastní TAGY v JSP

19. 9. 2001
Doba čtení: 3 minuty

Sdílet

JSP je velice mocný nástroj na tvorbu webů, obsahuje například také podporu pro vlastní tagy. O tom se může PHP nebo ASP zatím pouze zdát (i když nová verze ASP už má mít něco podobného). Jestli vás zajímá, jak na tuhle JSP vlastnost, čtěte dál.

Co se naučíme?

Vytvářet vlastní JSP tagy a používat je ve vlastních aplikacích. Tenhle návod ale nelze brát jako všeobjemný návod, jak vytvářet jakékoli tagy, projdeme jenom základní vlastnosti. Těm z vás, kterým to nestačí, doporučuji ještě java.sun.com.

Co bychom už měli umět?

  • Používat JSP alespoň na základní úrovni.
  • Být zvyklí na svůj JSP/servlet kontejner (například tomcat, který budeme používat my).
  • Chápat základy Javy. Pokud však chcete JSP custom tagy pouze používat, nemusíte ani to.

Příklad

Dejme tomu, že jsme e-magazín o programování pro web. Na našich stránkách budeme často zobrazovat úryvky HTML a jiných tagovacích jazyků. Ale v HTML nemůžeme zobrazovat znaky < a >, musíme je nahradit znaky &lt; a &gt;. Také bychom chtěli tagy zvýraznit nějakou barvou. Normálné bychom museli každý úryvek kódu upravovat ručně, což je pomalé a často přitom něco přehlédneme. Vytvoříme si tedy JSP tag, který to všechno udělá za nás (všechny příklady na této stránce byly upraveny právě tímto tagem).

Špinavá práce v javabeanu
Úryvek kódu javabeanu, který provádí tuto práci.

public String format(String doc, String tagcolor) {
    int length = doc.length();
    StringBuffer doc_buffer = new StringBuffer();
    String buff;
    for(int i=0; i<length; i++) {
        buff = String.valueOf(doc.charAt(i));
        if(buff.equals("<")) {
            buff = "<font color=\""+tagcolor+"\">&lt;";
        }
        else if(buff.equals(">")) {
            buff = "&gt;</font>";
        }
        else if(buff.equals("&")) {
            buff = "&amp;";
        }
        doc_buffer.append(buff);
    }
    return doc_buffer.toString();
}

Metoda nejdříve natáhne dokument(doc) a barvu, kterou mají mít zobrazované tagy (tagcolor). Vytvoří si StringBuffer, do kterého zapisuje výsledek. Poté projde celý dokument znak po znaku a případně znak nahradí HTML kódem, výsledek vrátí jako String.

Napojení javabeanu na tag

Tato metoda v třídě FormatTag zajišťuje volání javabeanu při použití tagu na stránce.

public int doEndTag() throws JspTagException {
    try {
        FormatBean format = new FormatBean();
        String doc = getBodyContent().getString();
        pageContext.getOut().write(format.format(doc, color));
    }
    catch (IOException e) {
        throw new JspTagException("hoops - chyba FormatTag "+e.toString());
    }

    return EVAL_PAGE;
}

Nejdříve iniciujeme FormatBean. Získáme text z těla tagu a jako výsledek vypíšeme upravený text z metody format();

Popis tagu

Tag library descriptor je XML dokument popisující tagy, má koncovku tld.

<?xml version="1.0" ?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
    "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

<taglib>
    <tlibversion>1.0</tlibversion>
    <jspversion>1.1</jspversion>
    <shortname>Format</shortname>

    <tag>
        <name>Format</name>
        <tagclass>FormatTag</tagclass>
        <attribute>
            <name>color</name>
        </attribute>
    </tag>
</taglib>

Začlenění tagu do kontejneru

Abyste mohli používat tento tag, musíte ho zahrnout do konfiguračního souboru web.xml.

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
    "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd">

<web-app>
    <taglib>
        <taglib-uri>Format</taglib-uri>
        <taglib-location>/WEB-INF/FormatTag.tld</taglib-location>
    </taglib>
</web-app>

Taglib-uri je jméno knihovny a musí být unikatní pro celou web aplikaci.

Použití tagu v JSP stránce

V každé stránce, kde chcete použít tag, musíte nadefinovat hlavičku:

<%@taglib uri="Format" prefix="format"%>

Vlastní použití vidíte tady, atribut color je volitelný.

bitcoin_skoleni

<format:Format color="#6a89fc">
<table>
    <tr><td>policko</td></tr>
</table>
</format:Format>

Všechny části příkladu najdete zazipovány tady.

Závěr

Vlastní tagy jsou určitě cestou budoucnosti, která se velice rychle stává součastností (PHP zamysli se :-). Řeší věčný problém mezi programátory a grafiky. Kdokoli, nic netušící o Javě, může rychle a bez větších problémů používat už hotové knihovny. A programátorům nehrozí, že grafik smaže ; a aplikace se zhroutí.
Existuje také projekt TagLibs, kde najdete tagy skoro na všechno.