Nuestra primera taglib

De ChuWiki

Qué son los taglib[editar]

Con JSP es posible hacer una librería de clases java que hagan una especie de ampliación de las etiquetas posibles de html. De esta forma, podríamos llamar con unas etiquetas -tags- especiales a las clases java que hemos hecho en nuestra librería. Por ejemplo, si tenemos todo preparado adecuadamente, la siguiente página .jsp escribiría "hola mundo" seguido de un saludo a personalizado en el navegador.

<%@ taglib uri="mistags" prefix="hola" %>
<html>
<head>
</head>
<body>
<hola:holamundo nombre="ChuiWiki"/>
</body>
</html>

En la primera línea hemos puesto una etiqueta especial de jsp para indicar que la página va a usar los tags que hemos definido en la librería "mistags". Todas las etiquetas de esta librería empezarán con el prefijo "hola".

Dentro del <body>, usamos una de esas etiquetas especiales, <hola:holamundo/>. Empiezan por el prefijo "hola" que indicamos antes y la etiqueta en concreto que queremos usar dentro de la librería "mistags" es "holamundo". Esta etiqueta, puesto que la hemos definido así en nuestras clases java, simplemente escribe "hola mundo" en el navegador. Si ademas queremos que escriba el saludo personalizado, dentro tendremos que poner el atributo "nombre" seguido del nombre que se desea. Esta parte es opcional, se podrá escribir solo si se desea.

La intención de estos taglib es que los que saben programar java hagan las clases java y los que saben de diseño gráfico en html, puedan usar esas clases java de una forma similar a cómo utilizan el resto de los tags estándar de html, sin saber qué hay detrás.


Preparamos la aplicación TagLib[editar]

Vamos a hacer un pequeño ejemplo. Creamos un directorio TagLib en webapps, de forma que tengamos $TOMCAT_HOME/webapps/TagLib

Ponemos la página index.jsp mencionada antes en ese directorio $TOMCAT_HOME/webapps/TagLib/index.jsp


Hacer la clase java[editar]

Para esta etiqueta, tenemos que hacer una clase java que herede de la clase TagSupport de la api de java-jsp. En realidad nos bastaría con implementar la interface Tag, pero para no tener que implementar todos los métodos de esa interface, heredamos de la clase TagSupport que ya tiene una implementación por defecto de todos ellos. Basta con que redefinamos los que nos interese.

Dentro de esta clase, debemos redefinir el método

public int doStartTag() throws JspException

que es el método al que llamará Tomcat cuando encuentre la etiqueta en la página .jsp. En este método debemos escribir en pantalla lo que queramos que sustituya a esa etiqueta. El código para escribir "Hola mundo" puede ser como este

package chuidiang.ejemplos;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class HolaMundoTag extends TagSupport{
    private String nombre;

    public int doStartTag() throws JspException {
        try{
            pageContext.getOut().print("Hola Mundo!");
            
            if (nombre != null) {
                pageContext.getOut().print("Hola " + nombre + "!");
            }
        } catch (IOException e) {
            throw new JspException ("Error: IOException" + 
			                        e.getMessage());
        }
        return SKIP_BODY;
    }
	
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
}

En el método doStartTag() simplemente obtenemos el Stream de salida getOut() y escribimos "Hola Mundo! Hola " y un nombre dado. En este método devolvemos SKIP_BODY, indicando que hace falta evaular el cuerpo entre la etiqueta de inicio <hola:holamundo> y fin </hola:holamundo>.

También definimos el método doEndTag(), al que se llamará cuando se evalue la etiqueta de fin </hola:holamundo>. Devolvemos EVAL_PAGE para indicar que se puede seguir con el resto de la página.

Una vez que tenemos nuestra clase, la compilamos y la metemos en el directorio $TOMCAT_HOME/webapp/TagLib/WEB-INF/classes. En el ejemplo, puesto que la clase se llama HolaMundoTag y está en el paquete chuidiang.ejemplos, debemos ponerla en $TOMCAT_HOME/webapp/TagLib/WEB-INF/classes/chuidiang/ejemplos/HolaMundoTag.class


Declaración de la etiqueta[editar]

Necesitamos crear un fichero de extensión tld, en nuestro caso lo llamaremos TagLib.tld, que tiene formato xml y en el que se define la etiqueta y cómo encontrarla. El contenido de este fichero puede ser como este

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>hola</short-name>
    <uri>mistags</uri>
    <description>Etiquetas de ejemplo</description>
	
    <tag>
    <name>holamundo</name>
        <tag-class>chuidiang.ejemplos.HolaMundoTag</tag-class>
        <body-content>empty</body-content>
        <info>Saludo</info>
        <attribute>
             <name>nombre</name>
             <required>false</required>
        </attribute>
    </tag>
</taglib>
  • Lo de <taglib> es fijo.
  • <tlib-version> es nuestro número de versión para nuestra etiqueta. Puede ser el número que queramos
  • <jsp-version> es la versión de jsp que estamos utilizando.
  • <short-name> es el prefijo que pusimos anteriomente en nuestra página jsp para las etiquetas.
  • <uri> es el nombre que queramos dar a nuestra librería de etiquetas. Hay varias posibilidades, como poner una direccion web -URI-, pero basta con poner un nombre que queramos.
  • <description> es un texto libre que queramos, para describir que hace la librería de etiquetas.

A partir de ahí, vamos poniendo un <tag> para cada una de nuestras etiquetas. En nuestro caso sólo hay una, que hemos llamado "holamundo"

  • <name> el nombre de la etiqueta.
  • <tag-class> nombre de la clase java que se hace cargo de interpretar esta etiquetas. En este caso es la clase que hicimos antes.
  • <body-content> ponemos empty puesto que nuestra etiqueta no admite un cuerpo así <hola:holamundo>aqui un cuerpo</hola:holamundo>
  • <info> una descripción para esta etiqueta.
  • <attribute> se usa para añadir un atributo al tag, como puede ser <hola:holamundo nombre="ChuWiki">.

Dentro de la etiqueta <attribute> se tendrá que añadir las siguientes etiquetas:

  • <name> nombre del atributo, en nuestro caso <name>nombre</name>.
  • <required> contiene si el atributo es requerido o no es requerido, en nuestro caso <required>false</required>.


Este fichero TagLib.tld podemos llamarlo como queramos y ponerlo donde queramos. Un sitio habitual suele ser en el directorio WEB-INF, así que ahí lo ponemos, en $TOMCAT_HOME/webapp/TagLib/WEB-INF/TagLib.tld


Tocando el fichero web.xml[editar]

Ahora, sólo nos queda en el fichero web.xml que describe nuestra aplicación, indicarle que estamos usando estas etiquetas. Para ello, el fichero web.xml, además de otras cosas, debería tener algo como esto

<!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>Prueba TagLib</display-name>
	<taglib>
	   <taglib-uri>mistags</taglib-uri>
           <taglib-location>/WEB-INF/TagLib.tld</taglib-location>
	</taglib>
</web-app>
  • <web-app> es lo normal del fichero web.xml
  • <display-name> es un nombre para mostrar como nombre de nuestra aplicación.
  • <taglib> para indicar que vamos a usar una librería de tags no estándar.
  • <taglib-uri> el nombre que dimos antes a nuestra librería
  • <taglib-location> el path y nombre del fichero .tld.

El fichero web.xml, como siempre, va en $TOMCAT_HOME/webapp/TagLib/WEB-INF/web.xml

Todo listo[editar]

Una vez preparado todo, en http://localhost:8080/TagLib/index.jsp deberíamos ver un "Hola Mundo".