| Creación tradicional de Etiquetas Personalizadas |
| Paso 3: Operativa |
Crear la etiqueta <libreria1:turnoManyana> y su Tag Handler TurnoManyana
Para realizar este cometido tenemos que seguir los siguientes pasos:
Nos situamos en la ventana Projects y con el botón derecho del ratón seleccionamos el proyecto protaghandler. Entonces elegimos new | Other...
En el cuadro de diálogo New Tag Handler introducimos el nombre de la Clase manejadora TurnoManyana en el campo de texto Class Name:
Debido a que queremos que el nuevo Manejador de Etiquetas herede de la Clase javax.servlet.jsp.tagext.BodyTagSupport seleccionamos el radioboton BodyTagSupport. Seguidamente hacemos clic sobre el botón 

en el cuadro de diálogo New File vamos a darle nombre a nuestra etiqueta personalizada y la vamos a incluir en el Descriptor de la Librería de Etiquetas.
para ello mantenemos seleccionado el checkbox Add Corresponding Tag to the Tag Library Descriptor
hacemos clic sobre el botón Browse... y navegamos hasta encontrar el Descriptor de la Librería de Etiquetas libreria1.tld
en el campo de texto Tag Name: introducimos el nombre de la etiqueta turnoManyana
también seleccionamos el radiobotón tagdependent
- empty
- la etiqueta no puede contener cuerpo (body)
- JSP
- el cuerpo (body) de la etiqueta puede ser procesado por la etiqueta
- el Contenedor Web evaluará código JSP que esté contenido en el cuerpo de la etiqueta
- se puede utiliar JSP sólo por razones de compatibilidad con versiones anteriores a la 2.0 de la especificación de las páginas JSP
- tagdependent
- el cuerpo (body) de la etiqueta puede contener cualquier tipo de contendio
- scriptless
- el cuerpo (body) de la etiqueta no puede contener elementos de código (scriptlets)
- si deseáramos utilizar esta opción tendríamos que seleccionar cualquiera de las otras en el asistente de NetBeans y seguidamente escribir scriptless como contenido del elemento <body-content> de nuestro TLD.
Seguidamente hacemos clic sobre el botón 

El asistente ha ampliado el fichero libreria1.tld añadiendo un subelemento llamado <tag> al elemento raíz.
<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>libreria1</short-name>
<uri>/WEB-INF/tlds/libreria1</uri>
<tag>
<name>fechaActual</name>
<tag-class>paqtagext.FechaActual</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
<name>turno1</name>
<tag-class>paqtagext.Turno1</tag-class>
<body-content>tagdependent</body-content>
</tag>
<tag>
<name>fechaActual2</name>
<tag-class>paqtaghandler.FechaActual2</tag-class>
<body-content>empty</body-content>
<attribute>
<name>signoSeparador</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
<tag>
<name>turnoManyana</name>
<tag-class>paqtaghandler.TurnoManyana</tag-class>
<body-content>tagdependent</body-content>
</tag>
</taglib> |
Este es el esqueleto del Manejador de Etiquetas TurnoManyana
package paqtagext;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class TurnoManyana extends BodyTagSupport {
public TurnoManyana() {
super();
}
private void otherDoStartTagOperations() {}
private void otherDoEndTagOperations() {}
private void writeTagBodyContent(JspWriter out, BodyContent bodyContent)
throws IOException {
bodyContent.writeOut(out);
bodyContent.clearBody();
}
public int doStartTag() throws JspException, JspException {
otherDoStartTagOperations();
if (theBodyShouldBeEvaluated()) {
return EVAL_BODY_BUFFERED;
} else {
return SKIP_BODY;
}
}
public int doEndTag() throws JspException, JspException {
otherDoEndTagOperations();
if (shouldEvaluateRestOfPageAfterEndTag()) {
return EVAL_PAGE;
} else {
return SKIP_PAGE;
}
}
public int doAfterBody() throws JspException {
try {
BodyContent bodyContent = getBodyContent();
JspWriter out = bodyContent.getEnclosingWriter();
writeTagBodyContent(out, bodyContent);
} catch (Exception ex) {
handleBodyContentException(ex);
}
if (theBodyShouldBeEvaluatedAgain()) {
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY;
}
}
private void handleBodyContentException(Exception ex) throws JspException {
throw new JspException("error in NewTag: " + ex);
}
private boolean shouldEvaluateRestOfPageAfterEndTag() {
return true;
}
private boolean theBodyShouldBeEvaluatedAgain() {
return false;
}
private boolean theBodyShouldBeEvaluated() {
return true;
}
} |
- public int doStartTag() throws JspException, JspException {
- este método es invocado por el Contenedor Web cuando la etiqueta de principio es encontrada en la página JSP
- la siguiente tabla nos muestra las diferencias existentes cuando este método retorna las variables finales SKIP_BODY y EVAL_BODY_INCLUDE
| doStartTag() |
SKIP_BODY |
EVAL_BODY_BUFFERED |
| Le estamos indicando al Contenedor Web que ignore el contenido que se encuentra entre las etiquetas de principio y de fin. |
Le estamos indicando al Contenedor Web que los datos contenidos entre las etiquetas de principio y de fin sean eviados al Navegador. |
- public int doEndTag() {
- este método es invocado por el Contenedor Web cuando la etiqueta de final es encontrada en la página JSP
- la siguiente tabla nos muestra las diferencias existentes cuando este método retorna las variables finales SKIP_PAGE y EVAL_PAGE
| doEndTag() |
SKIP_PAGE |
EVAL_PAGE |
| Le estamos indicando al Contenedor Web que ignore el resto de la página después de la etiqueta de final. |
Le estamos indicando al Contenedor Web que continue evaluando el resto de la página. |