Está en la página 1de 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. Crear un fichero TLD con nombre taglib.tld, y
guardarlo en WEB-INF
2. Escribir, compilar y depositar la clase
MyCustomTag.java debajo del directorio WEB-
INF/classes
3. Modificar el fichero web.xml aadiendo un elemento
<tablib>
4. Crear un JSP (SimplePage.jsp) que utiliza la etiqueta
personalizada definida
5. 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</tag-
class>
<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>/WEB-
INF/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\jsp-
api.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

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

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 sub-
elementos:
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 tag-
class 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
Example:
<math:power number=12 power=13/>

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 PageContext pageContext;
private int number;
private int power;
private int counter = 0;
private 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)
public void setBodyContent(BodyContent
bodyContent)
Llamado despus de doStartTag, seguido de doInitBody, pero no
se invoca si:
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</tag-
class>
<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
La clase javax.servlet.jsp.tagext.SimpleTagSupport
implementa la interfaz
Hay que aadir elementos setter por cada atributo e
implementar doTag
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
Tiene la misma funcionalidad que un Tag Handler
Se diferencia de un JSP en que:
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:
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
La directiva attribute declara atributos vlidos para la accin
definida
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/jsp-
examples, seccin JSP 2.0
Examples/Tag Files

También podría gustarte