Tema 2 b Etiquetas Personalizadas JSP JSP Custom
Tema 2 b - Etiquetas Personalizadas JSP (JSP Custom Tags) Dr. Diego Lz. de Ipiña Gz. de Artaza http: //paginaspersonales. deusto. es/dipina/cursos/J 2 EECesine. zip dipina@eside. deusto. es
Problemas con JSPs n Java. Beans nos permiten separar la parte de presentación de una página JSP de la implementación de una regla de negocio n Sin embargo, sólo 3 elementos acción en JSP se pueden usar para acceder a un bean: n n n jsp: use. Bean jsp: get. Property jsp: set. Property Por tanto a menudo tenemos que incluir código en un JSP (1. 1 en adelante) define custom tags que pueden ser usadas para definir acciones propietarias, de manera que en nuestro JSP únicamente tenemos código de marcado
Características de las etiquetas personalizadas n Custom tags tienen acceso a todos los objetos disponibles a JSPs n n Pueden ser personalizadas usando atributos Como Java. Beans se centran en reusabilidad de código Custom tags son extensiones de JSP definidas por el usuario Las librerías de etiquetas de JSP son creadas por programadores, expertos en acceder a datos y servicios, y son usadas por diseñadores de aplicaciones web especialistas en presentación
Nuestra primera Etiqueta Personalizada I n Objetivo: construir una etiqueta personalizada que envía el siguiente string al browser: “Hello from the custom tag”
Nuestra primera Etiqueta Personalizada II Los siguientes 6 pasos han de seguirse (bajo subdirectorio Ejemplo. Custom. Tag de webapps) n 1. 2. 3. 4. 5. Crear un fichero TLD con nombre taglib. tld, y guardarlo en WEB-INF Escribir, compilar y depositar la clase My. Custom. Tag. java debajo del directorio WEBINF/classes Modificar el fichero web. xml añadiendo un elemento <tablib> Crear un JSP (Simple. Page. 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>my. Tag</name> <tag-class>es. deusto. customtags. example 1. My. Custom. Tag</tagclass> <body-content>empty</body-content> </taglib>
Nuestra primera Etiqueta Personalizada IV 2. Escribir, compilar y depositar la clase My. Custom. Tag. java debajo del directorio WEB-INF/classes package es. deusto. customtags. example 1; import javax. servlet. jsp. *; import javax. servlet. jsp. tagext. *; public class My. Custom. Tag extends Tag. Support { } public int do. End. Tag() throws Jsp. Exception { Jsp. Writer out = page. Context. get. Out(); try { out. println("Hello from the custom tag. "); } catch (Exception e) { } return super. do. End. Tag(); }
Nuestra primera Etiqueta Personalizada V 3. Modificar el fichero web. xml añadiendo un elemento <tablib>. Este elemento debe aparecer después 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-uri>/my. TLD</taglib-uri> <taglib-location>/WEBINF/taglib. tld</taglib-location> </taglib> </web-app>
Nuestra primera Etiqueta Personalizada VI 4. Crear un JSP (Simple. Page. jsp) que utiliza la etiqueta personalizada definida <%@ taglib uri="/my. TLD" prefix="easy"%> <easy: my. Tag/> n Para compilar la clase he añadido al CLASSPATH: F: DeustocursosJ 2 EECesinetoolsjak arta-tomcat-5. 5. 7commonlibjspapi. jar n Se puede eliminar el rol de web. xml escribiendo el nombre y localización del TLD directamente en la página JSP tenemos que modificar todos los JSP si cambiamos el nombre del TLD
Descriptor de la Librería de Etiquetas (Tag Library Descriptor) n Fichero XML que define una librería de tags y sus etiquetas. Consta de: n n Prólogo XML como todo documento XML El elemento raíz <taglib>, que tiene como subelementos: n n n tlib-version versión de la librería de etiquetas jsp-version la versión de JSP, actualmente 2. 0 shortname nombre corto para la librería description información para documentación uri enlace a más información sobre tag library tag elemento más importante, puede haber varios y tiene sub-elementos
Elemento <tag> del descriptor de una librería de etiquetas n Puede tener los siguientes sub-elementos (name and tagclass son los únicos obligatorios): n n 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: n n n description attribute: cero o más atributos que puede tener tres subelementos: n n empty no hay cuerpo JSP cuerpo es un conjunto de elementos tagdependent cuerpo debe ser interpretado por la etiqueta … name (obligatorio) required: true o false (valor por defecto false) rtexprvalue: determina si el valor de este atributo se puede determinar en tiempo de ejecución
Uso de etiqueta personalizada en JSP n La directiva taglib en un JSP tiene el siguiente formato: n n Después de usar la directiva taglib es posible usar una etiqueta personalizada con los siguientes formatos: n n <%@taglib uri=“tag. Library. URI” prefix=“tag. Prefix” %> uri especifica una dirección absoluta o relativa que identifica el descriptor de la librería de etiquetas asociado con el prefijo prefix: atributo que se predecerá a las acciones personalizadas <prefix: tag. Name/> <prefix: tag. Name>body</prefix: tag. Name> Para pasar atributos al manejador de la etiqueta hay que usar: attribute. Name=“attribute. Name. Value” Example: n <math: power number=“ 12” power=“ 13”/>
La API de Etiquetas Personalizadas n n n Paquete javax. servlet. jsp. tagext Un manejador de etiquetas (Tag Handler) es una clase que está ligada a una etiqueta personalizada y es invocada 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 n n Los dos interfaces más importantes son Tag y Body. Tag Estos interfaces dictan el ciclo de vida de un manejador de etiquetas
Manejadores de etiquetas (Tag Handlers) n n Un manejador de etiquetas tiene acceso a un API a través del cual se puede comunicar con una página JSP. El punto de entrada a la API es el objeto javax. servlet. jsp. Page. Context, a través del cual el Tag. Handler puede recuperar todos los otros objetos implícitos (request, session, and application) accesibles desde una página JSP. Los objetos implícitos pueden tener atributos con nombre asociados con ellos. Tales atributos son accesibles usando métodos [set|get]Attribute. Si la etiqueta está anidada, un Tag Handler también 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 n Este interfaz define los siguientes métodos: n n n do. Start. Tag do. End. Tag get. Parent set. Page. Context release
Ciclo de vida de un Tag Handler I n El contenedor JSP llama a los métodos de un handler en el siguiente orden: n Obtiene una instancia del pool de Tag. Handlers o crea uno nuevo. Después llama a set. Page. Context que representa a la página donde se encontró la custom tag. n public void set. Page. Context(Page. Context page. Context)
Ciclo de vida de un Tag Handler II n El contenedor de JSP llama a set. Parent, pasándole el objeto Tag que representa a la etiqueta padre de la etiqueta procesada n n n public void set. Parent(Tag parent) El contenedor de JSP asigna todos los atributos de la etiqueta, usando métodos getter y setter como en Java. Beas. Si se encuentra un atributo temperatura llamará a set. Temperatura. El contenedor llama a do. Start. Tag, 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) n public int do. Start. Tag() throws javax. servlet. jsp. Jsp. Exception
Ciclo de vida de un Tag Handler III n El contenedor llama a do. End. Tag, que devuelve bien Tag. SKIP_PAGE (no procesar el resto del JSP) o Tag. EVAL_PAGE (procesar el resto del JSP) n n Finalmente, el contenedor de JSPs llama al método release(), donde se pueden liberar recurso (cerrar conexiones) n n public int do. End. Tag throws java. servlet. jsp. Jsp. Exception 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 n n Objetivo: Etiqueta personalizada para calcular el doble de un número El manejador debe definir un método set. Number para asignar un atributo al valor
Usando atributos en una etiqueta personalizada II package es. deusto. customtags. example 2; import javax. servlet. jsp. *; import javax. servlet. jsp. tagext. *; public class Doubler. Tag implements Tag { private int number; private Page. Context page. Context; public void set. Number(int number) { this. number = number; } public void set. Parent(Tag t) { } public void set. Page. Context(Page. Context p) { page. Context = p; } public void release() { } public Tag get. Parent() { return null; } public int do. Start. Tag() { try { Jsp. Writer out = page. Context. get. Out(); out. println("Double of " + number + " is " + (2 * number)); } catch (Exception e) { } return EVAL_BODY_INCLUDE; } public int do. End. Tag() throws Jsp. Exception { return EVAL_PAGE; } }
Usando atributos en una etiqueta personalizada III n La página JSP que llama a Doubler. Tag es: <%@ taglib uri="/WEB-INF/taglib. tld" prefix="easy"%> <easy: my. Tag number=“ 12”/> n 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>my. Tag</name> <tag-class>es. deusto. customtags. Doubler. Tag</tag-class> <attribute> <name>number</name> <required>true</required> </attribute> </taglib>
El interfaz Iteration. Tag n Extiende el interfaz Tag añadiendo un nuevo método do. After. Body, que puede devolver: n n Tag. SKIP_BODY el cuerpo se ignora y el contenedor llama a do. End. Tag Iteration. Tag. EVAL_BODY_AGAIN do. After. Body es llamado de nuevo
Ejemplo Iteration. Tag I n Objetivo: calcular una potencia: 2^3=8 package es. deusto. customtags; import javax. servlet. jsp. *; import javax. servlet. jsp. tagext. *; public class Power. Tag //extends Tag. Support { implements Iteration. Tag { private private Page. Context page. Context; int number; int power; int counter = 0; int result = 1; // the setter for number public void set. Number(int number) { System. out. println("number: " + number); this. number = number; } public int get. Number() { return this. number; } …
Ejemplo Iteration. Tag II // the setter for power public void set. Power(int power) { System. out. println("power: " + power); this. power = power; } public int get. Power() { return this. power; } public void set. Parent(Tag t) { } public void set. Page. Context(Page. Context p) { System. out. println("set. Page. Context"); page. Context = p; } public void release() { System. out. println("do. After. Body"); } public Tag get. Parent() { return null; }
Ejemplo Iteration. Tag III public int do. Start. Tag() { System. out. println("do. Start. Tag"); return EVAL_BODY_INCLUDE; } public int do. After. Body() { System. out. println("do. After. Body"); counter++; result *= number; if (counter >= power) return SKIP_BODY; else return EVAL_BODY_AGAIN; } public int do. End. Tag() throws Jsp. Exception { System. out. println("do. End. Tag"); try { Jsp. Writer out = page. Context. get. Out(); out. println(number + "^" + power + "=" + result); this. counter = 0; this. result = 1; } catch (Exception e) { } return EVAL_PAGE; } }
Ejemplo Iteration. Tag III n JSP para evaluar el código: <%@ taglib uri="/my. TLD" prefix="easy"%> <easy: my. Tag number="2" power="3">. </easy: my. Tag> n 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>my. Tag</short-name> <tag> <name>my. Tag</name> <tag-class>es. deusto. customtags. Power. Tag</tag-class> <body-content>tagdependent</body-content> <attribute> <name>number</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <name>power</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </taglib>
Manipulando el contenido de una etiqueta personalizada Una etiqueta personalizada puede tener un cuerpo: <%@ taglib uri=“/my. TLD” prefix=“x”%> <x: the. Tag>This is the body content</x: the. Tag> n Para manipular el cuerpo de una etiqueta es necesario utilizar Body. Tag y Body. Content n
La interfaz Body. Tag n n Extiende la Iteration. Tag con 2 métodos Tiene un ciclo de vida similar a Iteration. Tag, sin embargo: n n do. Start. Tag puede devolver SKIP_BODY, EVAL_BODY_INCLUDE (el cuerpo se evalua como con Iteration. Tag) o EVAL_BODY_BUFFERED (un objeto de tipo Body. Content es creado al cuerpo de la etiqueta personalizada) public void set. Body. Content(Body. Content body. Content) n Llamado después de do. Start. Tag, seguido de do. Init. Body, pero no se invoca si: n n n La custom tag no tiene cuerpo La custom tag tiene cuerpo pero do. Start. Tag devuelve SKIP_BOBY o EVAL_BODY_INCLUDE public void do. Init. Body() throws java. servlet. jsp. Jsp. Exception n No se invoca si se cumple alguna de las mismas condiciones que para set. Body. Content
La clase Body. Content n Representa el cuerpo de una etiqueta personalizada Ejemplo: “Codificar el contenido HTML de una etiqueta personalizada y visualizar su contenido en el navegador” n
Ejemplo de manipulación del cuerpo de custom tag I package es. deusto. customtags; import javax. servlet. jsp. *; import javax. servlet. jsp. tagext. *; public class Encoder. Tag implements Body. Tag { Page. Context page. Context; Body. Content body. Content; /* 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 "< " * '>' with "> " * '&' with "& " * //'"' with "" " * ' ' with " “ */ private String encode. Html. Tag(String tag) { if (tag == null) return null; int length = tag. length(); String. Buffer encoded. Tag = new String. Buffer(2 * length); for (int i = 0; i < length; i++) { char c = tag. char. At(i); if (c == '<') encoded. Tag. append("< "); else if (c == '>') encoded. Tag. append("> "); else if (c == '&') encoded. Tag. append("& "); else if (c == '"') encoded. Tag. append("" "); //when trying to output text as tag's value as in // values="? ? ? ". else if (c == ' ') encoded. Tag. append(" "); else encoded. Tag. append(c); } } return encoded. Tag. to. String();
Ejemplo de manipulación del cuerpo de custom tag II public void set. Parent(Tag t) { } public void set. Page. Context(Page. Context p) { page. Context = p; } public void release() { } public Tag get. Parent() { return null; } public int do. Start. Tag() { return EVAL_BODY_BUFFERED; } public void set. Body. Content(Body. Content body. Content) { this. body. Content = body. Content; } public void do. Init. Body() { } public int do. After. Body() { String content = body. Content. get. String(); try { Jsp. Writer out = body. Content. get. Enclosing. Writer(); out. print(encode. Html. Tag(content)); } catch (Exception e) {} } return SKIP_BODY; } public int do. End. Tag() throws Jsp. Exception { return EVAL_PAGE; }
Ejemplo de manipulación del cuerpo de custom tag III Ejemplo JSP que usa Encoder. Tag: <%@ taglib uri="/my. TLD" prefix="easy"%> <easy: my. Tag><BR> means change line</easy: my. Tag> n 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>my. Tag</name> <tag-class>es. deusto. customtags. Encoder. Tag</tag-class> <body-content>tagdependent</body-content> </taglib> n
Clases de ayuda n Clases que implementan interfaces Tag, Iteration. Tag y Body. Tag: n n n public class Tag. Support implements Iteration. Tag, java. io. Serializable public class Body. Tag. Support extends Tag. Support implements Bodytag Ahora sólo es necesario sobre-escribir los métodos que quieran utilizarse en el procesamiento de custom tags
Ejemplo con Body. Tag. Support I package es. deusto. customtags; import javax. servlet. jsp. *; import javax. servlet. jsp. tagext. *; public class Capitalizer. Tag extends Body. Tag. Support { public int do. After. Body() { String content = body. Content. get. String(); try{ Jsp. Writer out = body. Content. get. Enclosing. Writer(); out. print(content. to. Upper. Case()); } catch(Exception e) {} return SKIP_BODY; } }
Ejemplo con Body. Tag. Support II JSP que utiliza Capitalizer. Tag: <%@ taglib uri="/my. TLD" prefix="easy"%> <easy: my. Tag>See the big picture? </easy: my. Tag> n 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>my. Tag</name> <tag-class>es. deusto. customtags. Capitalizer. Tag</tagclass> <body-content>tagdependent</body-content> </taglib> n
Etiquetas anidadas Cuando dos o más etiquetas personalizadas están anidadas es posible obtener una referencia a la clase padre a través de find. Ancestor. With. Class n Ejemplo: Outer. Tag 1 parent 1 = (Outer. Tag 1)find. Ancestor. With. Class( this, Outer. Tag. class); n
Variables de script n La clase Tag Extra Info (TEI) se usa para permitir la creación de variables de script. n n Hay que definir en la clase Tag. Extra. Info el método get. Variable. Info Este método crea un array de objetos Variable. Info n Se creará uno de estos objetos por cada variable a definir, especificándose: n n Nombre variable Clase de la variable Boolean indicando si habrá que crear una nueva variable Scope de la variable: n AT_BEGIN variable disponible en interior etiqueta y el resto del JSP n NESTED variable disponible en el interior de la etiqueta n 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. Body. Tag. Support; public class Iterator. Tag extends Body. Tag. Support { private Collection collection; private Iterator iterator; private Page. Context page. Context; public void set. Page. Context(Page. Context p) { System. out. println("set. Page. Context"); page. Context = p; } …
Ejemplo: definir un iterador II // the setter for number public void set. Collection(Collection collection) { this. collection = collection; } public int do. Start. Tag() throws Jsp. Exception { return collection. size() > 0 ? EVAL_BODY_BUFFERED : SKIP_BODY; } public void do. Init. Body() throws Jsp. Exception { iterator = collection. iterator(); this. page. Context. set. Attribute("item", iterator. next()); } …
Ejemplo: definir un iterador III public int do. After. Body() throws Jsp. Exception { if (iterator == null) { iterator = collection. iterator(); } if (iterator. has. Next()) { this. page. Context. set. Attribute("item", iterator. next()); return EVAL_BODY_AGAIN; } else { try { get. Body. Content(). write. Out(get. Previous. Out()); } catch (java. io. IOException e) { throw new Jsp. Exception(e. get. Message()); } return SKIP_BODY; } } public void release() { collection = null; iterator = null; } }
Ejemplo: definir un iterador IV n Definir un objeto Tag. Extra. Info package es. deusto. customtags; import java. util. Collection; import java. util. Iterator; import javax. servlet. jsp. *; import javax. servlet. jsp. tagext. *; public class Iterator. Tag. Info extends Tag. Extra. Info { public Variable. Info[] get. Variable. Info(Tag. Data data) { return new Variable. Info[] { new Variable. Info("item", "java. lang. Object", true, Variable. Info. 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. Iterator. Tag</tag-class> <tei-class>es. deusto. customtags. Iterator. Tag. Info</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> </taglib>
Ejemplo: definir un iterador VI <html><head><title>An Iterator</title></head> <%@ taglib uri="/my. TLD" prefix="it"%> <body> <% java. util. Vector vector = new java. util. Vector(); vector. add. Element("one"); vector. add. Element("two"); vector. add. Element("three"); vector. add. Element("four"); %> Iterating over <%= vector %>. . . <p> <it: iterate collection="<%=vector%>"> Item: <%= item %> </it: iterate> </p> </body> </html>
Custom Tags en JSP 2. 0 n n JSP 2. 0 permite la declaración en un fichero TLD de funciones invocables desde cualquier JSP 2. 0 define Simple Tag Handler API, apropiada para etiquetas personalizadas donde el cuerpo sólo contenga: n n n Código de marcado Expresiones EL Elementos de acción
Invocando Funciones desde JSPs n La EL de JSP 2. 0 permite invocar a un método público de una clase usando la siguiente sintáxis: ${prefix: method. Name(param 1, param 2, . . . )} n n La función JSP debe ser declarada en un tag library descriptor (TLD): <function> <name>method. Name</name> <function-class>class. Name</function-class> <function-signature> return. Type method. Name(param 1 Type, param 2 Type, . . . ) </function-signature> </function> La clase Java que lo implementa no tiene que utilizar ninguna interfaz especial, el método debe ser público y estático.
Ejemplo Función JSP n n n Revisar ejemplo en: examplescustomtagej 7_static_fun ction_jsp Copiar contenido a webappsmyapp Ejecutar: http: //localhost: 8080/ej 7_static_functio n_jsp/Test. Function. jsp
Ejemplo Simple Tag n Una tag simple debe implementar la interfaz javax. servlet. jsp. tagext. Simple. Tag n n Hay que añadir elementos setter por cada atributo e implementar do. Tag n n n La clase javax. servlet. jsp. tagext. Simple. Tag. Support implementa la interfaz Sólo se invoca un método no tres como antes: do. Start. Tag(), do. After. Body(), do. End. Tag() 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 customtagej 8_simpletag
Ejemplo Simple Tag package com. mycompany. mylib; import java. io. IOException; import java. util. Iterator; import java. util. Map; import javax. servlet. jsp. Jsp. Exception; import javax. servlet. jsp. Jsp. Writer; import javax. servlet. jsp. tagext. Jsp. Fragment; import javax. servlet. jsp. tagext. Simple. Tag. Support; public class Poll. Tag extends Simple. Tag. Support { private String question; private Map answers; private String votes. Map. Name; private String answers. Map. Name; public void set. Question(String question) { this. question = question; } public void set. Answers(Map answers) { this. answers = answers; } public void set. Votes. Map. Name(String votes. Map. Name) { this. votes. Map. Name = votes. Map. Name; } public void set. Answers. Map. Name(String answers. Map. Name) { this. answers. Map. Name = answers. Map. Name; }
Ejemplo Simple Tag public void do. Tag() throws Jsp. Exception, IOException { Jsp. Writer out = get. Jsp. Context(). get. Out(); Jsp. Fragment body = get. Jsp. Body(); if (body != null) { out. println("<p>"); body. invoke(null); out. println("</p>"); } out. print("Question: "); out. print(question); out. println(" "); 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="votes. Map. Name" value=""); out. print(votes. Map. Name); out. println("">"); out. print("<input type="hidden" name="answers. Map. Name" value=""); out. print(answers. Map. Name); out. println("">"); Iterator i = answers. key. Set(). iterator(); while (i. has. Next()) { 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(" "); } out. println("<input type="submit" value="Vote">"); out. println("</form>"); } }
Ejemplos n Revisar ejemplos en http: //localhost: 8080/jsp-examples/, JSP 2. 0 Examples/Simple. Tag Handlers and JSP Fragments n n Hello World Tag Repeat Tag
Ficheros Tag en JSP 2. 0 n n JSP 2. 0 permite desarrollar una acción 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 dinámicas n n Tiene la misma funcionalidad que un Tag Handler Se diferencia de un JSP en que: n n n Tiene extensión. tag Usa una directiva tag en vez de page Permite especificar entrada y salida con directivas válidas sólo 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="votes. Map. Name" required="true" %> <%@ attribute name="answers. Map. Name" required="true" %> <%@ taglib prefix="c" uri="http: //java. sun. com/jsp/jstl/core" %> Question: ${question} <form action="result. jsp" target="result"> <input type="hidden" name="question" value="${question}"> <input type="hidden" name="votes. Map. Name" value="${votes. Map. Name}"> <input type="hidden" name="answers. Map. Name" value="${answers. Map. Name}"> <c: for. Each items="${answers}" var="a"> <input type="radio" name="vote" value="${a. key}">${a. value} </c: for. Each> <input type="submit" value="Vote"> </form>
Explicación Fichero Tag n La directiva tag es similar a page n n Declara características generales del fichero. Su atributo body-content indica: n n La directiva attribute declara atributos válidos para la acción definida n n empty el elemento XML representando la acción no tiene cuerpo scriptless el cuerpo no puede contener código 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 página procesando los votos
Página Procesando Votos <%@ page content. Type="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="${application. Scope[param. votes. Map. Name]}" property="${param. vote}" value="${application. Scope[param. votes. Map. Name][param. vote] + 1}" /> <p> Question: ${param. question} <c: for. Each items="${application. Scope[param. answers. Map. Name]}" var="a"> ${a. key}) ${a. value}: ${application. Scope[param. votes. Map. Name][a. key]} </c: for. Each> </p> </body> </html>
Utilizando el poll tag <%@ page content. Type="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: use. Bean id="my. Answers" scope="application" class="java. util. Tree. Map"> <c: set target="${my. Answers}" property="1" value="Yes" /> <c: set target="${my. Answers}" property="2" value="No" /> <c: set target="${my. Answers}" property="3" value="Maybe" /> </jsp: use. Bean> <jsp: use. Bean id="my. Votes" scope="application" class="java. util. Hash. Map" />. . . <p> <my: poll question="Will you start using tag files? " answers="${my. Answers}" answers. Map. Name="my. Answers" votes. Map. Name="my. Votes" /> </p>. . . </body> </html>
Ejemplos n n Revisar ejemplo poll. tag en Revisar ejemplos en examplescustomtagej 9_jsptag http: //localhost: 8080/jspexamples, sección JSP 2. 0 Examples/Tag Files
- Slides: 56