Tema%202b%20-%20Etiquetas%20Personalizadas%20JSP%20(JSP%20Custom%20Tags) - PowerPoint PPT Presentation

About This Presentation
Title:

Tema%202b%20-%20Etiquetas%20Personalizadas%20JSP%20(JSP%20Custom%20Tags)

Description:

... etiquetas (Tag Handlers) ... conjunto de clases Tag Handler relacionadas constituyen una tag ... JSP llama a los m todos de un handler en el siguiente orden: ... – PowerPoint PPT presentation

Number of Views:286
Avg rating:3.0/5.0
Slides: 57
Provided by: bas54
Category:

less

Transcript and Presenter's Notes

Title: Tema%202b%20-%20Etiquetas%20Personalizadas%20JSP%20(JSP%20Custom%20Tags)


1
Tema 2b - Etiquetas Personalizadas JSP (JSP
Custom Tags)
  • Dr. Diego Lz. de Ipiña Gz. de Artaza
  • http//paginaspersonales.deusto.es/dipina
  • http//paginaspersonales.deusto.es/dipina/cursos/J
    2EECesine.zip
  • dipina_at_eside.deusto.es

2
Problemas con JSPs
  • JavaBeans nos permiten separar la parte de
    presentación de una página JSP de la
    implementación de una regla de negocio
  • Sin embargo, sólo 3 elementos acción en JSP se
    pueden usar para acceder a un bean
  • jspuseBean
  • jspgetProperty
  • jspsetProperty
  • Por tanto a menudo tenemos que incluir código 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 código de marcado

3
Características 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
    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

4
Nuestra primera Etiqueta Personalizada I
  • Objetivo construir una etiqueta personalizada
    que envía el siguiente string al browser Hello
    from the custom tag

5
Nuestra primera Etiqueta Personalizada II
  • Los siguientes 6 pasos han de seguirse (bajo
    subdirectorio EjemploCustomTag de webapps)
  • Crear un fichero TLD con nombre taglib.tld, y
    guardarlo en WEB-INF
  • Escribir, compilar y depositar la clase
    MyCustomTag.java debajo del directorio
    WEB-INF/classes
  • Modificar el fichero web.xml añadiendo un
    elemento lttablibgt
  • Crear un JSP (SimplePage.jsp) que utiliza la
    etiqueta personalizada definida
  • Rearrancar tu contenedor de servlets (Tomcat)

6
Nuestra primera Etiqueta Personalizada III
  • Crear un fichero TLD con nombre taglib.tld, y
    guardarlo en WEB-INF
  • lt?xml version"1.0" encoding"ISO-8859-1"?gt
  • lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN"
  • "http//java.sun.com/dtd/web-jsptaglibrary
    _1_2.dtd"gt
  • lttaglibgt
  • lttlib-versiongt1.0lt/tlib-versiongt
  • ltjsp-versiongt1.2lt/jsp-versiongt
  • ltshort-name/gt
  • lttaggt
  • ltnamegtmyTaglt/namegt
  • lttag-classgtes.deusto.customtags.example1.MyCusto
    mTaglt/tag-classgt
  • ltbody-contentgtemptylt/body-contentgt
  • lt/taggt
  • lt/taglibgt

7
Nuestra primera Etiqueta Personalizada IV
  • 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()

8
Nuestra primera Etiqueta Personalizada V
  • Modificar el fichero web.xml añadiendo un
    elemento lttablibgt. Este elemento debe aparecer
    después de los elemetos ltservletgt y
    ltservlet-mappinggt
  • lt!DOCTYPE web-app PUBLIC "-//Sun Microsystems,
    Inc.//DTD Web Application 2.3//EN"
  • "http//java.sun.com/dtd/web-app_2_3.dtd"gt
  • ltweb-appgt
  • ltdisplay-namegttemplatelt/display-namegt
  • lttaglibgt
  • lttaglib-urigt/myTLDlt/taglib-urigt
  • lttaglib-locationgt/WEB-INF/taglib.tldlt/taglib-loc
    ationgt
  • lt/taglibgt
  • lt/web-appgt

9
Nuestra primera Etiqueta Personalizada VI
  • Crear un JSP (SimplePage.jsp) que utiliza la
    etiqueta personalizada definida
  • lt_at_ taglib uri"/myTLD" prefix"easy"gt
  • lteasymyTag/gt
  • Para compilar la clase he añadido al CLASSPATH
    F\Deusto\cursos\J2EECesine\tools\jakarta-tomcat-5
    .5.7\common\lib\jsp-api.jar
  • 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
  • lt_at_ taglib uri"/WEB-INF/taglib.tld"
    prefix"easy"gt
  • lteasymyTag/gt

10
Descriptor de la Librería de Etiquetas (Tag
Library Descriptor)
  • Fichero XML que define una librería de tags y sus
    etiquetas. Consta de
  • Prólogo XML como todo documento XML
  • El elemento raíz lttaglibgt, que tiene como
    sub-elementos
  • 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

11
Elemento lttaggt del descriptor de una librería 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 más 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
    ejecución

12
Uso de etiqueta personalizada en JSP
  • La directiva taglib en un JSP tiene el siguiente
    formato
  • lt_at_taglib uritagLibraryURI prefixtagPrefix
    gt
  • 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
  • Después de usar la directiva taglib es posible
    usar una etiqueta personalizada con los
    siguientes formatos
  • ltprefixtagName/gt
  • ltprefixtagNamegtbodylt/prefixtagNamegt
  • Para pasar atributos al manejador de la etiqueta
    hay que usar attributeNameattributeNameValue
  • Example
  • ltmathpower number12 power13/gt

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 más importantes son Tag y
    BodyTag
  • Estos interfaces dictan el ciclo de vida de un
    manejador de etiquetas

14
Manejadores de etiquetas (Tag Handlers)
  • 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.PageContext, a través del cual
    el TagHandler 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 setgetAttribute.
  • 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.

15
El interfaz Tag
  • Este interfaz define los siguientes métodos
  • doStartTag
  • doEndTag
  • getParent
  • setParent
  • setPageContext
  • release

16
Ciclo de vida de un Tag Handler I
  • El contenedor JSP llama a los métodos de un
    handler en el siguiente orden
  • Obtiene una instancia del pool de TagHandlers o
    crea uno nuevo. Después llama a setPageContext
    que representa a la página donde se encontró la
    custom tag.
  • public void setPageContext(PageContext
    pageContext)

17
Ciclo de vida de un Tag Handler II
  • El contenedor de JSP llama a setParent, pasándole
    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 métodos 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.J
    spException

18
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.JspExc
    eption
  • Finalmente, el contenedor de JSPs llama al método
    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

19
Usando atributos en una etiqueta personalizada I
  • Objetivo Etiqueta personalizada para calcular el
    doble de un número
  • El manejador debe definir un método setNumber
    para asignar un atributo al valor

20
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

21
Usando atributos en una etiqueta personalizada
III
  • La página JSP que llama a DoublerTag es
  • lt_at_ taglib uri"/WEB-INF/taglib.tld"
    prefix"easy"gt
  • lteasymyTag number12/gt
  • El fichero TLD es
  • lt?xml version"1.0" encoding"ISO-8859-1"?gt
  • lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN"
  • "http//java.sun.com/dtd/web-jsptaglibrary
    _1_2.dtd"gt
  • lttaglibgt
  • lttlib-versiongt1.0lt/tlib-versiongt
  • ltjsp-versiongt2.0lt/jsp-versiongt
  • ltshort-name/gt
  • lttaggt
  • ltnamegtmyTaglt/namegt
  • lttag-classgtes.deusto.customtags.DoublerTaglt/tag-
    classgt
  • ltattributegt
  • ltnamegtnumberlt/namegt

22
El interfaz IterationTag
  • Extiende el interfaz Tag añadiendo un nuevo
    método 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

23
Ejemplo IterationTag I
  • Objetivo calcular una potencia 238
  • 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)

24
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")

25
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 gt power)
  • return SKIP_BODY
  • else
  • return EVAL_BODY_AGAIN
  • public int doEndTag() throws JspException
  • System.out.println("doEndTag")
  • try
  • JspWriter out pageContext.getOut()

26
Ejemplo IterationTag III
  • JSP para evaluar el código
  • lt_at_ taglib uri"/myTLD" prefix"easy"gt
  • lteasymyTag number"2" power"3"gt.lt/easymyTaggt
  • Fichero TLD
  • lt?xml version"1.0" encoding"ISO-8859-1"?gt
  • lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN"
  • "http//java.sun.com/dtd/web-jsptaglibrary
    _1_2.dtd"gt
  • lttaglibgt
  • lttlib-versiongt1.0lt/tlib-versiongt
  • ltjsp-versiongt1.2lt/jsp-versiongt
  • ltshort-namegtmyTaglt/short-namegt
  • lttaggt
  • ltnamegtmyTaglt/namegt
  • lttag-classgtes.deusto.customtags.PowerTaglt/tag-cl
    assgt
  • ltbody-contentgttagdependentlt/body-contentgt

27
Manipulando el contenido de una etiqueta
personalizada
  • Una etiqueta personalizada puede tener un cuerpo
  • lt_at_ taglib uri/myTLD prefixxgt
  • ltxtheTaggtThis is the body contentlt/xtheTaggt
  • Para manipular el cuerpo de una etiqueta es
    necesario utilizar BodyTag y BodyContent

28
La interfaz BodyTag
  • Extiende la IterationTag con 2 métodos
  • 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 después 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

29
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

30
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 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
  • 'lt' with "lt"
  • 'gt' 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 lt length i)
  • char c tag.charAt(i)

31
Ejemplo de manipulación 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()

32
Ejemplo de manipulación del cuerpo de custom tag
III
  • Ejemplo JSP que usa EncoderTag
  • lt_at_ taglib uri"/myTLD" prefix"easy"gt
  • lteasymyTaggtltBRgt means change linelt/easymyTaggt
  • TLD file
  • lt?xml version"1.0" encoding"ISO-8859-1"?gt
  • lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN"
  • "http//java.sun.com/dtd/web-jsptaglibrary
    _1_2.dtd"gt
  • lttaglibgt
  • lttlib-versiongt1.0lt/tlib-versiongt
  • ltjsp-versiongt1.2lt/jsp-versiongt
  • ltshort-name/gt
  • lttaggt
  • ltnamegtmyTaglt/namegt
  • lttag-classgtes.deusto.customtags.EncoderTaglt/tag-
    classgt
  • ltbody-contentgttagdependentlt/body-contentgt
  • lt/taggt
  • lt/taglibgt

33
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 sólo es necesario sobre-escribir los
    métodos que quieran utilizarse en el
    procesamiento de custom tags

34
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.getEnclosingWrit
    er()
  • out.print(content.toUpperCase())
  • catch(Exception e)
  • return SKIP_BODY

35
Ejemplo con BodyTagSupport II
  • JSP que utiliza CapitalizerTag
  • lt_at_ taglib uri"/myTLD" prefix"easy"gt
  • lteasymyTaggtSee the big picture?lt/easymyTaggt
  • Fichero TLD
  • lt?xml version"1.0" encoding"ISO-8859-1"?gt
  • lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN"
  • "http//java.sun.com/dtd/web-jsptaglibrary
    _1_2.dtd"gt
  • lttaglibgt
  • lttlib-versiongt1.0lt/tlib-versiongt
  • ltjsp-versiongt1.2lt/jsp-versiongt
  • ltshort-name/gt
  • lttaggt
  • ltnamegtmyTaglt/namegt
  • lttag-classgtes.deusto.customtags.CapitalizerTaglt/
    tag-classgt
  • ltbody-contentgttagdependentlt/body-contentgt
  • lt/taggt
  • lt/taglibgt

36
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 findAncestorWithClass
  • Ejemplo
  • OuterTag1 parent1 (OuterTag1)findAncestorWithCla
    ss(this, OuterTag.class)

37
Variables de script
  • La clase Tag Extra Info (TEI) se usa para
    permitir la creación de variables de script.
  • Hay que definir en la clase TagExtraInfo el
    método getVariableInfo
  • Este método crea un array de objetos VariableInfo
  • Se creará uno de estos objetos por cada variable
    a definir, especificándose
  • 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

38
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

39
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() gt 0 ?
    EVAL_BODY_BUFFERED SKIP_BODY
  • public void doInitBody() throws JspException
  • iterator collection.iterator()
  • this.pageContext.setAttribute("item",
    iterator.next())

40
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(getPrevi
    ousOut())
  • catch (java.io.IOException e)
  • throw new JspException(e.getMessag
    e())
  • return SKIP_BODY

41
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)

42
Ejemplo definir un iterador V
  • lt?xml version"1.0" encoding"ISO-8859-1"?gt
  • lt!DOCTYPE taglib PUBLIC "-//Sun Microsystems,
    Inc.//DTD JSP Tag Library 1.2//EN"
  • "http//java.sun.com/dtd/web-jsptaglibrary
    _1_2.dtd"gt
  • lttaglibgt
  • lttlib-versiongt1.0lt/tlib-versiongt
  • ltjsp-versiongt1.2lt/jsp-versiongt
  • ltshort-name/gt
  • lttaggt
  • ltnamegtiteratelt/namegt
  • lttag-classgtes.deusto.customtags.IteratorTaglt/tag
    -classgt
  • lttei-classgtes.deusto.customtags.It
    eratorTagInfolt/tei-classgt
  • ltbody-contentgtJSPlt/body-contentgt
  • lt!--ltvariablegt
  • ltname-givengtitemlt/name-givengt
  • ltname-from-attributegtitemlt/name-from-attr
    ibutegt
  • ltvariable-classgtjava.lang.Stringlt/variabl
    e-classgt
  • ltdeclaregttruelt/declaregt
  • ltscopegtAT_BEGINlt/scopegt
  • lt/variablegt

43
Ejemplo definir un iterador VI
  • lthtmlgtltheadgtlttitlegtAn Iteratorlt/titlegtlt/headgt
  • lt_at_ taglib uri"/myTLD" prefix"it"gt
  • ltbodygt
  • lt
  • java.util.Vector vector new java.util.Vector()
  • vector.addElement("one")
  • vector.addElement("two")
  • vector.addElement("three")
  • vector.addElement("four")
  • gt
  • Iterating over lt vector gt ...
  • ltpgt
  • ltititerate collection"ltvectorgt"gt
  • Item lt item gtltbrgt
  • lt/ititerategt
  • lt/pgt

44
Custom Tags en JSP 2.0
  • JSP 2.0 permite la declaración 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
    sólo contenga
  • Código de marcado
  • Expresiones EL
  • Elementos de acción

45
Invocando Funciones desde JSPs
  • La EL de JSP 2.0 permite invocar a un método
    público de una clase usando la siguiente
    sintáxis
  • prefixmethodName(param1, param2, ...)
  • La función JSP debe ser declarada en un tag
    library descriptor (TLD)
  • ltfunctiongt    ltnamegtmethodNamelt/namegt    ltfunct
    ion-classgtclassNamelt/function-classgt    ltfunction
    -signaturegt        returnType methodName(param1Ty
    pe, param2Type, ...)    lt/function-signaturegtlt/f
    unctiongt
  • La clase Java que lo implementa no tiene que
    utilizar ninguna interfaz especial, el método
    debe ser público y estático.

46
Ejemplo Función JSP
  • Revisar ejemplo en examples\customtag\ej7_static_
    function_jsp
  • Copiar contenido a webapps\myapp
  • Ejecutar http//localhost8080/ej7_static_functio
    n_jsp/TestFunction.jsp

47
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 añadir elementos setter por cada atributo
    e implementar doTag
  • Sólo se invoca un método 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_simple
    tag

48
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

49
Ejemplo Simple Tag
  • public void doTag() throws JspException,
    IOException
  • JspWriter out getJspContext().getOut()
  • JspFragment body getJspBody()
  • if (body ! null)
  • out.println("ltpgt")
  • body.invoke(null)
  • out.println("lt/pgt")
  • out.print("Question") out.print(question)
    out.println("ltbrgt")
  • out.println("ltform action\"result.jsp\"
    target\"result\"gt")
  • out.print("ltinput type\"hidden\"
    name\"question\" value\"")
  • out.print(question) out.println("\"gt")
  • out.print("ltinput type\"hidden\"
    name\"votesMapName\" value\"")
  • out.print(votesMapName) out.println("\"gt")
  • out.print("ltinput type\"hidden\"
    name\"answersMapName\" value\"")
  • out.print(answersMapName)
    out.println("\"gt")
  • Iterator i answers.keySet().iterator()
  • while (i.hasNext())
  • String key (String) i.next()

50
Ejemplos
  • Revisar ejemplos en http//localhost8080/jsp-exam
    ples/, JSP 2.0 Examples/SimpleTag Handlers and
    JSP Fragments
  • Hello World Tag
  • Repeat Tag

51
Ficheros Tag en JSP 2.0
  • 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
  • Tiene la misma funcionalidad que un Tag Handler
  • Se diferencia de un JSP en que
  • 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.

52
Ejemplo de Fichero de Tag
  • lt_at_ tag body-content"empty" gt
  • lt_at_ attribute name"question" required"true" gt
  • lt_at_ attribute name"answers" required"true"
  • type"java.util.Map" gt
  • lt_at_ attribute name"votesMapName" required"true"
    gt
  • lt_at_ attribute name"answersMapName"
    required"true" gt
  • lt_at_ taglib prefix"c" uri"http//java.sun.com/jsp
    /jstl/core" gt
  • Question questionltbrgt
  • ltform action"result.jsp" target"result"gt
  • ltinput type"hidden" name"question"
    value"question"gt
  • ltinput type"hidden" name"votesMapName"
    value"votesMapName"gt
  • ltinput type"hidden" name"answersMapName"
    value"answersMapName"gt
  • ltcforEach items"answers" var"a"gt
  • ltinput type"radio" name"vote"
    value"a.key"gta.valueltbrgt
  • lt/cforEachgt
  • ltinput type"submit" value"Vote"gt
  • lt/formgt

53
Explicación Fichero Tag
  • La directiva tag es similar a page
  • Declara características generales del fichero.
  • Su atributo body-content indica
  • 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
  • La directiva attribute declara atributos válidos
    para la acción 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 página
    procesando los votos

54
Página Procesando Votos
  • lt_at_ page contentType"text/html" gt
  • lt_at_ taglib prefix"c" uri"http//java.sun.com/jsp
    /jstl/core" gt
  • lthtmlgt
  • ltheadgt
  • lttitlegtPoll Resultslt/titlegt
  • lt/headgt
  • ltbody bgcolor"white"gt
  • ltcset target"applicationScopeparam.vote
    sMapName"
  • property"param.vote"
  • value"applicationScopeparam.votesMapNa
    meparam.vote 1" /gt
  • ltpgt
  • Question param.questionltbrgt
  • ltcforEach items"applicationScopeparam
    .answersMapName"
  • var"a"gt
  • a.key) a.value
  • applicationScopeparam.votesMapNamea
    .keyltbrgt
  • lt/cforEachgt
  • lt/pgt
  • lt/bodygt

55
Utilizando el poll tag
  • lt_at_ page contentType"text/html" gt
  • lt_at_ taglib prefix"c" uri"http//java.sun.com/jsp
    /jstl/core" gt
  • lt_at_ taglib prefix"my" tagdir"/WEB-INF/tags/mytag
    s" gt
  • lthtmlgt
  • ltheadgt
  • lttitlegtMy Pagelt/titlegt
  • lt/headgt
  • ltbody bgcolor"white"gt
  • ltjspuseBean id"myAnswers"
    scope"application"
  • class"java.util.TreeMap"gt
  • ltcset target"myAnswers" property"1"
    value"Yes" /gt
  • ltcset target"myAnswers" property"2"
    value"No" /gt
  • ltcset target"myAnswers" property"3"
    value"Maybe" /gt
  • lt/jspuseBeangt
  • ltjspuseBean id"myVotes"
    scope"application"
  • class"java.util.HashMap" /gt
  • ...
  • ltpgt

56
Ejemplos
  • Revisar ejemplo poll.tag en Revisar ejemplos en
    examples\customtag\ej9_jsptag
  • http//localhost8080/jsp-examples, sección JSP
    2.0 Examples/Tag Files
Write a Comment
User Comments (0)
About PowerShow.com