Para todo aquel que haya utilizado alguna vez JSP, sabe que con la librería core de JSLT tendremos en la mayoría de las ocasiones las herramientas necesarias para nuestras aplicaciones, pero puede haber casos que no sean suficientes o que nos interese crear nuestras propias etiquetas para nuestras aplicaciones. Veremos ahora paso a paso como crearlas.
Esta acción requiere de dos pasos fundamentales:
- Implementación de la clase manejadora. Por cada tag que queramos crear, deberemos de definir su clase manejadora que implemente las operaciones a realizar por la aplicación.
- Creación del archivo de libería, que contiene la información necesaria para que el contenedor web pueda interpretar esa información.
1. IMPLEMENTACIÓN DE LA CLASE MANEJADORA
La interfaz javax.servlet.jsp.tagext.Tag es la que nos proporciona el soporte para poder crear esta clase manejadora con los elementos mínimos necesarios. También podríamos heredar de la clase javax.servlet.jsp.tagext.TagSupport que ya nos proporciona una implementación de Tag por defecto.
Los métodos que se ejecutan en una durante la ejecución de la acción son:
- void setPageContext(PageContext pc): Es el primer método invocado por el contenedor y permite establecer el contexto de la página actual.
- void setParent (Tag parent): Es el segundo método que se ejecuta en al acción y al que se le pasa el objeto Tag o en su defecto Null.
- int doStartTag(): Se ejecuta una vez que el contenedor detecta la etiqueta de comienzo de la acción. Nos devolverá un número que indicará al contenedor como tratar con el cuerpo de la acción. Los posibles valores son: Tag.EVAL_BODY_INCLUDE, si queremos que se evalue el body de la acción o Tag.SKIP_BODY, si no queremos que evalue el cuerpo.
- int doEndTag(): Se invoca cuando detecta la etiqueta de cierre de la acción. Devolverá un valor que indica al contenedor como tiene que actuar. Los posibles valores son: Tag.EVAL_PAGE, que indica que tienen que evaluar el resto de la página o el valor Tag.SKIP_PAGE, con la que no se evaluará el resto de la página.
2. MOSTRAR LOS RESULTADOS EN LA PÁGINA DE RESPUESTA
Para poder mostrar los resultados de la etiqueta en la página, tenemos que hacer uso de la clase JspWriter, y en concreto haciendo uso de su método getOut(). Por medio pageContext podremos tener acceso al objeto JspWriter.
package ejemplo; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class Saludo extends TagSupport{ public int doStartTag() throws JspException{ try{ JspWriter out=pageContext.getOut(); out.println("Hola Mundo"); } catch(Exception e){ e.printStackTrace(); } return SKIP_BODY; } public int doEndTag(){ return EVAL_PAGE; } }
3. ARCHIVO LIBRERÍA
Este archivo consiste en un archivo XML con extensión .tld, donde indicaremos el conjunto de acciones que queremos que pertenezcan a la libería.
Lo primero que deberemos de indicar es el standar que se utilizará en el documento. En nuestro caso:
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
Luego indicaremos el elemento raiz taglig, y dentro indicaremos todas las etiquetas del documento. Las mas importantes son:
- tlib-version: Número de la versión de la librería.
- jsp-version: Versión de la especificación JSP utilizada por la librería, en nuestro caso 2.0.
- short-name: posible valor elegido para ser utilizado como prefijo.
- uri: es la url asociada a la librería.
- description: Texto descriptivo de la libería.
- tag: definición de una librería. Contendrá los siguientes subelementos:
- name: Nombre de la acción.
- tag-class: Nombre de la clase que define la acción.
- body-content: Información utilizada para determinar como se va a evaluar el cuerpo de la acción.
- description: Descripcion de la acción.
- attribute: define los atributos de la acción. Los posibles elementos serán:
- name. Nombre del atributo
- required. Indica si el atributo es o no obligatorio
- rtexprvalue. Indica si el atributo puede o no ser calculado
dinámicamente utilizando una expresión. - type. Tipo de dato del atributo (nombre cualificado de la clase). Para literales es siempre String.
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/webjsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>ejemplo</short-name> <uri>http://www.milibreria.tld</uri> <description>Ejemplo de librería</description> <tag> <name>saludo</name> <tag-class>ejemplo.Saludo</tag-class> <body-content>empty</body-content> <description>tag de ejemplo</description> </tag> </taglib>
4. UTILIZACIÓN EN LA APLICACIÓN
A la hora de distribuir las clases manejadoras podemos optar por tratar con los .class o, preferiblemente, generar un archivo .jar en el que se incluyan todas estas clases. Tanto en un caso como en otro, las clases tendrán que ser accesibles desde la aplicación Web para lo cual debemos proceder de la siguiente manera según la forma en que se distribuyan las clases:
- Si las clases se distribuyen como .class, todos estos archivos deberán ser incluidos en algún paquete dentro del directorio WEB-INF\classes de la aplicación.
- Si se distribuyen como un archivo .jar, este deberá ser incluido en el directorio WEBINF\lib de la aplicación
En cuanto al archivo de librería .tld, lo más práctico es incluirlo en el .jar junto con las clases manejadoras, aunque podemos situarlo en cualquier subdirectorio de la aplicación (normalmente, dentro de WEB-INF).
Una vez realizadas las operaciones anteriores, para poder usar las acciones de la librería en cualquier página JSP de la aplicación simplemente tendremos que incluir una referencia a la librería a través de la directiva taglib. Por ejemplo para utilizar una libería ya creada, al principio del archivo JSP deberíamos de poner la siguiente línea, sustituyendo el uri, por el que nosotros hayamos indicado.
<%@ taglib uri=“http://www.ejemplolibreria.tld” prefix= “ejemplo”%>
Si el .tld estuviera en el archivo .jar no habría que hacer ninguna otra operación, pero si estuviera situado, por ejemplo, en la ubicación WEB-INF\librerias\ejemplolibreria.tld, sería necesario incluir la siguiente entrada en el archivo web.xml
<web-app> <!--otros elementos--> <taglib> <taglib-uri> http://www.milibreria.tld </taglib-uri> <taglib-location> /WEB-INF/librerias/ejemplolibreria.tld </taglib-location> </taglib>Su uso en un archivo jsp quedaría de la siguiente forma que os indicamos:
<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%> <%@ taglib uri=“http://www.milibreria.tld” prefix=“ejemplo”%>Página de saludo Mensaje de saludo: