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 < a >. 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+"\"><";
}
else if(buff.equals(">")) {
buff = "></font>";
}
else if(buff.equals("&")) {
buff = "&";
}
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ý.
<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.