Sie sind auf Seite 1von 56

Tema 2b - Etiquetas Personalizadas JSP (JSP Custom Tags)

Dr. Diego Lz. de Ipia Gz. de Artaza http://paginaspersonales.deusto.es/dipina http://paginaspersonales.deusto.es/dipina/cursos/J2EECesine.zip dipina@eside.deusto.es

Problemas con JSPs

JavaBeans nos permiten separar la parte de presentacin de una pgina JSP de la implementacin de una regla de negocio

Sin embargo, slo 3 elementos accin en JSP se pueden usar para acceder a un bean:

jsp:useBean jsp:getProperty jsp:setProperty

Por tanto a menudo tenemos que incluir cdigo en un JSP JSP (1.1 en adelante) define custom tags que pueden ser usadas para definir acciones propietarias, de manera que en nuestro JSP nicamente tenemos cdigo de marcado

Caractersticas de las etiquetas personalizadas

Custom tags tienen acceso a todos los objetos disponibles a JSPs

Pueden ser personalizadas usando atributos

Como JavaBeans se centran en reusabilidad de cdigo Custom tags son extensiones de JSP definidas por el usuario Las libreras de etiquetas de JSP son creadas por programadores, expertos en acceder a datos y servicios, y son usadas por diseadores de aplicaciones web especialistas en presentacin

Nuestra primera Etiqueta Personalizada I

Objetivo: construir una etiqueta personalizada que enva el siguiente string al browser: Hello from the custom tag

Nuestra primera Etiqueta Personalizada II

Los siguientes 6 pasos han de seguirse (bajo subdirectorio EjemploCustomTag de webapps)


1.

2.

3.

4.

5.

Crear un fichero TLD con nombre taglib.tld, y guardarlo en WEB-INF Escribir, compilar y depositar la clase MyCustomTag.java debajo del directorio WEBINF/classes Modificar el fichero web.xml aadiendo un elemento <tablib> Crear un JSP (SimplePage.jsp) que utiliza la etiqueta personalizada definida Rearrancar tu contenedor de servlets (Tomcat)

Nuestra primera Etiqueta Personalizada III


1.

Crear un fichero TLD con nombre taglib.tld, y guardarlo en WEB-INF

<?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/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name/> <tag> <name>myTag</name> <tag-class>es.deusto.customtags.example1.MyCustomTag</tagclass> <body-content>empty</body-content> </tag> </taglib>

Nuestra primera Etiqueta Personalizada IV


2. Escribir, compilar y depositar la clase MyCustomTag.java debajo del directorio WEB-INF/classes
package es.deusto.customtags.example1; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class MyCustomTag extends TagSupport { public int doEndTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println("Hello from the custom tag."); } catch (Exception e) { } return super.doEndTag(); }

Nuestra primera Etiqueta Personalizada V


3. Modificar el fichero web.xml aadiendo un elemento <tablib>. Este elemento debe aparecer despus de los elemetos <servlet> y <servlet-mapping>

<!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>template</display-name> <taglib> <taglib-uri>/myTLD</taglib-uri> <taglib-location>/WEBINF/taglib.tld</taglib-location> </taglib> </web-app>

Nuestra primera Etiqueta Personalizada VI


4. Crear un JSP (SimplePage.jsp) que utiliza la etiqueta personalizada definida

<%@ taglib uri="/myTLD" prefix="easy"%> <easy:myTag/> Para compilar la clase he aadido al CLASSPATH:

F:\Deusto\cursos\J2EECesine\tools\jak arta-tomcat-5.5.7\common\lib\jspapi.jar
Se puede eliminar el rol de web.xml escribiendo el nombre y localizacin del TLD directamente en la pgina JSP tenemos que modificar todos los JSP si cambiamos el nombre del TLD

Descriptor de la Librera de Etiquetas (Tag Library Descriptor)

Fichero XML que define una librera de tags y sus etiquetas. Consta de:

Prlogo XML como todo documento XML El elemento raz <taglib>, que tiene como subelementos:

tlib-version versin de la librera de etiquetas jsp-version la versin de JSP, actualmente 2.0 shortname nombre corto para la librera description informacin para documentacin uri enlace a ms informacin sobre tag library tag elemento ms importante, puede haber varios y tiene sub-elementos

Elemento <tag> del descriptor de una librera de etiquetas

Puede tener los siguientes sub-elementos (name and tagclass son los nicos obligatorios):

name identificador de la etiqueta tag-class nombre de la clase completo que realiza el procesamiento de esta etiqueta tei-class clase de ayuda de esta etiqueta body-content el tipo de cuerpo de una etiqueta:

empty no hay cuerpo JSP cuerpo es un conjunto de elementos tagdependent cuerpo debe ser interpretado por la etiqueta

description attribute: cero o ms atributos que puede tener tres subelementos:


name (obligatorio) required: true o false (valor por defecto false) rtexprvalue: determina si el valor de este atributo se puede determinar en tiempo de ejecucin

Uso de etiqueta personalizada en JSP

La directiva taglib en un JSP tiene el siguiente formato:


<%@taglib uri=tagLibraryURI prefix=tagPrefix %> uri especifica una direccin absoluta o relativa que identifica el descriptor de la librera de etiquetas asociado con el prefijo prefix: atributo que se predecer a las acciones personalizadas

Despus de usar la directiva taglib es posible usar una etiqueta personalizada con los siguientes formatos:

<prefix:tagName/> <prefix:tagName>body</prefix:tagName> Para pasar atributos al manejador de la etiqueta hay que usar: attributeName=attributeNameValue <math:power number=12 power=13/>

Example:

La API de Etiquetas Personalizadas

Paquete javax.servlet.jsp.tagext Un manejador de etiquetas (Tag Handler) es una clase que est ligada a una etiqueta personalizada y es invocada cada vez que el contenedor de JSPs encuentra la etiqueta. En JSP 1.2, la clase javax.servlet.jsp.tagext tiene 4 interfaces y 12 clases

Los dos interfaces ms importantes son Tag y BodyTag Estos interfaces dictan el ciclo de vida de un manejador de etiquetas

Manejadores de etiquetas (Tag Handlers)

Un manejador de etiquetas tiene acceso a un API a travs del cual se puede comunicar con una pgina JSP. El punto de entrada a la API es el objeto javax.servlet.jsp.PageContext, a travs del cual el TagHandler puede recuperar todos los otros objetos implcitos (request, session, and application) accesibles desde una pgina JSP. Los objetos implcitos pueden tener atributos con nombre asociados con ellos. Tales atributos son accesibles usando mtodos [set|get]Attribute. Si la etiqueta est anidada, un Tag Handler tambin tiene acceso al Tag Handler (llamado parent) de la etiqueta padre. Un conjunto de clases Tag Handler relacionadas constituyen una tag library y son empaquetadas como un fichero JAR.

El interfaz Tag

Este interfaz define los siguientes mtodos:


doStartTag doEndTag getParent setParent setPageContext release

Ciclo de vida de un Tag Handler I

El contenedor JSP llama a los mtodos de un handler en el siguiente orden:

Obtiene una instancia del pool de TagHandlers o crea uno nuevo. Despus llama a setPageContext que representa a la pgina donde se encontr la custom tag.

public void setPageContext(PageContext pageContext)

Ciclo de vida de un Tag Handler II

El contenedor de JSP llama a setParent, pasndole el objeto Tag que representa a la etiqueta padre de la etiqueta procesada

public void setParent(Tag parent)

El contenedor de JSP asigna todos los atributos de la etiqueta, usando mtodos getter y setter como en JavaBeas. Si se encuentra un atributo temperatura llamar a setTemperatura. El contenedor llama a doStartTag, que puede devolver Tag.SKIP_BODY (el contenedor no debe procesar el cuerpo de la etiqueta) o Tag.EVAL_BODY_INCLUDE (el contenido del cuerpo deber ser procesado)

public int doStartTag() throws javax.servlet.jsp.JspException

Ciclo de vida de un Tag Handler III

El contenedor llama a doEndTag, que devuelve bien Tag.SKIP_PAGE (no procesar el resto del JSP) o Tag.EVAL_PAGE (procesar el resto del JSP)

public int doEndTag throws java.servlet.jsp.JspException

Finalmente, el contenedor de JSPs llama al mtodo release(), donde se pueden liberar recurso (cerrar conexiones)

public void release()

El contenedor devuelve la instancia del manejador de etiquetas a la pool para uso futuro

Usando atributos en una etiqueta personalizada I

Objetivo: Etiqueta personalizada para calcular el doble de un nmero El manejador debe definir un mtodo setNumber para asignar un atributo al valor

Usando atributos en una etiqueta personalizada II


package es.deusto.customtags.example2; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DoublerTag implements Tag { private int number; private PageContext pageContext; public void setNumber(int number) { this.number = number; } public void setParent(Tag t) { } public void setPageContext(PageContext p) { pageContext = p; } public void release() { } public Tag getParent() { return null; } public int doStartTag() { try { JspWriter out = pageContext.getOut(); out.println("Double of " + number + " is " + (2 * number)); } catch (Exception e) { } return EVAL_BODY_INCLUDE; } public int doEndTag() throws JspException { return EVAL_PAGE; } }

Usando atributos en una etiqueta personalizada III

La pgina JSP que llama a DoublerTag es:

<%@ taglib uri="/WEB-INF/taglib.tld" prefix="easy"%> <easy:myTag number=12/>

El fichero TLD es:

<?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/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name/> <tag> <name>myTag</name> <tag-class>es.deusto.customtags.DoublerTag</tag-class> <attribute> <name>number</name> <required>true</required> </attribute> </tag> </taglib>

El interfaz IterationTag

Extiende el interfaz Tag aadiendo un nuevo mtodo doAfterBody, que puede devolver:

Tag.SKIP_BODY el cuerpo se ignora y el contenedor llama a doEndTag IterationTag.EVAL_BODY_AGAIN doAfterBody es llamado de nuevo

Ejemplo IterationTag I

Objetivo: calcular una potencia: 2^3=8

package es.deusto.customtags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class PowerTag //extends TagSupport { implements IterationTag { private private private private private PageContext pageContext; int number; int power; int counter = 0; int result = 1;

// the setter for number public void setNumber(int number) { System.out.println("number: " + number); this.number = number; } public int getNumber() { return this.number; }

Ejemplo IterationTag II
// the setter for power public void setPower(int power) { System.out.println("power: " + power); this.power = power; }

public int getPower() { return this.power; } public void setParent(Tag t) { }


public void setPageContext(PageContext p) { System.out.println("setPageContext"); pageContext = p; }

public void release() { System.out.println("doAfterBody"); }


public Tag getParent() { return null; }

Ejemplo IterationTag III


public int doStartTag() { System.out.println("doStartTag"); return EVAL_BODY_INCLUDE; } public int doAfterBody() { System.out.println("doAfterBody"); counter++; result *= number; if (counter >= power) return SKIP_BODY; else return EVAL_BODY_AGAIN; } public int doEndTag() throws JspException { System.out.println("doEndTag"); try { JspWriter out = pageContext.getOut(); out.println(number + "^" + power + "=" + result); this.counter = 0; this.result = 1; } catch (Exception e) { } return EVAL_PAGE; } }

Ejemplo IterationTag III

JSP para evaluar el cdigo:

<%@ taglib uri="/myTLD" prefix="easy"%> <easy:myTag number="2" power="3">.</easy:myTag>


Fichero TLD:

<?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/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>myTag</short-name> <tag> <name>myTag</name> <tag-class>es.deusto.customtags.PowerTag</tag-class> <body-content>tagdependent</body-content> <attribute> <name>number</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>power</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>

Manipulando el contenido de una etiqueta personalizada


Una etiqueta personalizada puede tener un cuerpo: <%@ taglib uri=/myTLD prefix=x%> <x:theTag>This is the body content</x:theTag> Para manipular el cuerpo de una etiqueta es necesario utilizar BodyTag y BodyContent

La interfaz BodyTag

Extiende la IterationTag con 2 mtodos Tiene un ciclo de vida similar a IterationTag, sin embargo:

doStartTag puede devolver SKIP_BODY, EVAL_BODY_INCLUDE (el cuerpo se evalua como con IterationTag) o EVAL_BODY_BUFFERED (un objeto de tipo BodyContent es creado al cuerpo de la etiqueta personalizada) Llamado despus de doStartTag, seguido de doInitBody, pero no se invoca si:

public void setBodyContent(BodyContent bodyContent)

La custom tag no tiene cuerpo La custom tag tiene cuerpo pero doStartTag devuelve SKIP_BOBY o EVAL_BODY_INCLUDE

public void doInitBody() throws java.servlet.jsp.JspException

No se invoca si se cumple alguna de las mismas condiciones que para setBodyContent

La clase BodyContent

Representa el cuerpo de una etiqueta personalizada

Ejemplo: Codificar el contenido HTML de una etiqueta personalizada y visualizar su contenido en el navegador

Ejemplo de manipulacin del cuerpo de custom tag I


package es.deusto.customtags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class EncoderTag implements BodyTag { PageContext pageContext; BodyContent bodyContent; /* Encode an HTML tag so it will be displayed as it is on the browser. Particularly, this method searches the passed in String and replace every occurrence of the following character: * '<' with "&lt;" * '>' with "&gt;" * '&' with "&amp;" * //'"' with "&quot;" * ' ' with "&nbsp; */ private String encodeHtmlTag(String tag) { if (tag == null) return null; int length = tag.length(); StringBuffer encodedTag = new StringBuffer(2 * length); for (int i = 0; i < length; i++) { char c = tag.charAt(i); if (c == '<') encodedTag.append("&lt;"); else if (c == '>') encodedTag.append("&gt;"); else if (c == '&') encodedTag.append("&amp;"); else if (c == '"') encodedTag.append("&quot;"); //when trying to output text as tag's value as in // values="???". else if (c == ' ') encodedTag.append("&nbsp;"); else encodedTag.append(c);
} return encodedTag.toString();

Ejemplo de manipulacin del cuerpo de custom tag II


public void setParent(Tag t) { } public void setPageContext(PageContext p) { pageContext = p; } public void release() { } public Tag getParent() { return null; } public int doStartTag() { return EVAL_BODY_BUFFERED; } public void setBodyContent(BodyContent bodyContent) { this.bodyContent = bodyContent; } public void doInitBody() { } public int doAfterBody() { String content = bodyContent.getString(); try { JspWriter out = bodyContent.getEnclosingWriter(); out.print(encodeHtmlTag(content)); } catch (Exception e) {} return SKIP_BODY; } public int doEndTag() throws JspException { return EVAL_PAGE; }

Ejemplo de manipulacin del cuerpo de custom tag III


Ejemplo JSP que usa EncoderTag: <%@ taglib uri="/myTLD" prefix="easy"%> <easy:myTag><BR> means change line</easy:myTag>

TLD file: <?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/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name/> <tag> <name>myTag</name> <tag-class>es.deusto.customtags.EncoderTag</tag-class> <body-content>tagdependent</body-content> </tag> </taglib>

Clases de ayuda

Clases que implementan interfaces Tag, IterationTag y BodyTag:

public class TagSupport implements IterationTag, java.io.Serializable public class BodyTagSupport extends TagSupport implements Bodytag

Ahora slo es necesario sobre-escribir los mtodos que quieran utilizarse en el procesamiento de custom tags

Ejemplo con BodyTagSupport I


package es.deusto.customtags; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class CapitalizerTag extends BodyTagSupport { public int doAfterBody() { String content = bodyContent.getString(); try{ JspWriter out = bodyContent.getEnclosingWriter(); out.print(content.toUpperCase()); } catch(Exception e) {} return SKIP_BODY; } }

Ejemplo con BodyTagSupport II


JSP que utiliza CapitalizerTag: <%@ taglib uri="/myTLD" prefix="easy"%> <easy:myTag>See the big picture?</easy:myTag>

Fichero TLD: <?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/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name/> <tag> <name>myTag</name> <tag-class>es.deusto.customtags.CapitalizerTag</tagclass> <body-content>tagdependent</body-content> </tag> </taglib>

Etiquetas anidadas
Cuando dos o ms etiquetas personalizadas estn anidadas es posible obtener una referencia a la clase padre a travs de findAncestorWithClass Ejemplo: OuterTag1 parent1 = (OuterTag1)findAncestorWithClass( this, OuterTag.class);

Variables de script

La clase Tag Extra Info (TEI) se usa para permitir la creacin de variables de script.

Hay que definir en la clase TagExtraInfo el mtodo getVariableInfo Este mtodo crea un array de objetos VariableInfo

Se crear uno de estos objetos por cada variable a definir, especificndose:


Nombre variable Clase de la variable Boolean indicando si habr que crear una nueva variable Scope de la variable: AT_BEGIN variable disponible en interior etiqueta y el resto del JSP NESTED variable disponible en el interior de la etiqueta AT_END variable disponible en el resto del JSP

Ejemplo: definir un iterador I


package es.deusto.customtags; import java.util.Collection; import java.util.Iterator; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.BodyTagSupport; public class IteratorTag extends BodyTagSupport { private Collection collection; private Iterator iterator; private PageContext pageContext; public void setPageContext(PageContext p) { System.out.println("setPageContext"); pageContext = p; }

Ejemplo: definir un iterador II


// the setter for number public void setCollection(Collection collection) { this.collection = collection; } public int doStartTag() throws JspException { return collection.size() > 0 ? EVAL_BODY_BUFFERED : SKIP_BODY; } public void doInitBody() throws JspException { iterator = collection.iterator(); this.pageContext.setAttribute("item", iterator.next()); }

Ejemplo: definir un iterador III


public int doAfterBody() throws JspException { if (iterator == null) { iterator = collection.iterator(); } if (iterator.hasNext()) { this.pageContext.setAttribute("item", iterator.next()); return EVAL_BODY_AGAIN; } else { try { getBodyContent().writeOut(getPreviousOut()); } catch (java.io.IOException e) { throw new JspException(e.getMessage()); } return SKIP_BODY; } } public void release() { collection = null; iterator = null; } }

Ejemplo: definir un iterador IV

Definir un objeto TagExtraInfo

package es.deusto.customtags; import java.util.Collection; import java.util.Iterator; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class IteratorTagInfo extends TagExtraInfo { public VariableInfo[] getVariableInfo(TagData data) { return new VariableInfo[] { new VariableInfo("item", "java.lang.Object", true, VariableInfo.AT_BEGIN) }; } }

Ejemplo: definir un iterador V


<?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/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name/> <tag> <name>iterate</name> <tag-class>es.deusto.customtags.IteratorTag</tag-class> <tei-class>es.deusto.customtags.IteratorTagInfo</tei-class> <body-content>JSP</body-content> <!--<variable> <name-given>item</name-given> <name-from-attribute>item</name-from-attribute> <variable-class>java.lang.String</variable-class> <declare>true</declare> <scope>AT_BEGIN</scope> </variable> <attribute> <name>id</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute>--> <attribute> <name>collection</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>

Ejemplo: definir un iterador VI


<html><head><title>An Iterator</title></head>
<%@ taglib uri="/myTLD" prefix="it"%> <body> <% java.util.Vector vector = new java.util.Vector(); vector.addElement("one"); vector.addElement("two"); vector.addElement("three"); vector.addElement("four"); %> Iterating over <%= vector %> ... <p> <it:iterate collection="<%=vector%>"> Item: <%= item %><br> </it:iterate> </p> </body> </html>

Custom Tags en JSP 2.0

JSP 2.0 permite la declaracin en un fichero TLD de funciones invocables desde cualquier JSP JSP 2.0 define Simple Tag Handler API, apropiada para etiquetas personalizadas donde el cuerpo slo contenga:

Cdigo de marcado Expresiones EL Elementos de accin

Invocando Funciones desde JSPs

La EL de JSP 2.0 permite invocar a un mtodo pblico de una clase usando la siguiente sintxis:
${prefix:methodName(param1, param2, ...)}

La funcin JSP debe ser declarada en un tag library descriptor (TLD): <function> <name>methodName</name> <function-class>className</function-class> <function-signature> returnType methodName(param1Type, param2Type, ...) </function-signature> </function> La clase Java que lo implementa no tiene que utilizar ninguna interfaz especial, el mtodo debe ser pblico y esttico.

Ejemplo Funcin JSP

Revisar ejemplo en: examples\customtag\ej7_static_fun ction_jsp Copiar contenido a webapps\myapp Ejecutar: http://localhost:8080/ej7_static_functio n_jsp/TestFunction.jsp

Ejemplo Simple Tag

Una tag simple debe implementar la interfaz javax.servlet.jsp.tagext.SimpleTag

Hay que aadir elementos setter por cada atributo e implementar doTag

La clase javax.servlet.jsp.tagext.SimpleTagSupport implementa la interfaz Slo se invoca un mtodo no tres como antes: doStartTag(), doAfterBody(), doEndTag()

IMPORTANTE: los elementos de scripting no se permiten en el cuerpo del elemento siempre que la custom tag utilice un simple tag handler Revisar ejemplo customtag\ej8_simpletag\ej8_simpletag

Ejemplo Simple Tag


package com.mycompany.mylib; import java.io.IOException; import java.util.Iterator; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class PollTag extends SimpleTagSupport { private String question; private Map answers; private String votesMapName; private String answersMapName; public void setQuestion(String question) { this.question = question; } public void setAnswers(Map answers) { this.answers = answers; } public void setVotesMapName(String votesMapName) { this.votesMapName = votesMapName; } public void setAnswersMapName(String answersMapName) { this.answersMapName = answersMapName; }

Ejemplo Simple Tag


public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); JspFragment body = getJspBody(); if (body != null) { out.println("<p>"); body.invoke(null); out.println("</p>"); } out.print("Question:"); out.print(question); out.println("<br>"); out.println("<form action=\"result.jsp\" target=\"result\">"); out.print("<input type=\"hidden\" name=\"question\" value=\""); out.print(question); out.println("\">"); out.print("<input type=\"hidden\" name=\"votesMapName\" value=\""); out.print(votesMapName); out.println("\">"); out.print("<input type=\"hidden\" name=\"answersMapName\" value=\""); out.print(answersMapName); out.println("\">"); Iterator i = answers.keySet().iterator(); while (i.hasNext()) { String key = (String) i.next(); String value = (String) answers.get(key); out.print("<input type=\"radio\" name=\"vote\" value=\""); out.print(key); out.print("\">"); out.print(value); out.println("<br>"); } out.println("<input type=\"submit\" value=\"Vote\">"); out.println("</form>"); } }

Ejemplos

Revisar ejemplos en http://localhost:8080/jsp-examples/, JSP 2.0 Examples/SimpleTag Handlers and JSP Fragments

Hello World Tag Repeat Tag

Ficheros Tag en JSP 2.0


JSP 2.0 permite desarrollar una accin propietaria como un fichero de tag (tag file). Un tag file es un fichero de texto donde se utilizan elementos JSP para todas las partes dinmicas

Se diferencia de un JSP en que:


Tiene la misma funcionalidad que un Tag Handler


Tiene extensin .tag Usa una directiva tag en vez de page Permite especificar entrada y salida con directivas vlidas slo en tag files.

Ejemplo de Fichero de Tag


<%@ tag body-content="empty" %> <%@ attribute name="question" required="true" %> <%@ attribute name="answers" required="true" type="java.util.Map" %> <%@ attribute name="votesMapName" required="true" %> <%@ attribute name="answersMapName" required="true" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Question: ${question}<br> <form action="result.jsp" target="result"> <input type="hidden" name="question" value="${question}"> <input type="hidden" name="votesMapName" value="${votesMapName}"> <input type="hidden" name="answersMapName" value="${answersMapName}"> <c:forEach items="${answers}" var="a"> <input type="radio" name="vote" value="${a.key}">${a.value}<br> </c:forEach> <input type="submit" value="Vote"> </form>

Explicacin Fichero Tag

La directiva tag es similar a page


Declara caractersticas generales del fichero. Su atributo body-content indica:


La directiva attribute declara atributos vlidos para la accin definida

empty el elemento XML representando la accin no tiene cuerpo scriptless el cuerpo no puede contener cdigo Java tagdependent el contenedor pasa el cuerpo al evaluador de la tag

Su atributo type indica el tipo de datos, por defecto String

Los Map de respuestas y votos y las preguntas son codificados como campos hidden en el formulario, para as poderse transferir a la pgina procesando los votos

Pgina Procesando Votos


<%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>Poll Results</title> </head> <body bgcolor="white"> <c:set target="${applicationScope[param.votesMapName]}" property="${param.vote}" value="${applicationScope[param.votesMapName][param.vote] + 1}" /> <p> Question: ${param.question}<br> <c:forEach items="${applicationScope[param.answersMapName]}" var="a"> ${a.key}) ${a.value}: ${applicationScope[param.votesMapName][a.key]}<br> </c:forEach> </p> </body> </html>

Utilizando el poll tag


<%@ page contentType="text/html" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="my" tagdir="/WEB-INF/tags/mytags" %> <html> <head> <title>My Page</title> </head> <body bgcolor="white"> <jsp:useBean id="myAnswers" scope="application" class="java.util.TreeMap"> <c:set target="${myAnswers}" property="1" value="Yes" /> <c:set target="${myAnswers}" property="2" value="No" /> <c:set target="${myAnswers}" property="3" value="Maybe" /> </jsp:useBean> <jsp:useBean id="myVotes" scope="application" class="java.util.HashMap" /> ... <p> <my:poll question="Will you start using tag files?" answers="${myAnswers}" answersMapName="myAnswers" votesMapName="myVotes" /> </p> ... </body> </html>

Ejemplos

Revisar ejemplo poll.tag en Revisar ejemplos en examples\customtag\ej9_jsptag http://localhost:8080/jspexamples, seccin JSP 2.0 Examples/Tag Files

Das könnte Ihnen auch gefallen