3.3. Introducción a las librerías de tags


Las librerías de tags (taglibs) son conjuntos de etiquetas HTML personalizadas que permiten encapsular determinadas acciones, mediante un código Java subyacente. Es decir, se define lo que va a ejecutar la etiqueta mediante código Java, y luego se le da un nombre a la etiqueta para llamarla desde las páginas JSP, estableciendo la relación entre el nombre de la etiqueta y el código Java que la implementa. 

Por ejemplo, una página JSP que hace uso de librerías de tags podría tener este aspecto:

<%@ taglib uri="ejemplo" prefix="ej" %>
<html>
<body>
<h1>Ejemplo de librerias de tags</h1>
<ej:mitag>Hola a todos</ej:mitag>
<br>
<ej:otrotag/>
</body>
</html>

donde se utiliza una librería llamada ejemplo, que se simplifica con el prefijo ej, de forma que todos los tags de dicha librería se referencian con dicho prefijo y dos puntos, teniendo la forma ej:tag. Se utilizan así los tags mitag y otrotag.

Para poder utilizar las taglibs necesitamos tener una versión de JSP 1.1 o superior. Veremos a continuación aspectos generales sobre las librerías de tags, para pasar después a ver dos ejemplos concretos de librerías ya hechas. Más adelante veremos cómo crear nuestras propias librerías de tags. 

3.3.1. El gestor de tags

Cuando escribimos un tag (etiqueta) de una librería en una página JSP, un gestor de tags se pone en funcionamiento en el servidor para interactuar entre la página JSP y los objetos relacionados con dicho tag y su librería. 

Dicho gestor de tags no es más que una clase Java que implementa uno de los dos interfaces principales que describen un gestor de tags, en el paquete javax.servlet.jsp.tagext:

La clase contendrá, en los métodos pertinentes, el código que queremos que se ejecute cuando coloquemos el tag. Para utilizar los gestores de tags en las páginas JSP de nuestra aplicación, deberemos colocarlos en el directorio WEB-INF/classes o WEB-INF/lib (dependiendo de si son ficheros .class sueltos o están empaquetados en ficheros JAR).

Normalmente, una librería de tags se compone de varios tags, cada uno con su gestor. Por lo tanto, los gestores de las librerías de tags que utilicemos, los encontraremos empaquetados en un fichero JAR

3.3.2. El descriptor de la librería de tags

El descriptor de la librería de tags (TLD) es un fichero XML (normalmente con extensión .tld) utilizado para interpretar páginas que incluyan dicha librería. Contiene directivas que describen la librería, para poderla utilizar, y mapea las llamadas a los tags en páginas JSP con las clases (gestores de tags) que ejecutan el código.

1. Definición del fichero TLD en el descriptor de despliegue (web.xml)

Para encontrar y utilizar este fichero TLD, se utiliza una etiqueta de tipo taglib en el fichero descriptor de despliegue (web.xml) de nuestra aplicación. Así, para cada librería que se emplee en la aplicación se tendrá un grupo de texto de este tipo en dicho fichero:

<taglib>
	<taglib-uri>identificador</taglib-uri>
	<taglib-location>fichero.tld</taglib-location>
</taglib>

2. Contenido del fichero TLD

Por otra parte, el fichero TLD de la librería tiene un contenido como:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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>pt</shortname>
	<uri>pruebatags</uri>
	<info>Librería de prueba</info> 

	<tag> 
		<name>prueba</name> 
		<tagclass>Prueba</tagclass>
		<bodycontent>empty</bodycontent>
		<info>Tag de prueba</info>
		<attribute> 
			<name>nombre</name>
			<required>false</required>
			<rtexprvalue>false</rtexprvalue>
		</attribute> 	
	</tag>
</taglib>

Se especifica al principio que es un fichero XML, y el DOCTYPE del mismo. La etiqueta raíz del documento es taglib, y dentro contiene, al principio, etiquetas descriptivas (tlibversion, jspversion, shortname, etc). Después tendrá una etiqueta tag por cada tag de la librería, indicando las características del mismo (clase que lo implementa, atributos que puede tener, etc).

3.3.3. Carga de taglibs en ficheros JSP

Para poder utilizar taglibs en ficheros JSP, se colocan al principio del fichero (antes de cualquier acción) directivas del tipo:

<%@ taglib uri="identificador" prefix="prefijo" %>

donde:

3.3.4. Ejemplo genérico

Veremos ahora cómo utilizar una librería de tags. Supongamos que tenemos una librería llamada prueba, de forma que los ficheros Java que la implementan (los gestores de tags) están en un fichero prueba.jar, y el fichero descriptor es prueba.tld. Supongamos que el identificador (el uri) de la librería es prueba, y supongamos que la librería tiene un tag, llamado hola, sin cuerpo, que saca por pantalla el texto "hola a todos".

Para utilizar esta librería en una aplicación web, seguimos los pasos:

<taglib>
	<taglib-uri>prueba</taglib-uri>
	<taglib-location>
		/WEB-INF/prueba.tld
	</taglib-location>
</taglib>
<%@ taglib uri="prueba" prefix="pr" %>

donde el prefix puede ser el que queramos. Con esto, por ejemplo, podemos utilizar la librería así:

<%@ taglib uri="prueba" prefix="pr" %>
<html>
<body>
<pr:hola/>
</body>
</html>

Vemos que el prefijo se utiliza para anteponerlo al nombre de cada tag de la librería, en la forma prefijo:tag.

3.3.5. Ejemplo de librería: request

La librería request es una librería desarrollada en el proyecto Jakarta (los autores de los servidores Apache y Tomcat), y que permite acceder a la información acerca de una petición HTTP realizada. De esta forma podremos acceder a los parámetros de entrada de una petición GET o POST, a las cabeceras HTTP, cookies, etc.

Se tiene información detallada sobre esta librería en:

http://jakarta.apache.org/taglibs/doc/request-doc/intro.html

1. Uso de la librería

Para utilizar la librería request en una aplicación web, seguimos los pasos:

<taglib>
	<taglib-uri>
	http://jakarta.apache.org/taglibs/request-1.0
	</taglib-uri>
	<taglib-location>
	/WEB-INF/request.tld
	</taglib-location>
</taglib>
<%@ taglib 
uri="http://jakarta.apache.org/taglibs/request-1.0" 
prefix="req" %>

donde el prefijo puede ser el que queramos

2. Algunos tags de la librería

Veremos ahora algunos de los tags con los que cuenta esta librería. Para los ejemplos que se verán, suponemos que se ha indicado un prefijo (prefix) "req":

parameter

Obtiene el valor de un parámetro determinado. No tiene cuerpo.

ATRIBUTOS

EJEMPLO

<req:parameter name="param1"/>

parameters 

Recorre toda la lista de parámetros

ATRIBUTOS

  • como parámetro name se pasa el id asignado al tag
  • como parámetro property se pasa la propiedad que se quiere obtener, que pueden ser:
  • name: obtiene el nombre del parámetro
  • value: obtiene el valor del parámetro

EJEMPLO

<req:parameters id="id1">
	Nombre: 
	<jsp:getProperty name="id1" 
	 property="name"/>
	<br>
	Valor: 
	<jsp:getProperty name="id1" 
	 property="value"/>
	<br>
</req:parameters>
<req:parameters id="id1" name="param1">
	Valor: 
	<jsp:getProperty name="id1" 
	 property="value"/>
	<br>
</req:parameters>
parameterValues 

Recorre la lista de valores para un parámetro con múltiples valores. Debe estar incluido dentro de un tag parameters, recorriendo así los valores del parámetro que se esté explorando.

ATRIBUTOS

  • como parámetro name se pasa el id asignado al tag
  • como parámetro property se pasa value, que obtiene el valor del parámetro

EJEMPLO

<req parameters id="id1" name="param1">
	<req:parameterValues id="id2">
		Valor: 
		<jsp:getProperty name="id2" 
		 property="value"/>
		<br>
	</req:parameterValues>
</req:parameters>
equalsParameter

Comprueba si el valor del parámetro coincide con un determinado valor

ATRIBUTOS

EJEMPLO

<req:equalsParameter name="param1" 
 match="hola" value="false">
	El parametro no coincide
</req:equalsParameter>
<req:equalsParameter name="param1" 
 match="hola">
	El parametro si coincide
</req:equalsParameter>
existsParameter 

Comprueba si existe un determinado parámetro 

ATRIBUTOS

EJEMPLO

<req:existsParameter name="param1" 
 value="false">
	El parametro no existe
</req:existsParameter>

3. Ejemplo de uso

Dado el siguiente formulario index.html:

<html>
<body>
	<form action="request.jsp">
		Nombre: 
		<input type="text" name="nombre">
		<br>
		Descripcion: 
		<input type="text" name="descripcion">
		<br>
		<input type="submit" value="Enviar">
	</form>
</body>
</html>

Al validarlo cargamos la página request.jsp, donde tenemos un ejemplo de cómo obtener los valores de los parámetros del formulario:

<%@ taglib 
uri="http://jakarta.apache.org/taglibs/request-1.0" 
prefix="req" %>

<html>
<body>
	Nombre: 
	<req:parameter name="nombre"/>
	<br>
	Descripcion: 
	<req:parameter name="descripcion"/>
	<br>
</body>
</html>

Aquí tenéis un fichero WAR con el ejemplo completo. Utiliza los ficheros TLD y JAR de la librería request, copiados ya en WEB-INF y WEB-INF/lib, respectivamente. Copiad el ejemplo en el directorio webapps de Tomcat, y probadlo con:

http://localhost:8080/ejemplorequest/index.html

3.3.6. Otras librerías de tags

Existen muchas librerías de tags definidas. Podemos encontrar algunas de ellas en:

http://jakarta.apache.org/taglibs/

Otro ejemplo de librería util en esa página es dbtags, que permite conectar con una base de datos y realizar operaciones sobre ella.

JSTL

Se tiene también una librería de tags considerada estándar, y por tanto implementada y optimizada por muchos servidores web. Dicha librería es JSTL (JavaServer Pages Standard Tag Library). Encapsula muchas funcionalidades comunes en aplicaciones JSP, mediante cuatro sub-librerías que tratan 4 ramas concretas:

Se puede encontrar información sober JSTL en:

http://java.sun.com/products/jsp/jstl

3.3.7. Otras consideraciones acerca de las librerías de tags

1. Uso de los tags

Se pueden colocar tags en varios lugares de nuestra página JSP. Podemos por ejemplo establecer un enlace en función de un parámetro:

<a href="http://<req:parameter name="url"/>">Enlace dinamico</a>

2. Comunicación entre JSP y las taglibs

En ocasiones nos puede interesar comunicar código JSP con código de taglibs: obtener dentro de JSP el valor de una taglib, o al revés, por ejemplo. 

Si queremos utilizar código JSP en una taglib, podemos hacerlo sin problemas (siempre que el tag lo permita). Por ejemplo, el siguiente código obtiene un parámetro cuyo nombre se guarda en una variable Java:

<% String nombreParam = "nombre"; %>
<req:parameter name="<%= nombreParam %>"/>

El caso contrario, obtener valores de taglibs dentro de código JSP, es más complejo de tratar. Algunas etiquetas instancian código Java que es directamente accesible desde JSP, con el nombre que se les da en la etiqueta. En otros casos la comunicación no es tan directa, y hay que ver en la documentación del tag en cuestión cómo podemos acceder a su valor.