Вы находитесь на странице: 1из 29

documentación Inicio > El Tutorial de Java EE 5 > Parte II El nivel Web > Capítulo 8 Etiquetas medida en páginas JSP

El Tutorial de Java EE 5
Anterior: Capítulo 7 de JavaServer Pages Standard Tag Library Siguiente: Capítulo 9 de secuencias de comandos en páginas JSP

Capítulo 8 Etiquetas medida en páginas JSP


Las etiquetas estándar JSP simplifican el desarrollo de páginas JSP y mantenimiento. La tecnología JSP también proporciona un mecanismo para encapsular otros tipos de funcionalidad dinámica en las etiquetas personalizadas, que

son extensiones al lenguaje JSP. Algunos ejemplos de tareas que se pueden realizar mediante etiquetas personalizadas incluyen la operación en objetos implícitos, las formas de procesamiento de bases de datos, acceso y otros

servicios empresariales, tales como correo electrónico y directorios, y la aplicación de control de flujo. Las etiquetas personalizadas aumentan la productividad, ya que pueden ser reutilizados en más de una aplicación. Las etiquetas

personalizadas se distribuyen en una biblioteca de etiquetas, que define un conjunto de etiquetas personalizadas relacionados y contiene los objetos que implementan las etiquetas. El objeto que implementa una etiqueta personalizada

se llama un controlador de etiqueta. La tecnología JSP define dos tipos de controladores de etiquetas: simples y clásicos. controladores de etiquetas simples se pueden utilizar solamente para las etiquetas que no utilizan elementos de

guiones en valores de atributos o el cuerpo de la etiqueta. controladores de etiquetas clásicas se deben utilizar si se requieren elementos de guiones. controladores de etiquetas simples se tratan en este capítulo, y controladores de

etiquetas clásicas se discuten en Capítulo 9, de secuencias de comandos en páginas JSP .

Se puede escribir controladores de etiquetas simples que utilizan el lenguaje JSP o utilizando el lenguaje Java. Un archivo de etiqueta es un archivo de origen que contiene un fragmento reutilizable de código JSP que se traduce en un

simple controlador de etiqueta por el contenedor web. archivos de etiquetas se pueden utilizar para desarrollar etiquetas personalizadas que están centradas en presentación- o que pueden tomar ventaja de las bibliotecas de etiquetas

existentes, o por los autores de páginas que no saben Java. Cuando se necesita la flexibilidad del lenguaje de programación Java para definir la etiqueta, la tecnología JSP proporciona una API simple para el desarrollo de un controlador de

etiqueta en el lenguaje de programación Java. En este capítulo se supone que está familiarizado con el material de Capítulo 5, tecnología JavaServer Pages , Especialmente la sección El uso de etiquetas personalizadas . Para obtener más

información acerca de las bibliotecas de etiquetas y para saber cómo dirigirse a algunas bibliotecas de libre disposición, véase

http://java.sun.com/products/jsp/taglibraries/index.jsp .

¿Qué es una etiqueta personalizada?


Una etiqueta personalizada es un elemento de lenguaje JSP definida por el usuario. Cuando una página JSP que contiene una etiqueta personalizada se traduce en un servlet, la etiqueta se convierte en operaciones en un controlador de etiqueta. El

contenedor web a continuación, invoca las operaciones cuando se ejecuta el servlet de la página JSP. Las etiquetas personalizadas tienen un rico conjunto de características. Ellos pueden

Personalizar a través de los atributos pasados ​desde la página de llamada. Pasar variables de nuevo a

la página de llamada. Acceder a todos los objetos disponibles en las páginas JSP.

Comunicarse entre sí. Puede crear e inicializar un componente JavaBeans, cree una variable EL pública que se refiere a que el frijol en una etiqueta, y luego usar el frijol en otra etiqueta.

Anidarse unos dentro de otros y comunicarse por medio de variables privadas.

El Ejemplo páginas JSP


En este capítulo se describen las tareas involucradas en la definición de etiquetas simples. Ilustra las tareas utilizando extractos de la versión JSP de la aplicación de librería de Duke discutido en El

Ejemplo páginas JSP , Reescrito para aprovechar varias etiquetas personalizadas: Un catalogar etiqueta para la prestación del catálogo de libros Un fecha de envío etiqueta para la prestación de la

fecha de envío de un pedido

Una biblioteca de plantillas para asegurar una apariencia común entre todas las pantallas y componer las pantallas de trozos de contenido Las tutorial-plantilla biblioteca etiqueta define un conjunto de etiquetas

para la creación de una plantilla de aplicación. La plantilla es una página JSP que tiene marcadores de posición para las partes que tienen que cambiar con cada pantalla. Cada uno de estos marcadores de posición se

conoce como un parámetro de la plantilla. Por ejemplo, una plantilla simple podría incluir un parámetro de título para la parte superior de la pantalla generada y un parámetro de cuerpo para hacer referencia a una página

JSP para el contenido personalizado de la pantalla. La plantilla se crea utilizando un conjunto de etiquetas anidadas ( definición , pantalla , y parámetro ) que se utilizan para construir una tabla de definiciones de pantalla

de la librería de Duke. Un insertar etiqueta para insertar los parámetros de la tabla en la pantalla.

Figura 8-1 muestra el flujo de una solicitud a través de los siguientes componentes web de la librería de Duke:
tut-install / javaeetutorial5 / examples / web / bookstore3 / web / plantilla / template.jsp , que determina la estructura de cada pantalla. Utiliza el insertar etiqueta para componer una pantalla de
subcomponentes.

tut-install / javaeetutorial5 / examples / web / bookstore3 / web / plantilla / screendefinitions.jspf , que define los subcomponentes utilizados por cada pantalla. Todas las pantallas tienen la misma
bandera pero diferente contenido de títulos y el cuerpo (especificado por la columna de páginas JSP en Figura 5-1 ).

Tut instalar / javaeetutorial5 / examples / web / bookstore3 / src / java / com / sun / bookstore3 / distribuidor / Dispatcher.java , un servlet, que procesa solicitudes y hacia delante para template.jsp .

Figura 8-1 Solicitud de flujo a través de los componentes de la librería de Duke

El código fuente de la aplicación de librería de Duke está situado en el tut-install / javaeetutorial5 / examples / web / bookstore3 /
directorio creado al descomprimir el paquete tutorial (véase Capítulo 2, utilizando los ejemplos Tutorial ). Para desplegar y ejecutar la

aplicación utilizando el IDE NetBeans, siga estos pasos:

1. Llevar a cabo todas las operaciones descritas en Acceso a bases de datos de aplicaciones Web .

2. En el IDE NetBeans, seleccione Archivo-> Abrir proyecto.

3. En el cuadro de diálogo Abrir proyecto, vaya a:

tut-install / javaeetutorial5 / examples / web /

4. Seleccione el bookstore3 carpeta.

5. Seleccione la casilla de verificación Abrir como proyecto principal y los proyectos abiertos casilla de verificación requiere.

6. Haga clic en Abrir proyecto.

7. En la ficha Proyectos, haga clic en el bookstore3 proyecto y seleccione Deploy.

8. Para ejecutar la aplicación, abra la dirección URL librería http: // localhost: 8080 / bookstore3 / librería .

Para desplegar y ejecutar la aplicación utilizando Ant, siga estos pasos:

1. En una ventana de terminal, vaya a tut-install / javaeetutorial5 / examples / web / bookstore3 / .

2. Tipo hormiga . Este comando engendrará todas las compilaciones necesarias, copiar archivos en el gesto de desaprobación-

instalar/ javaeetutorial5 / examples / web / bookstore3 / build / directorio, y crear un archivo WAR y copiarlo en el Tut instalar / javaeetutorial5 / examples / web / bookstore3 / dist / directorio.

3. Iniciar el servidor de aplicaciones.

4. Llevar a cabo todas las operaciones descritas en Creación de un origen de datos en el servidor de aplicaciones .

5. Para desplegar el ejemplo, escriba ant deploy . El objetivo implementar da salida a una URL para ejecutar la aplicación. No haga caso de este URL, y en lugar de utilizar
la que se muestra en la siguiente etapa.

6. Para ejecutar la aplicación, abra la dirección URL librería http: // localhost: 8080 / bookstore3 / librería .

Para aprender cómo configurar el ejemplo, consulte la web.xml archivo, que incluye las siguientes configuraciones:

UN nombre para mostrar elemento que especifica el nombre que utilizan herramientas para identificar la aplicación. UN context-param elemento que especifica el nombre

de la base del paquete de recursos JSTL. UN oyente elemento que identifica la ContextListener clase utiliza para crear y eliminar el acceso a la base de datos. UN servlet elemento

que identifica la Transportista ejemplo.


Un conjunto de servlet-mapping elementos que se asignan Transportista a patrones de URL para cada una de las páginas JSP en la aplicación. Anidado dentro de una jsp-config elemento es una jsp-property-group

elemento, que establece las propiedades para el grupo de páginas incluidas en esta versión de la librería de Duke. Ver Configuración de las propiedades de los grupos de páginas JSP para más

información. Para ejecutar el ejemplo, abra la URL librería http: // localhost: 8080 / bookstore3 / librería .

Ver Solución de problemas de base de datos de la librería de Duke para obtener ayuda con el diagnóstico de problemas comunes.

Tipos de etiquetas
etiquetas simples se invocan utilizando la sintaxis XML. Tienen una etiqueta de inicio y una etiqueta final, y posiblemente un cuerpo:

<Tt: tag>
cuerpo </ TT: tag>

Una etiqueta personalizada con ningún cuerpo se expresa de la siguiente manera:

<Tt: tag /> o <tt: tag> </ tt: tag>

Etiquetas con los atributos

Una etiqueta simple puede tener atributos. Atributos personalizar el comportamiento de una variable medida solo como parámetros personalizar el comportamiento de un método. Hay tres tipos de atributos:

Fragmento atributos

simples atributos atributos

dinámicos

Atributos simples
atributos simples son evaluados por el envase antes de ser enviado al controlador de etiqueta. simples atributos enumerados en la etiqueta de inicio y tienen la sintaxis attr = "valor" . Se puede establecer un

valor de atributo simple a partir de una Cuerda constante, o un lenguaje de expresión (EL) la expresión, o mediante el uso de una jsp: atributo elemento (ver jsp: atributo Elemento ). El proceso de conversión

entre las constantes y expresiones y tipos de atributos sigue las reglas descritas para propiedades de los componentes JavaBeans en Configuración de componentes JavaBeans Propiedades . página de la

librería de Duke tut-install / javaeetutorial5 / examples / web / bookstore3 / web / bookcatalog.jsp llama a la

catalogar etiqueta, que tiene dos atributos. El primer atributo, una referencia a un objeto de base de datos de libro, se establece mediante una expresión EL. El segundo atributo, que establece el color de
las filas de una tabla que representa el catálogo de librería, se establece con una Cuerda constante.

<sc: Catálogo de BookDB = "$ {} BookDB" color = "# cccccc">

atributos de los fragmentos


Un fragmento JSP es una porción de código JSP pasa a un controlador de etiqueta que se puede invocar tantas veces como sea necesario. Se puede pensar en un fragmento como una plantilla que se utiliza por un controlador de

etiqueta para producir contenido personalizado. Por lo tanto, a diferencia de un atributo simple que se evalúa por el contenedor, un atributo fragmento es evaluado por un controlador de etiqueta durante la invocación etiqueta. Para

declarar un atributo fragmento, se utiliza el fragmento atributo de la atributo Directiva (véase La declaración de atributos de etiqueta en archivos de etiquetas ) O utilizar el fragmento subelemento del atributo elemento de dominio de

nivel superior (véase La declaración de atributos de etiqueta para los controladores de etiquetas ). Se define el valor de un atributo fragmento utilizando una jsp: atributo elemento. Cuando se usa para especificar un atributo

fragmento, el cuerpo de la jsp: atributo elemento puede contener sólo texto estático y etiquetas estándar y personalizados; que no puede contener elementos de secuencias de comandos (ver Capítulo 9, de secuencias de comandos

en páginas JSP ). fragmentos JSP se pueden parametrizar por medio de lenguaje de expresión (EL) variables en el código JSP que compone el fragmento. Las variables de EL son fijados por el controlador de etiqueta, lo que

permite al controlador de personalizar el fragmento cada vez que se invoca (ver Declaración de variables del Tag en Tag Archivos y Declaración de variables de la etiqueta de controladores de etiquetas ). los catalogar etiqueta se

discutió anteriormente acepta dos fragmentos: precio normal , que se muestra para un producto que es el precio completo, y en venta ,

el que se muestra para un producto que está en venta.

<sc: Catálogo de BookDB = "$ {} BookDB" color = "# cccccc">


<Jsp: atributo name = "normalPrice">
<Fmt: FormatNumber value = "$ {} precio" type = "moneda" /> </ jsp: attribute>

<Jsp: nombre del atributo = "onSale">


<Strike> <fmt: valor formatNumber = "$ {} precio"
type = "moneda" /> </ strike> <br/>
<font color = "red"> <fmt: FormatNumber value = "$ {}" salePrice
type = "moneda" /> </ font>
</ Jsp: attribute> </ sc:
catálogo>

La etiqueta ejecuta el precio normal fragmento, usando los valores para el precio EL variables, si el producto es el precio completo. Si el producto está a la venta, la etiqueta ejecuta el en venta fragmento
usando el precio y precio de venta variables.

Los atributos dinámicos


Un atributo dinámico es un atributo que no está especificado en la definición de la etiqueta. atributos dinámicos se utilizan sobre todo por las etiquetas cuyos atributos son tratados de una manera uniforme, pero
cuyos nombres no se conozca necesariamente en el tiempo de desarrollo.

Por ejemplo, esta etiqueta acepta un número arbitrario de atributos cuyos valores son los colores y da salida a una lista con viñetas de los atributos de color de acuerdo a los valores:

<Color: color1 color = "red" color2 = "amarilla" color3 = "blue" />

También puede establecer el valor de los atributos dinámicos utilizando una expresión EL o el uso de la jsp: atributo elemento.

Valor diferida
Un atributo de valor diferida es uno que acepta expresiones de valor diferidos, que se describen en expresiones de valor .

Método diferido
Un atributo de método de lo diferido es uno que acepta expresiones método de lo diferido, que se describen en método Expresiones .

Atributo dinámico o Expresión diferido


Este tipo de atributo puede aceptar una cadena literal, una expresión scriptlet o una expresión EL, incluyendo expresiones diferidos.

jsp: atributo Elemento


los jsp: atributo elemento permite definir el valor de un atributo de etiqueta en el cuerpo de un elemento XML en lugar de en el valor de un atributo XML.

Por ejemplo, página de la plantilla de librería de Duke screendefinitions.jsp usos jsp: atributo utilizar la salida de fmt: message para establecer el valor de la valor atributo de la tt: parámetro :

. . .
<Tt: pantalla id = "/ BOOKCATALOG">
<Tt: parámetro name = "título" directa = "true">
<Jsp: atributo name = "valor">
<Fmt: clave de mensaje = "TitleBookCatalog" /> </ jsp: attribute> </ tt:
parámetro>

<Tt: parámetro de nombre = valor "bandera" = "/ template / banner.jsp"


directa = "false" />
<Tt: parámetro de nombre = valor "cuerpo" = "/ bookcatalog.jsp"
directa = "false" />
</ Tt: Pantalla>
. . .

jsp: atributo acepta una nombre atributo y una recortar atributo. los nombre atributo identifica que se está especificando atributo de etiqueta. el opcional recortar atributo determina si o no el espacio en blanco

que aparece al principio y al final del cuerpo del elemento debe ser desechada. Por defecto, el espacio en blanco ataque y de salida se descarta. El espacio en blanco se recorta cuando se traduce la página

JSP. Si un cuerpo contiene una etiqueta personalizada que produce iniciales o finales espacios en blanco, espacio en blanco que se conserva independientemente del valor de la recortar atributo. Un cuerpo

vacío es equivalente a especificar "" como el valor del atributo. El cuerpo de jsp: atributo está restringida de acuerdo con el tipo de atributo que se especifica:

Para los atributos simples que aceptan una expresión EL, el cuerpo puede ser cualquier contenido JSP. Para los atributos simples que no aceptan una expresión EL, el cuerpo puede

contener sólo texto estático. Para los atributos de fragmentos, el cuerpo no debe de contener elementos de secuencias de comandos (ver Capítulo 9, de secuencias de comandos en

páginas JSP ).

Etiquetas con los Cuerpos


Una simple etiqueta puede contener etiquetas personalizadas y de núcleo, el texto HTML y contenido cuerpo de la etiqueta dependiente entre la etiqueta de inicio y la etiqueta final. En el siguiente

ejemplo, página de la aplicación de librería de Duke Tut instalar / javaeetutorial5 / examples / web / bookstore3 / web / bookshowcart.jsp usa el JSTL c: si etiqueta para imprimir el cuerpo si la solicitud

contiene un parámetro llamado Claro :

<C: si la prueba = "$ {} param.Clear">


<Font color = "# FF0000" size = "+ 2"> <strong> acaba de borrar su carrito de
compras! </ Strong> Hotel & nbsp; <br> </ font> </ c: if>

jsp: body Elemento


También puede especificar explícitamente el cuerpo de una etiqueta sencilla mediante el uso de la jsp: body elemento. Si uno o más atributos se especifican con el
jsp: atributo elemento, entonces jsp: body es la única manera de especificar el cuerpo de la etiqueta. Si uno o más jsp: atributo elementos aparecen en el cuerpo de una invocación de la etiqueta, pero que no
incluyen una jsp: body elemento, la etiqueta tiene un cuerpo vacío.
Etiquetas que definen las variables
Una etiqueta simple puede definir una variable de EL que se puede utilizar dentro de la página de llamada. En el siguiente ejemplo, el iterador etiqueta establece el valor de la variable EL Nombre de Departamento ya que itera
a través de una colección de nombres de departamento.

<TLT: iterador var = tipo "DepartmentName" = "java.lang.String"


group = "$ {} myorg.departmentNames"> <tr> <Td> <a

href="list.jsp?deptName=${departmentName}">
$ {} DepartmentName </a> </ td>
</ Tr>
</ TLT: iterador>

La comunicación entre las etiquetas


Las etiquetas personalizadas se comunican entre sí a través de objetos compartidos. Hay dos tipos de objetos compartidos: públicas y privadas. En el siguiente ejemplo, el c: set etiqueta

crea una variable llamada EL pública una variable , que luego se reutiliza por anotherTag .

<C: set var = "AVariable" value = "unValor" /> <tt: anotherTag attr1 = "$ {}
AVariable" />

Las etiquetas anidadas pueden compartir objetos privados. En el siguiente ejemplo, un objeto creado por outerTag está disponible para innerTag . La etiqueta interior recupera su etiqueta principal y a continuación,
recupera un objeto de la matriz. Dado que el objeto no se nombra, el potencial de conflictos de nombres se reduce.

<Tt: outerTag>
<Tt: innerTag /> </ tt:
outerTag>

página de la librería de Duke tut-install / javaeetutorial5 / examples / web / bookstore3 / web / plantilla / template.jsp utiliza un conjunto de etiquetas que comparten objetos públicos y privados para definir las
pantallas de la aplicación cooperar. Estas etiquetas se describen en Una biblioteca de plantillas de etiquetas .

Encapsular contenido reutilizable utilizando ficheros de etiquetas


Un archivo de etiqueta es un archivo de origen que contiene un fragmento de código JSP que es reutilizable como una etiqueta personalizada. archivos de etiquetas permiten crear etiquetas personalizadas usando la sintaxis JSP. Al igual que una página

JSP se traduce en una clase de servlet y luego compilado, un fichero de etiquetas se traduce en un controlador de etiqueta y luego compilado. La extensión de archivo recomendado para un archivo de etiqueta es . etiqueta . Como es el caso con los

archivos JSP, la etiqueta puede estar compuesto de un archivo de la parte superior que incluye otros archivos que contienen ya sea una etiqueta completa o un fragmento de un archivo de etiquetas. Del mismo modo que la extensión recomendada para

un fragmento de un archivo JSP es . jspf , la extensión recomendada para un fragmento de un archivo de etiqueta es . tagF .

La siguiente versión de la aplicación Hello, World introducido en Capítulo 3, Introducción a las aplicaciones Web utiliza una etiqueta para generar la respuesta. los respuesta etiqueta, que acepta dos
atributos (una cadena saludo y un nombre) se encapsula en response.tag :

<% @ Atributo name = "saludo" requerido = "true" %> <% @ atributo name = "nombre" requerido = "true" %>
<h2> <font color = "negro"> $ {saludo}, $ { nombre}! </ font> </ h2>

La línea resaltada en el greeting.jsp invoca la página respuesta etiqueta si la longitud de la nombre de usuario parámetro de petición es mayor que
0:

<% @ Taglib tagdir = "/ WEB-INF / tags" prefix = "h" %> <% @ taglib uri =
"http://java.sun.com/jsp/jstl/core"
prefix = "c" %>
<% @ Taglib uri = "http://java.sun.com/jsp/jstl/functions"
prefijo = "fn" %> <html>

<Head> <title> Hola </ title> </ head> <body bgcolor = "blanco">
<img src = "duke.waving.gif">

<C: set var = "saludo" value = "Hola" />


<H2> $ {} saludo, mi nombre es Duke. Cuál es la tuya? </ H2> <form method = "get">

<Input type = "text" name = tamaño "nombre de usuario" = "25"> <p> </ p>

<Input type = "submit" value = "Enviar"> <input type = "reset" value =


"Reset"> </ form>

<C: Si la prueba = "$ {fn: longitud (param.username)> 0}">


<H: respuesta saludo = "$ {} saludo"
name = "$ {} param.username" /> </ c: if>
</ Body> </
html>

Para desplegar y ejecutar el hello3 aplicación con el IDE NetBeans, siga estos pasos:

1. En el IDE NetBeans, seleccione Archivo-> Abrir proyecto.

2. En el cuadro de diálogo Abrir proyecto, vaya a:


tut-install / javaeetutorial5 / examples / web /

3. Seleccione el hello3 carpeta.

4. Seleccione la casilla de verificación Abrir como proyecto principal.

5. Haga clic en Abrir proyecto.

6. En la ficha Proyectos, haga clic en el hello3 proyecto y seleccione Deploy.

7. Para ejecutar la aplicación, abra la dirección URL librería http: // localhost: 8080 / hello3 .

Para desplegar y ejecutar el hello3 aplicación con Ant, siga estos pasos:

1. En una ventana de terminal, vaya a tut-install / javaeetutorial5 / examples / web / hello3 / .

2. Tipo hormiga . Este objetivo engendrará todas las compilaciones necesarias, copiar archivos en el gesto de desaprobación-

instalar/ javaeetutorial5 / examples / web / hello3 / build / directorio, y crear un archivo WAR.

3. Iniciar el servidor de aplicaciones.

4. Para implementar el ejemplo, el tipo de ant deploy .

5. Para ejecutar el ejemplo, abra su navegador para http: // localhost: 8080 / hello3 .

Para aprender cómo configurar el ejemplo, consulte el descriptor de despliegue (la web.xml archivo), que incluye las siguientes configuraciones:

UN nombre para mostrar elemento que especifica el nombre que utilizan herramientas para identificar la aplicación. UN welcome-file-list elemento

diferenciador de una página en particular para ser un archivo de bienvenida.

Archivo de etiquetas Localización


archivos de etiquetas se pueden colocar en uno de dos lugares: en el / WEB-INF / tags / directorio o subdirectorio de una aplicación web o en un archivo JAR (véase
Tag empaquetado de archivos ) en el / WEB-INF / lib / directorio de una aplicación web. archivos de etiquetas envasados ​requieren un descriptor de biblioteca de etiquetas (ver Descriptores biblioteca de etiquetas ), Un documento
XML que contiene información acerca de una biblioteca en su conjunto y de cada etiqueta contenida en la biblioteca. archivos de etiquetas que aparecen en cualquier otro lugar no se consideran extensiones de etiqueta y son
ignorados por el contenedor web.

Directivas de identificación de ficheros


Directivas se utilizan para controlar aspectos de la traducción de archivos etiqueta a un controlador de etiqueta, y para especificar los aspectos de la etiqueta, los atributos de la etiqueta, y las variables expuestas por la etiqueta. Tabla 8-1 enumera las

directivas que se pueden utilizar en los archivos de etiquetas. Tabla 8-1 Directivas de archivos de etiquetas

Directiva Descripción

taglib Idéntico a taglib Directiva (véase La declaración de las bibliotecas de códigos ) Para las páginas JSP.

incluir Idéntico a incluir Directiva (véase Reutilizar contenido en páginas JSP ) Para las páginas JSP. Tenga en cuenta que si el archivo incluido contiene una sintaxis no aptos para archivos de etiquetas, se

producirá un error de traducción.

etiqueta Similar a página la directiva en una página JSP, pero se aplica a etiquetar los archivos en lugar de las páginas JSP. Al igual que con la página Directiva, una unidad de traducción puede contener

más de una instancia de la etiqueta directiva. Todos los atributos se aplican a la unidad de traducción completa. Sin embargo, no puede haber una sola ocurrencia de cualquier atributo o valor

definido por esta directiva en una unidad de traducción dada. Con la excepción de la importar atributo, atributo múltiple o (re) definiciones de valores dan lugar a un error de traducción. También se

utiliza para la declaración de propiedades de etiquetas personalizadas, como nombre para mostrar. Ver La declaración de Etiquetas .

atributo Declara un atributo de la etiqueta personalizada definida en el archivo de etiquetas. Ver La declaración de atributos de etiqueta en archivos de etiquetas .

variable Declara una variable EL expuesta por la etiqueta a la página de llamada. Ver Declaración de variables del Tag en Tag Archivos .

La declaración de Etiquetas
los etiqueta Directiva es similar a la directiva de página de la página JSP, pero se aplica a etiquetar los archivos. Algunos de los elementos de la etiqueta Directiva aparece en la
etiqueta elemento de un TLD (ver La declaración de controladores de etiquetas ). Tabla 8-2 enumera los atributos directiva tag. Tabla 8-2 etiqueta Atributos

Directiva

Atributo Descripción

nombre para mostrar (Opcional) Un nombre corto que está destinado a ser visualizado por las herramientas. Por defecto es el nombre del archivo sin la extensión de etiqueta . etiqueta .

cuerpo de contenido (Opcional) Proporciona información sobre el contenido del cuerpo de la etiqueta. Pueden ser cualquiera de los dos vacío , tagdependent , o
scriptless . Un error de traducción resultará si JSP o se utiliza cualquier otro valor. Por defecto es scriptless . Ver Atributo contenido cuerpo- .

atributos (Opcional) Indica si esta etiqueta soporta atributos adicionales con nombres dinámicos. El valor de un atributo identifica con ámbito en el que colocar una Mapa que
Dynamic- contiene los nombres y valores de los atributos dinámicos pasan durante la invocación de la etiqueta.

Produce un error de traducción, si el valor de la -atributos dinámicos de un etiqueta Directiva es igual al valor de una
nombre dado de un variable directiva o el valor de una nombre atributo de un atributo directiva.

pequeña icono (Opcional) Ruta relativa, a partir del archivo fuente de la etiqueta, de un archivo de imagen que contiene un pequeño icono que puede ser utilizado por las herramientas. Por defecto es ningún icono pequeño.

-Icono grande (Opcional) Ruta relativa, a partir del archivo fuente de la etiqueta, de un archivo de imagen que contiene un icono grande que puede ser utilizado por las herramientas. Por defecto es ningún icono grande.

descripción (Opcional) define una cadena arbitraria que describe esta etiqueta. Por defecto es ninguna descripción.

ejemplo (Opcional) define una cadena arbitraria que presenta una descripción informal de un ejemplo de un uso de esta acción. El valor predeterminado es ningún ejemplo.

idioma (Opcional) lleva la misma sintaxis y la semántica de la idioma atributo de la página directiva.

importar (Opcional) lleva la misma sintaxis y la semántica de la importar atributo de la página directiva.

pageEncoding (Opcional) lleva la misma sintaxis y la semántica de la Página-Encoding atributo en el página directiva.

isELIgnored (Opcional) lleva la misma sintaxis y la semántica de la Isel-Ignorado atributo de la página directiva.

-Cuerpo del contenido Attribute


Se especifica el tipo de contenido del cuerpo de una etiqueta utilizando la cuerpo de contenido atributo:

bodycontent = "vacío | scriptless | tagdependent"

Debe declarar el contenido del cuerpo de las etiquetas que no aceptan como un cuerpo vacío . Para las etiquetas que tienen un cuerpo hay dos opciones. contenido del cuerpo que contiene la costumbre y etiquetas estándar
HTML y el texto se especifica como scriptless . Todos los demás tipos de contenido del cuerpo (por ejemplo, las sentencias SQL pasan a la consulta tag) se especifica como tagdependent . Si no se especifica ningún atributo,
el valor predeterminado es scriptless .

La declaración de atributos de etiqueta en archivos de etiquetas


Declarar los atributos de una etiqueta personalizada definida en un archivo de etiquetas, se utiliza el atributo directiva. A TLD tiene un análogo atributo elemento (ver La declaración de atributos de etiqueta para los
controladores de etiquetas ). Tabla 8-3 enumera el atributo atribuye Directiva.
Tabla 8-3 atributo Atributos Directiva

Atributo Descripción

descripción (Opcional) Descripción del atributo. Por defecto es ninguna descripción.

nombre El nombre único del atributo que se declaró. Un error de traducción resultados si hay más de uno
atributo Directiva aparece en la misma unidad de traducción con el mismo nombre .

Produce un error de traducción, si el valor de una nombre atributo de un atributo Directiva es igual al valor de la -atributos dinámicos atributo de
una etiqueta directiva o el valor de una nombre dado
atributo de una variable directiva.

necesario (Opcional) Si se requiere este atributo ( cierto ) o opcional ( falso ). Por defecto es falso .

rtexprvalue (Opcional) Si el valor del atributo se puede calcular dinámicamente en tiempo de ejecución por una expresión. Por defecto es cierto . Cuando este
elemento se establece en cierto y la definición del atributo también incluye ya sea una
diferido-valor o diferido-método elemento entonces el atributo acepta ambas expresiones dinámicas y diferidos.

tipo (Opcional) El tipo de tiempo de ejecución del valor del atributo. Por defecto es java.lang.String .

deferredValue (Opcional) Indica si el atributo acepta diferido expresiones de valor. Sólo uno de
deferredValue o deferredMethod puede ser verdad. Si deferredValueType se especifica, el valor predeterminado para deferredValue es cierto . Provoca
un error de traducción si se especifica en un fichero de etiquetas JSP con una versión inferior a 2,1.

deferredValueType (Opcional) El tipo resultante de la evaluación de la expresión el valor del atributo. El valor por defecto es
java.lang.String Si no se especifica ningún tipo. Si ambos deferredValueType y deferredValue
se especifican, deferredValue debe ser verdad. Si deferredValue es cierto , el valor por defecto de
deferredValueType es java.lang.Object . Provoca un error de traducción se especifica en un fichero de etiquetas JSP con una versión inferior a 2,1.

deferredMethod (Opcional) Indica si el atributo de etiqueta acepta diferido expresiones de método. Si


deferredMethod y deferredMethodSignature se especifican a continuación, deferredMethod debe ser verdad. El valor por defecto de deferredMethod es
cierto si deferredMethodSignature se especifica lo contrario, el valor predeterminado de deferredMethod Es falso. La presencia de una diferido-método
elemento en una definición de atributo se opone a la inclusión de una diferido-valor elemento. Provoca un error de traducción si se especifica en un
fichero de etiquetas JSP con una versión inferior a 2,1.

deferredMethodSignature (Opcional) La firma del método para ser invocada por la expresión definido por la adjunta
deferredMethod atributo. Si deferredMethod Es cierto y este atributo no se especifica, el método de firma por defecto methodName anular () . Provoca
un error de traducción si se especifica en un fichero de etiquetas JSP con una versión inferior a 2,1.

fragmento (Opcional) Si este atributo es un fragmento para ser evaluados por el controlador de etiqueta ( cierto ) o un atributo normal a ser evaluado por el

recipiente antes de ser pasado al controlador de la etiqueta. Si este atributo es cierto :

No se especifica la rtexprvalue atributo. El contenedor fija el rtexprvalue atribuir a las


cierto .

No se especifica la tipo atributo. El contenedor fija el tipo atribuir a las


javax.servlet.jsp.tagext.JspFragment .

Por defecto es falso .


Declaración de variables del Tag en Tag Archivos
atributos de las etiquetas se utilizan para personalizar el comportamiento de la etiqueta tanto como parámetros se utilizan para personalizar el comportamiento de los métodos de objeto. De hecho, el uso de atributos de las

etiquetas y las variables de EL, es posible emular varios tipos de parámetros: EN , FUERA , y anidada. Emular EN parámetros, atributos de uso de la etiqueta. Un atributo de etiqueta se comunica entre la página de llamada y

el archivo de la etiqueta cuando se invoca la etiqueta. Ninguna otra comunicación se produce entre la página de llamada y el archivo de etiquetas. Emular FUERA o parámetros anidados, usan variables de EL. La variable no

se ha inicializado por la página de llamada, sino que es fijado por el archivo de etiquetas. Cada tipo de parámetro se sincroniza con la página de llamada en diversos puntos de acuerdo con el alcance de la variable. Ver sincronización

variable para detalles.

Para declarar una variable EL expuesta por un archivo de etiquetas, se utiliza el variable directiva. A TLD tiene un análogo variable elemento (ver Declaración de variables de la etiqueta de controladores de

etiquetas ). Tabla 8-4 enumera el variable atribuye Directiva. Tabla 8-4 variable Atributos Directiva

Atributo Descripción

descripción (Opcional) Una descripción opcional de esta variable. Por defecto es ninguna descripción.

nombre dado por | Define una variable de EL para ser utilizado en la página invocando esta etiqueta. Ya sea nombre dado o Nombre-del-atributo
atributo de nombre-de- se debe especificar. Si nombre dado se especifica, el valor es el nombre de la variable. Si Nombre-del-atributo se especifica, el valor es el nombre de un atributo cuyo
(traducción en tiempo) Valor al comienzo de la invocación etiqueta le dará el nombre de la variable.

surgen errores de traducción en las siguientes circunstancias:

1. Especificación ni nombre dado ni Nombre-del-atributo o ambos.

2. Si dos variable directivas tienen la misma nombre dado .

3. Si el valor de una nombre dado atributo de una variable Directiva es igual al valor de una nombre atributo de un
atributo directiva o el valor de una -atributos dinámicos atributo de una etiqueta directiva.

alias Define una variable, local al archivo de etiquetas, para mantener el valor de la variable EL. El recipiente se sincronizará este valor con la variable cuyo nombre se da en Nombre-del-atributo
.

Se requiere cuando Nombre-del-atributo está especificado. Produce un error de traducción si se utiliza sin atributo de nombre-de- .

Produce un error de traducción, si el valor de alias es el mismo que el valor de una nombre atributo de un atributo
directiva o el nombre dado atributo de una variable directiva.

clase variable (Opcional) El nombre de la clase de la variable. El valor por defecto es java.lang.String .

declarar (Opcional) Sea o no se declara la variable. Cierto es el valor predeterminado.

alcance (Opcional) El alcance de la variable. Pueden ser cualquiera de los dos AL PRINCIPIO , AT_END , o ANIDADO . Por defecto es ANIDADO .

sincronización variable

El contenedor web se encarga de la sincronización de las variables entre un archivo y una etiqueta de página de llamada. Tabla 8-5 resume cuándo y cómo cada objeto se sincroniza de acuerdo con el

alcance del objeto. Tabla 8-5 Comportamiento de sincronización Variable

Archivo de etiquetas Localización AL PRINCIPIO ANIDADO AT_END

Comenzando No sincronizar. Salvar No sincronizar.


Archivo de etiquetas Localización AL PRINCIPIO ANIDADO AT_END

Antes de cualquier invocación fragmento usando jsp: invocar o jsp: doBody ( ver Los fragmentos que evalúan pasado a marcar TAG> página Etiqueta- No sincronizar.

archivos ) > página

Fin TAG> página Restaurar Etiqueta-

> página

Si nombre dado se utiliza para especificar el nombre de la variable, a continuación, el nombre de la variable en la página de llamada y el nombre de la variable en el archivo de etiquetas son lo mismo y es igual al
valor de nombre dado .

los Nombre-del-atributo y alias atributos de la variable Directiva se puede utilizar para personalizar el nombre de la variable en la página de llamada mientras que otro nombre se utiliza en el archivo de
etiquetas. Cuando se utilizan estos atributos, se establece el nombre de la variable en la página de llamada a partir del valor de Nombre-del-atributo en el momento en que se llama la etiqueta. El nombre de la
variable correspondiente en el archivo de etiquetas es el valor de alias .

Ejemplos de sincronización
Los siguientes ejemplos ilustran cómo la sincronización variable de trabaja entre un fichero de etiquetas y su página de llamada. Todos los ejemplos de las páginas JSP y archivos de etiqueta de referencia de la biblioteca de
etiquetas núcleo JSTL con el prefijo do . Las páginas JSP referencia a un archivo situado en la etiqueta / WEB-INF / tags con el prefijo mi .

AL PRINCIPIO Alcance

En este ejemplo, la AL PRINCIPIO ámbito de aplicación se utiliza para pasar el valor de la variable llamada X al cuerpo de la etiqueta y al final de la invocación de la etiqueta.

<% - callingpage.jsp -%> <c: set var = valor "x" =


"1" /> $ {x} <% - (x == 1) -%> <mi: Ejemplo>

$ {X} <% - (x == 2) -%> </ mi: ejemplo>

$ {X} <% - (x == 4) -%> <% - example.tag -%>

<% @ Variable = "x" scope = "AT_BEGIN" % nombre dado> $ {x} <% - (x == null) -%> <c:
set var = valor "x" = "2" /> <jsp: doBody />

$ {X} <% - (x == 2) -%> <c: set var = valor "x" =

"4" /> NESTED Alcance

En este ejemplo, la ANIDADO ámbito de aplicación se utiliza para hacer una variable llamada X disponible sólo para el cuerpo de la etiqueta. La etiqueta establece la variable a

2 , y este valor se pasa a la página de llamada antes de invocar el cuerpo. Debido a que el alcance es ANIDADO y porque la página de llamada también tenía una variable llamada X , su valor
original, 1 , se restaura cuando la etiqueta completa.

<% - callingpage.jsp -%> <c: set var = valor "x" =


"1" /> $ {x} <% - (x == 1) -%> <mi: Ejemplo>

$ {X} <% - (x == 2) -%> </ mi: ejemplo>

$ {X} <% - (x == 1) -%> <% - example.tag -%>

<% @ Variable de nombre dado por = alcance "x" = "anidados" %> $ {x} <% - (x == null)
-%> <c: set var = valor "x" = "2" /> <jsp: doBody />

$ {X} <% - (x == 2) -%> <c: set var = valor "x" =

"4" /> AT_END Alcance

En este ejemplo, la AT_END ámbito de aplicación se utiliza para devolver un valor a la página. El cuerpo de la etiqueta no se ve afectada.

<% - callingpage.jsp -%> <c: set var = valor "x" =


"1" /> $ {x} <% - (x == 1) -%> <mi: Ejemplo>

$ {X} <% - (x == 1) -%> </ mi: ejemplo>

$ {X} <% - (x == 4) -%> <% - example.tag -%>

<% @ Variable = "x" scope = "AT_END" % nombre dado> $ {x} <% - (x == null) -%> <c:
set var = valor "x" = "2" />
<Jsp: doBody />
$ {X} <% - (x == 2) -%> <c: set var = valor "x" = "4"

/> AT_BEGIN y Nombre-del-atributo

En este ejemplo la AL PRINCIPIO ámbito de aplicación se utiliza para pasar una variable de EL para el cuerpo de la etiqueta y hacer que esté disponible para la página de llamada al final de la invocación de la
etiqueta. El nombre de la variable es especificada por el valor del atributo var . La variable es referenciado por un nombre local, resultado , en el archivo de etiquetas.

<% - callingpage.jsp -%> <c: set var = valor "x" =


"1" /> $ {x} <% - (x == 1) -%> <mi: ejemplo var =
"x">

$ {X} <% - (x == 2) -%>


$ {Resultado} <% - (resultado == null) -%> <c: set var = valor de "número" =
"invisible" /> </ mi: ejemplo>

$ {X} <% - (x == 4) -%>


$ {Resultado} <% - (resultado == “invisible") -%> <% - example.tag -%>

<% @ Atributo name = "var" requerido = "true" rtexprvalue = "true" %> <% @ alias variable = "número"
nombre-de-atributo = "var"
scope = "AT_BEGIN" %> $ {x} <% - (x == null) -%> $
{resultado} <% - (resultado == null) -%> <c: set var =" x" value =
"ignorado"/> <c: set var = "" value = "número 2"/> <jsp: doBody />

$ {X} <% - (x == “ignorado ') -%> $ {resultado} <% - (resultado ==


2) -%> <c: set var = "" value =" resultado 4" />

Los fragmentos que evalúan pasado a marcar archivos


Cuando se ejecuta un archivo de etiquetas, el contenedor web pasa dos tipos de fragmentos: atributos fragmento y el cuerpo de la etiqueta. Recordemos de la discusión de fragmento de atributos que los fragmentos son
evaluados por el controlador de etiqueta en contraposición al contenedor web. Dentro de un archivo de etiquetas, se utiliza el jsp: invocar
elemento para evaluar un atributo fragmento y el uso de la jsp: doBody elemento para evaluar un cuerpo archivo de etiquetas.

El resultado de la evaluación de cualquier tipo de fragmento se envía a la respuesta o se almacena en una variable de EL para la manipulación posterior. Para almacenar el resultado de la evaluación de un

fragmento de una variable EL, se especifica el var o varReader atributo. Si var se especifica, el recipiente almacena el resultado en una variable EL de tipo Cuerda con el nombre especificado por var . Si varReader

se especifica, el recipiente almacena el resultado en una variable EL de tipo java.io.Reader , con el nombre especificado por varReader . los Lector objeto a continuación, se puede pasar a una etiqueta

personalizada para su posterior procesamiento. Un error de traducción se produce si se var y varReader se especifican. un opcional alcance atributo indica el alcance de la variable resultante. Los valores

posibles son página ( defecto), solicitud , sesión , o

solicitud . Un error de traducción se produce si utiliza este atributo sin especificar el var o varReader atributo.

Ejemplos de etiquetas personalizadas


Esta sección presenta ejemplos que muestran el uso de etiquetas personalizadas.

Simple Atributo Ejemplo


Librería de Duke fecha de envío tag, definido en tut-install / javaeetutorial5 / examples / web / bookstore3 / web / WEB-INF / tags / shipDate.tag , es una etiqueta personalizada que tiene un atributo
simple. La etiqueta genera la fecha de una cartera de pedidos de acuerdo con el tipo de envío solicitado.

<% @ Taglib prefix = tagdir "sc" = "/ WEB-INF / tags" %> <h3> <fmt: message key = "ThankYou" /> $ {}
param.cardname </ h3> <br> <. fmt: message key = "Con" />

<Em> <fmt: message key = "$ {} param.shipping" /> </ em>, <fmt: message key =
"ShipDateLC" /> <sc: ShipDate envío = "$ {} param.shipping" / >

La etiqueta determina el número de días hasta el envío de la Envío atributo se le ha pasado por la página Tut instalar / javaeetutorial5 / examples / web / bookstore3 / web / bookreceipt.jsp . A partir del
número de días, la etiqueta calcula la fecha de envío. A continuación, da formato a la fecha de envío.

<% @ Atributo name = "envío" requerido = "true" %> <jsp: useBean id = "ahora" class =

"java.util.Date" /> <jsp: useBean id = class = "java "fechaEnvio". util.Date"/> <c: choose>

<C: cuando la prueba = "$ {Envío == 'QuickShip'}">


<C: set var = valor "día" = "2" /> </ c: cuando>

<C: cuando la prueba = "$ {envío == 'NormalShip'}">


<C: set var = valor "día" = "5" /> </ c: cuando>

<C: cuando la prueba = "$ {envío == 'SaverShip'}">


<C: set var = valor "día" = "7" /> </ c: when> </ c: elegir>

<Jsp: setProperty name = propiedad "fechaEnvio" = "tiempo"


value = "$ {now.time + 86400000 *} días"> <fmt /: valor formatDate = "$ {}
fechaEnvio" type = "fecha"
dateStyle = "completo" />. <br>

Atributo simple y Fragmento y el Ejemplo Variable


Librería de Duke catalogar tag, definido en tut-install / javaeetutorial5 / examples / web / bookstore3 / web / WEB-INF / tags / catalog.tag , es una etiqueta personalizada con los atributos y variables simples y
fragmentos. La etiqueta hace que el catálogo de una base de datos libro como una tabla HTML. El archivo de etiquetas declara que establece variables con nombre precio y precio de venta utilizando variable directivas.
El fragmento
precio normal utiliza la variable precio , y el fragmento en venta utiliza las variables precio y precio de venta . Antes de la etiqueta invoca los atributos de los fragmentos mediante el jsp: invocar elemento, el
contenedor web pasa valores de las variables de nuevo a la página de llamada.

<% @ Atributo name = "BookDB" requerido = "true"


type = "database.BookDB" %>
<% @ Atributo name = "color" requerido = "true" %> <% @ nombre de atributo = "normalPrice"

fragmento = "true" %> <% @ nombre de atributo = "onSale" fragmento = "true" %> <% @ variable

de nombre-da = "precio" %> <% @ variable de nombre dado por = "salePrice" %> <center>

<table>

<C: forEach var = "libro" comienzan = "0" artículos = "$ {} bookDB.books">


<Tr>
<C: set var = valor "bookId" = "$ {} book.bookId" /> <td bgcolor = "$ {color}">

<C: var = valor de url "URL" = "/ bookdetails">


<C: param name = "bookId" = "$ {} bookId" /> </ c: url>

<a href="${url}"> <


strong> $ {} book.title & nbsp; </ strong> </a> </ td> <td bgcolor = "$ {color}" rowspan
= 2>
<C: set var = valor "salePrice" = "$ {book.price * 0,85}" /> <c: set var = valor "precio" = "$ {} book.price"
/> <c: choose>

<C: cuando la prueba = "$ {} book.onSale">


<Jsp: invocar fragmento = "onSale" /> </ c: cuando> <c: de otro
modo>

<Jsp: invocar fragmento = "normalPrice" /> </ c: de otro modo> </ c:

choose> & nbsp; </ td>

. . .
</ Table> </
center>

La página bookcatalog.jsp invoca la catalogar etiqueta que tiene los atributos simples BookDB , la cual contiene datos de catálogo, y color ,
que personaliza la coloración de las filas de la tabla. El formato de la lista de precios está determinado por dos atributos de los fragmentos, precio normal y
en venta , que son condicionalmente invocada por la etiqueta de acuerdo con los datos recuperados de la base de datos de libros.

<sc: Catálogo de BookDB = "$ {} BookDB" color = "# cccccc">


<Jsp: atributo name = "normalPrice">
<Fmt: FormatNumber value = "$ {} precio" type = "moneda" /> </ jsp: attribute>

<Jsp: nombre del atributo = "onSale">


<Strike>
<Fmt: formatNumber value = "$ {} precio" type = "moneda" /> </ strike> <br/> <font color = "red">

<Fmt: valor formatNumber = "$ {} salePrice" type = "moneda" /> </ font> </ jsp: attribute> </ sc: catálogo>

La pantalla producido por tut-install / javaeetutorial5 / examples / web / bookstore3 / web / bookcatalog.jsp se muestra en la Figura 8- 2 . Se puede comparar con la versión en Figura 5-2 .

Catálogo Figura 8-2 libro


Dinámica Atributo Ejemplo
El código siguiente implementa la etiqueta discutido en Los atributos dinámicos . Un número arbitrario de atributos cuyos valores son los colores se almacenan en una
Mapa nombrado por el -atributos dinámicos atributo de la etiqueta directiva. el JSTL para cada etiqueta se utiliza para iterar a través de la Mapa y las teclas de atributos y valores de atributos de color se
imprimen en una lista con viñetas.

<% @ de etiquetas dinámicas-attributes = "mapa de colores" %> <ul>

<C: forEach var = "color" begin = "0" items = "$ {} mapa de colores">
<Li> $ {} = color.key
<Font color = "$ {} color.value"> $ {} color.value </ font> </ li>
</ C: forEach> </ ul>

Descriptores biblioteca de etiquetas


Si desea redistribuir sus archivos de etiquetas o implementar sus etiquetas personalizadas con controladores de etiquetas escritas en Java, debe declarar las etiquetas en un descriptor de biblioteca de etiquetas (TLD). Un

descriptor de la biblioteca es un documento XML que contiene información acerca de una biblioteca en su conjunto y de cada etiqueta contenida en la biblioteca. TLD son utilizados por un contenedor web para validar las

etiquetas y las herramientas de desarrollo página JSP. Los nombres de etiqueta archivo descriptor de la biblioteca deben tener la extensión . TLD y debe ser envasado en la / WEB-INF / directorio o subdirectorio del archivo WAR o

en el / META-INF / directorio o subdirectorio de una biblioteca de etiquetas envasada en un frasco. Si una etiqueta se implementa como un archivo de etiqueta y se empaqueta en

/ WEB-INF / tags / o en un subdirectorio, un TLD será generada automáticamente por el contenedor web, aunque se puede proporcionar uno si lo desea. La mayoría de los contenedores de establecer la versión JSP

de este TLD generado automáticamente (llamado un TLD implícita) a 2,0. Por lo tanto, con el fin de tomar ventaja de JSP 2.1 características, debe proporcionar un TLD que establece la versión JSP a 2,1 si usted no

tiene un TLD ya. Este dominio de nivel superior debe ser nombrado
implicit.tld y se coloca en el mismo directorio que los archivos de etiquetas.
Se establece la versión JSP utilizando el atributo de versión de la raíz taglib elemento que del dominio de nivel superior, como se muestra aquí:

<taglib
xsi: schemaLocation =
"Http://java.sun.com/xml/ns/javaee web-
jsptaglibrary_2_1.xsd"
xmlns = "http://java.sun.com/xml/ns/javaee" | xmlns: xsi =
"http://www.w3.org/2001/XMLSchema-instance" version = "2.1">

Tabla 8-6 enumera los subelementos del taglib elemento. Tabla 8-6 taglib subelementos

Elemento Descripción

descripción (Opcional) Una cadena que describe el uso de la biblioteca de etiquetas.

nombre para (Opcional) Nombre destinada a ser representada por las herramientas.
mostrar

icono (Opcional) Icono que puede ser utilizado por las herramientas.

versión tlib- La versión de la biblioteca de etiquetas.

nombre corto (Opcional) Nombre que podría ser utilizada por una herramienta de creación de páginas JSP para crear nombres con un valor mnemotécnico.

uri Un URI que identifica de forma única la biblioteca de etiquetas.

validador Ver validador Elemento .

oyente Ver oyente Elemento .

tag-archivo | Declara los archivos de etiqueta o etiquetas definidas en la biblioteca de etiquetas. Ver La declaración de ficheros de etiquetas y La declaración de controladores de etiquetas . Una biblioteca de etiquetas no se considera
etiqueta válido si un tag-archivo elemento tiene una nombre subelemento con el mismo contenido como una nombre en un subelemento etiqueta elemento.

función Cero o más funciones de EL (véase funciones ) Definido en la biblioteca de etiquetas.

etiqueta- (opcional) Las extensiones que proporcionan información adicional acerca de la biblioteca de etiquetas de herramientas.

extensión

De nivel superior Tag Library Descriptor de elementos


Esta sección describe algunos elementos de TLD de nivel superior. Las secciones siguientes describen cómo declarar las etiquetas definidas en archivos de etiquetas, cómo declarar las etiquetas definidas en controladores de etiquetas, y
cómo declarar atributos de las etiquetas y variables.

validador Elemento
Este elemento define un validador biblioteca de etiquetas opcional que puede ser utilizado para validar la conformidad de cualquier página JSP importar esta biblioteca de etiquetas a sus requerimientos. Tabla

8-7 enumera los subelementos del validador elemento. Tabla 8-7 validador subelementos
Elemento Descripción

validador de clase La clase que implementa javax.servlet.jsp.tagext.TagLibraryValidator

init-param (opcional) los parámetros de inicialización

oyente Elemento
Una biblioteca de etiquetas puede especificar algunas clases que son detectores de eventos (ver Manipulación de servlet del ciclo de vida Eventos ). Los oyentes se enumeran en el TLD como
oyente elementos, y el contenedor web tendrán una instancia de las clases de oyentes y registrarlos de manera análoga a la de los oyentes definidos a nivel GUERRA. A diferencia de los oyentes de nivel de
guerra, el orden en el que están registrados los oyentes la biblioteca de códigos no está definido. El único elemento parcial de la
oyente elemento es el oyente de clase elemento, que debe contener el nombre completo de la clase oyente.

La declaración de ficheros de etiquetas


Aunque no es necesario para los archivos de etiquetas, proporcionando un TLD le permite compartir la etiqueta a través de más de una biblioteca de etiquetas y permite importar la biblioteca de etiquetas usando un URI en lugar de la tagdir
atributo.

tag-archivo Elemento TLD


Un archivo de etiqueta se declara en el dominio de nivel superior utilizando una tag-archivo elemento. Sus sub-elementos se enumeran en Tabla 8-8 . Tabla 8-8 tag-archivo subelementos

Elemento Descripción

descripción (Opcional) Una descripción de la etiqueta.

nombre para (Opcional) Nombre destinada a ser representada por las herramientas.
mostrar

icono (Opcional) Icono que puede ser utilizado por las herramientas.

nombre El nombre de etiqueta única.

camino ¿Dónde encontrar el archivo de etiquetas implementación de esta etiqueta, relativa a la raíz de la aplicación web o la raíz del archivo JAR para una biblioteca de etiquetas envasada en un
frasco. Esto debe comenzar con / WEB-INF / tags / si el archivo de etiquetas reside en la guerra, o / META-INF / tags / si el archivo de etiquetas reside en un frasco.

ejemplo (Opcional) Descripción informal de un ejemplo el uso de la etiqueta.

etiqueta- (opcional) Las extensiones que proporcionan información adicional acerca de la etiqueta de herramientas.
extensión

Tag sin empaquetar archivos


archivos de etiquetas colocadas en un subdirectorio de / WEB-INF / tags / no requieren un archivo de dominio de nivel superior y no tienen que ser envasados. Por lo tanto, para crear código JSP reutilizable, sólo tiene que crear un nuevo archivo de

etiqueta y coloque el código en su interior.

El contenedor web genera una biblioteca de etiquetas implícito para cada directorio bajo y que incluye / WEB-INF / tags / . No existen relaciones especiales entre los subdirectorios; se les permite
simplemente por razones de organización. Por ejemplo, la siguiente aplicación web contiene tres bibliotecas de etiquetas:
/ WEB-INF / tags / /WEB-INF/tags/a.tag
/WEB-INF/tags/b.tag / WEB-INF / tags / foo /
/WEB-INF/tags/foo/c.tag / WEB INF / tags / bar /
baz / /WEB-INF/tags/bar/baz/d.tag

El TLD implícito para cada biblioteca tiene los siguientes valores:

TLIB-versión para la biblioteca de etiquetas. El valor predeterminado es 1,0.

nombre corto se deriva del nombre del directorio. Si el directorio es / WEB-INF / tags / , el nombre corto es simplemente etiquetas . De lo contrario, la ruta completa (en relación con la aplicación
web) se toma, menos el / WEB-INF / tags / prefijo. Entonces todo / caracteres son reemplazados con
- (Guión), que da el nombre corto. Tenga en cuenta que los nombres cortos no se garantiza que sea único. UN tag-archivo elemento se

considera que existe para cada archivo de etiquetas, con las siguientes subelementos:

los nombre para cada uno es el nombre de archivo del archivo de etiquetas, sin la . etiqueta extensión. los camino para cada uno es la ruta

del archivo de etiquetas, relativa a la raíz de la aplicación web. Así, para el ejemplo, el TLD implícita para la / WEB-INF / tags / bar / baz / directorio

sería la siguiente:

<Taglib>
<TLIB-version> 1.0 </ TLIB-version> <nombre corto> bar-baz
</ corto nombre> <tag-file>

<Nombre> d </ name>


<Ruta> /WEB-INF/tags/bar/baz/d.tag </ path> </ tag-file> </ taglib>

A pesar de la existencia de una biblioteca de etiquetas implícita, un TLD en la aplicación web todavía puede crear etiquetas adicionales de los mismos archivos de etiquetas. Para lograr esto, se agrega una tag-archivo elemento con
una camino que apunta al archivo de etiquetas.

Tag empaquetado de archivos


archivos de etiquetas pueden ser envasados ​en el / META-INF / tags / directorio en un archivo JAR instalado en el / WEB-INF / lib / directorio de la aplicación web. Las marcas colocadas aquí son típicamente parte de una biblioteca reutilizable de

etiquetas que se puede utilizar fácilmente en cualquier aplicación web. archivos de etiquetas empaquetadas en un JAR requieren un descriptor de la biblioteca. archivos de etiquetas que aparecen en un frasco, pero no están definidos en un dominio

de nivel superior son ignorados por el contenedor web.

Cuando se utiliza en un archivo JAR, el camino subelemento del tag-archivo elemento especifica la ruta completa del archivo de etiquetas de la raíz de la jarra. Por lo tanto, siempre debe comenzar
con / META-INF / tags / .

archivos de etiquetas también pueden ser compilados en las clases de Java y empaquetados en una biblioteca de etiquetas. Esto es útil cuando se desea distribuir una versión binaria de la biblioteca de etiquetas sin la fuente
original. Si elige esta forma de envasado, se debe utilizar una herramienta que produce código JSP portátil que utiliza las API estándar solamente.

La declaración de controladores de etiquetas

Cuando las etiquetas se implementan con controladores de etiquetas escritas en Java, cada etiqueta en la biblioteca debe ser declarado en el TLD con una etiqueta elemento. los etiqueta

elemento contiene el nombre de la etiqueta, la clase de su controlador de etiqueta, la información sobre atributos de la etiqueta y la información sobre las variables creadas por la etiqueta (ver Etiquetas que definen las variables ).

Cada declaración de atributo contiene una indicación de si se requiere el atributo, si su valor puede ser determinado por las expresiones de tiempo petición, el tipo de atributo y si el atributo es un fragmento. La

información variable se puede dar directamente en el dominio de nivel superior o por medio de una clase de información adicional de la etiqueta. Tabla 8-9 enumera los subelementos del etiqueta elemento. Tabla 8-9 etiqueta

subelementos

Elemento Descripción

descripción (Opcional) Una descripción de la etiqueta.

nombre para (Opcional) Nombre destinada a ser representada por las herramientas.
mostrar

icono (Opcional) Icono que puede ser utilizado por las herramientas.
Elemento Descripción

nombre El nombre de etiqueta única.

la etiqueta de clase El nombre completo de la clase controlador de etiqueta.

tei de clase (Opcional) Subclase de javax.servlet.jsp.tagext.TagExtraInfo . Ver Declaración de variables de la etiqueta de controladores de etiquetas .

contenido El tipo de contenido del cuerpo. Ver cuerpo de contenido Elemento .


cuerpo-

variable (Opcional) Declara una variable EL expuesta por la etiqueta a la página de llamada. Ver Declaración de variables de la etiqueta de controladores de etiquetas .

atributo Declara un atributo de la etiqueta personalizada. Ver La declaración de atributos de etiqueta para los controladores de etiquetas .

atributos Si la etiqueta es compatible con atributos adicionales con nombres dinámicos. Por defecto es falso . Si es verdad, la clase controlador de etiqueta debe implementar
Dynamic- la javax.servlet.jsp.tagext.DynamicAttributes interfaz.

ejemplo (Opcional) Descripción informal de un ejemplo el uso de la etiqueta.

etiqueta- (opcional) Las extensiones que proporcionan información adicional acerca de la etiqueta de herramientas.
extensión

cuerpo de contenido Elemento

Se especifica el tipo de cuerpo que tiene una validez de una etiqueta mediante el uso de la cuerpo de contenido elemento. Este elemento es utilizado por el contenedor web para validar que una invocación etiqueta tiene la sintaxis correcta

del cuerpo y es utilizado por las herramientas de la página de composición para ayudar al autor de la página en la prestación de un cuerpo etiqueta válida. Hay tres posibles valores:

tagdependent : El cuerpo de la etiqueta es interpretada por la propia implementación de la etiqueta, y es más probable en un idioma diferente, por ejemplo, las sentencias de SQL incorporado.

vacío : El cuerpo debe estar vacío.

scriptless : El cuerpo sólo acepta texto estático, las expresiones EL, y etiquetas personalizadas. No se permiten elementos de guiones.

La declaración de atributos de etiqueta para los controladores de etiquetas


Para cada atributo de etiqueta, se debe especificar si se requiere el atributo, si el valor puede ser determinado por una expresión, el tipo del atributo en una atributo elemento (opcional), y si el atributo es
un fragmento. Si el rtexprvalue elemento es cierto o sí , entonces el tipo elemento define el tipo de rendimiento esperado de cualquier expresión especificada como el valor del atributo. Para los valores
estáticos, el tipo es siempre java.lang.String . Un atributo se especifica en un TLD en una atributo elemento. Tabla 8-10 enumera los subelementos del

atributo elemento. Tabla 8-10 atributo subelementos

Elemento Descripción

descripción (Opcional) Una descripción del atributo.


Elemento Descripción

nombre El nombre único del atributo que se declaró. Un error de traducción resultados si hay más de uno atributo elemento aparece en la misma etiqueta con el mismo nombre
.

necesario (Opcional) Si se requiere el atributo. El valor por defecto es falso .

rtexprvalue (Opcional) Si el valor del atributo se puede calcular de forma dinámica en tiempo de ejecución por una expresión EL. El valor por defecto es
falso . Cuando este elemento se establece en cierto y la definición del atributo también incluye ya sea una diferido-valor o
diferido-método elemento entonces el atributo acepta ambas expresiones dinámicas y diferidos.

tipo (Opcional) El tipo de tiempo de ejecución del valor del atributo. Por defecto es java.lang.String si no se especifica.

fragmento (Opcional) Si este atributo es un fragmento para ser evaluados por el controlador de etiqueta ( cierto ) o un atributo normal a ser evaluado por el recipiente antes de

ser pasado al controlador de la etiqueta. Si este atributo es cierto :

No se especifica la rtexprvalue atributo. El contenedor fija el rtexprvalue atribuir a las cierto .

No se especifica la tipo atributo. El contenedor fija el tipo atribuir a las


javax.servlet.jsp.tagext.JspFragment .

Por defecto es falso .

valor deferred- (Opcional) Indica que el atributo de etiqueta acepta diferido expresiones de valor. Este elemento incluye un opcional tipo
elemento hijo, que indica el tipo de objeto a la que se resuelve la expresión. Si no tipo elemento está incluido, el tipo es java.lang.Object . O bien el diferido-valor o diferido-método
elemento (pero no ambos) se puede definir para el mismo atributo.

método deferred- (Opcional) Indica que el atributo de etiqueta acepta diferido expresiones de método. Este elemento incluye un opcional
método de firma elemento hijo, que indica la firma del método que invoca la expresión. Si no se define una firma de método, el método predeterminado de firma es methodName
anular () . O bien el diferido-valor
o diferido-método elemento (pero no ambos) se puede definir para el mismo atributo.

Si no se requiere un atributo de etiqueta, un controlador de etiqueta debe proporcionar un valor por defecto. los etiqueta elemento para una etiqueta que da salida a su cuerpo si se evalúa como una prueba cierto declara que la prueba Se requiere

de atributos y que su valor se puede ajustar por una expresión de tiempo de ejecución.

<Tag> <Nombre> presente </ name>

<Clase tag> condpkg.IfSimpleTag </ tag de clase> <body-content> scriptless </


body-content>
. . .
<Atributo>
<Nombre> test </ name> <required> true </ required>
<rtexprvalue> true </ rtexprvalue> </ attribute>

. . .
</ Tag>

Declaración de variables de la etiqueta de controladores de etiquetas


El ejemplo descrito en Etiquetas que definen las variables define una variable EL Nombre de Departamento :

<TLT: iterador var = tipo "DepartmentName" = "java.lang.String"


group = "$ {} myorg.departmentNames"> <tr> <Td> <a

href="list.jsp?deptName=${departmentName}">
$ {} DepartmentName </a> </ td>
</ Tr> </ TLT:
iterador>
Cuando se traduce la página JSP que contiene esta etiqueta, el contenedor web genera código para sincronizar la variable con el objeto referenciado por la variable. Para generar el código, el contenedor
web requiere cierta información acerca de la variable:

Nombre de la variable de

clase variable

Si la variable se refiere a un nuevo o un objeto existente La disponibilidad de la

variable

Hay dos maneras de proporcionar esta información: especificando el variable subelemento TLD o mediante la definición de una clase de información adicional e incluyendo la etiqueta tei de clase elemento en
el TLD (ver TagExtraInfo Clase ). Utilizando el variable elemento es más simple pero menos dinámico. Con el
variable elemento, el único aspecto de la variable que se puede especificar en tiempo de ejecución es su nombre (con la Nombre-del-atributo elemento). Si usted proporciona esta información en una clase de información
adicional etiqueta, también puede especificar el tipo de la variable en tiempo de ejecución.

Tabla 8-11 enumera los subelementos del variable elemento. Tabla 8-11 variable subelementos

Elemento Descripción

descripción (Opcional) Una descripción de la variable.

nombre dado por | Define una variable de EL para ser utilizado en la página invocando esta etiqueta. Ya sea nombre dado o Nombre-del-atributo
atributo de nombre-de- se debe especificar. Si nombre dado se especifica, el valor es el nombre de la variable. Si Nombre-del-atributo se especifica, el valor es el nombre de un atributo cuyo
(traducción en tiempo) Valor al comienzo de la invocación etiqueta le dará el nombre de la variable.

surgen errores de traducción en las siguientes circunstancias:

especificando ni nombre dado ni Nombre-del-atributo o ambos. Si dos variable elementos tienen la misma nombre

dado .

clase variable (Opcional) El nombre completo de la clase del objeto. java.lang.String es el valor predeterminado.

declarar (Opcional) Sea o no el objeto se declara. Cierto es el valor predeterminado. Un error de traducción resultados si ambos declarar y
fragmento se especifican.
Elemento Descripción

alcance (Opcional) El alcance de la variable definida. Pueden ser cualquiera de los dos AL PRINCIPIO , AT_END , o ANIDADO ( ver Tabla 8-12 ). Por defecto es ANIDADO .

Tabla 8-12 resume la disponibilidad de una variable de acuerdo con su ámbito declarado. Tabla 8-12

disponibilidad variable

Valor Disponibilidad

ANIDADO Entre la etiqueta de inicio y la etiqueta final.

AL PRINCIPIO A partir de la etiqueta de inicio hasta que el alcance de cualquier etiqueta donde se incluye. Si no hay etiqueta donde se incluye, a continuación, al final de la página.

AT_END Después de la etiqueta de cierre hasta que el alcance de cualquier etiqueta envolvente. Si no hay etiqueta donde se incluye, a continuación, al final de la página.

Se puede definir la siguiente variable elemento para el TLT: iterador etiqueta:

<Tag> <Variable>

<Nombre-dada> var </ nombre dado>


<Clase de variable> java.lang.String </ clase de variable>
<Declarar> true </ declarar> <scope>
NESTED </ scope> </ variable> </ tag>

Programación de controladores de etiquetas simples


Las clases e interfaces utilizadas para implementar controladores de etiquetas simples están contenidas en el javax.servlet.jsp.tagext paquete. controladores de etiquetas simples poner en práctica el SimpleTag interfaz.

Las interfaces pueden ser utilizadas para tomar un objeto Java existente y convertirlo en un controlador de etiqueta. Para los manipuladores de más reciente creación, se usaría el SimpleTagSupport clases como una

clase base. El corazón de un simple controlador de etiqueta es un método único, doTag , que se invoca cuando se encuentra el elemento final de la etiqueta. Tenga en cuenta que la implementación predeterminada de

la doTag método de SimpleTagSupport no hace nada.

Un controlador de etiqueta tiene acceso a una API que permite la comunicación con la página JSP. El punto de entrada a la API es el objeto de contexto JSP ( javax.servlet.jsp.JspContext ). los JspContext objeto
proporciona acceso a objetos implícitos. PageContext se extiende JspContext con el comportamiento en servlet específico. A través de estos objetos, un manejador de etiqueta puede recuperar todos los demás
objetos implícitos (petición, sesión y aplicación) que son accesibles desde una página JSP. Si se anida la etiqueta, un controlador de etiqueta también tiene acceso al controlador (llamado el padre) que se asocia
con la etiqueta donde se incluye.

Incluyendo controladores de etiquetas en aplicaciones Web


controladores de etiquetas pueden ser puestos a disposición de una aplicación web de dos maneras básicas. Las clases que implementan los controladores de etiquetas se pueden almacenar en una forma sin embalar
en el / WEB-INF / classes / subdirectorio de la aplicación web. Alternativamente, si la biblioteca se distribuye como un JAR, se almacena en el / WEB-INF / lib / directorio de la aplicación web.

¿Cómo se invoca una etiqueta de controlador simple?


los SimpleTag interfaz define el protocolo básico entre un simple controlador de etiqueta y el servlet de una página JSP. servlet de la página JSP invoca el
setJspContext , setParent , y atribuir los métodos de ajuste antes de llamar doStartTag .

ATAG t = new ATAG ();


t.setJSPContext (...);
t.setParent (...);
t.setAttribute1 (valor1);
t.setAttribute2 (valor2);
. . .
t.setJspBody (nueva JspFragment (...))
t.doTag ();

Las siguientes secciones describen los métodos que se necesita para desarrollar para cada tipo de etiqueta introducida en Tipos de etiquetas .

Controladores de etiquetas para etiquetas básicas


El controlador para una etiqueta básica sin un cuerpo debe implementar la doTag método de la SimpleTag interfaz. los doTag método se invoca cuando se encuentra el elemento final de la etiqueta. La

etiqueta básica discutido en la primera sección, < TT: básica /> , sería implementado por el controlador siguiente etiqueta:

HelloWorldSimpleTag pública se extiende SimpleTagSupport {


doTag public void () lanza JspException, IOException {
.. GetJspContext () getout () escribir ( "Hola, mundo."); }}

Controladores de etiquetas para las etiquetas con atributos


En esta sección se describe cómo definir atributos de un controlador de etiqueta y cómo validar los valores de atributo.

Cómo definir los atributos en un controlador de etiqueta


Para cada atributo de etiqueta, debe definir un método set en el controlador de etiqueta que se ajusta a las convenciones JavaBeans arquitectura. Por ejemplo, considere el controlador de etiqueta para la
JSTL c: si etiqueta:

<C: si la prueba = "$ {Borrar}">

Este manejador de etiqueta contiene el método siguiente:

settest public void (prueba booleano) {


this.test = prueba; }

Como se muestra por el ejemplo anterior, el nombre del atributo debe coincidir con el nombre del método de conjunto.

atributo de validación
La documentación de una biblioteca de etiquetas debe describir los valores válidos de atributos de etiqueta. Cuando se traduce una página JSP, un contenedor web hará cumplir las restricciones contenidas en el elemento
de TLD para cada atributo.

Los atributos pasados ​a una etiqueta también se pueden validar en tiempo de traducción mediante el validar método de una clase derivada de TagExtraInfo .
Esta clase también se utiliza para proporcionar información acerca de las variables definidas por la etiqueta (ver TagExtraInfo Clase ). los validar método se pasa la información de atributos en una tagdata objeto,

que contiene tuplas atributo-valor para cada uno de los atributos de la etiqueta. Debido a que la validación se produce en tiempo de traducción, el valor de un atributo que se calcula en el momento de la

solicitud se ajustará a
TagData.REQUEST_TIME_VALUE .

La etiqueta < TT: attr1 TWA = "valor1" /> tiene la siguiente TLD atributo elemento:

<Atributo>
<Nombre> attr1 </ name> <required> true </ required>
<rtexprvalue> true </ rtexprvalue> </ attribute>

Esta declaración indica que el valor de attr1 puede ser determinado en tiempo de ejecución. El seguimiento validar método comprueba si el valor de attr1 es un valor booleano válido. Tenga en cuenta que debido a que

el valor de attr1 puede ser calculada en tiempo de ejecución, validar debe comprobar si el usuario etiqueta ha elegido para proporcionar un valor de tiempo de ejecución.

public class TwaTEI extiende TagExtraInfo {


pública ValidationMessage [] validar los datos tagdata () {
Object o = data.getAttribute ( "attr1"); si (o! = null && o! = TagData.REQUEST_TIME_VALUE) {

if (((String) o) .tolowercase (). equals ( "verdadero") ||


((String) o) .tolowercase () igual ( "falso")) de retorno nulo.; más volver nueva

ValidationMessage (data.getId (),

"Valor booleano no válido.");


} else nula regresar; }}

Establecer atributos dinámicos


controladores de etiquetas simples que apoyan atributos dinámicos deben declarar que lo hagan en el etiqueta elemento de la TLD (ver La declaración de controladores de etiquetas ). Además, el controlador
debe implementar la etiqueta setDynamicAttribute método de la DynamicAttributes interfaz. Para cada atributo especificado en la invocación etiqueta que no tiene un correspondiente atributo elemento en el dominio
de nivel superior, las llamadas contenedor web
setDynamicAttribute , que pasa en el espacio de nombres del atributo (o nulo Si en el espacio de nombres predeterminado), el nombre del atributo y el valor del atributo. Debe implementar el setDynamicAttribute

Método para recordar los nombres y valores de los atributos dinámicos de modo que puedan ser utilizados más tarde, cuando doTag es ejecutado. Si el setDynamicAttribute método produce una excepción, la doTag

método no se invoca para la etiqueta, y la excepción debe ser tratada de la misma manera como si viniera de un método de atributo setter. La siguiente aplicación de setDynamicAttribute guarda los nombres

de atributos y valores en las listas. Luego, en el doTag método, los nombres y los valores se hizo eco de la respuesta en una lista HTML.

ArrayList claves privadas = new ArrayList (); ArrayList valores privados = new

ArrayList (); setDynamicAttribute pública vacío (uri String,

LocalName cadena, valor del objeto) lanza JspException {keys.add (localName); values.add (valor); }

doTag public void () lanza JspException, IOException {


JspWriter cabo = getJspContext () getout ().; for (int i = 0; i <keys.size (); i ++) {

Cadena de clave = (String) keys.get (i); valor Object = values.get (i);

out.println ( "<li>" + tecla + "=" + valor + "</ li>"); }}

Configuración de atributos de valor diferidos y atributos de los métodos diferidos


Para cada atributo de etiqueta que acepta una expresión de valor diferida o una expresión método de lo diferido, el controlador de etiqueta debe tener un método para acceder al valor del atributo.

Los métodos que acceden al valor de un atributo de valor diferida método deben aceptar una ValueExpression objeto. Los métodos que acceden al valor de un atributo de método de lo diferido deben
aceptar una MethodExpression objeto. Estos métodos toman la forma conjunto XXX , dónde XXX es el nombre del atributo.

El siguiente ejemplo muestra un método que puede ser utilizado para acceder al valor de un atributo de valor diferido llamado Nombre del Atributo :

privada javax.el.ValueExpression attributeName = null; setAttributeName public void (


javax.el.ValueExpression attributeName) { this.attributeName =

attributeName; }

atributos de valor diferidos y los atributos de los métodos diferidos son utilizados principalmente por la tecnología JavaServer Faces. Ver Obtención de los valores de atributo para un ejemplo de creación de un
controlador de etiqueta que procesa estos atributos para un JavaServer Faces aplicación.

Si usted tiene un atributo que es a la vez dinámico y diferidos (lo que significa que la definición atributo de etiqueta acepta una expresión diferida y tiene
rtexprvalue establecido en true), entonces la setX método que accede a este valor debe aceptar una Objeto instancia y prueba si el Objeto
instancia es una expresión de valor diferida, como se muestra en este pseudocódigo:

pública SetAttr void (Object obj) {


si (obj instancia de ValueExpression) {
// esto es una expresión diferida else {

// esto es un rtexpression}}

Controladores de etiquetas para etiquetas con Cuerpos


Un controlador simple etiqueta para una etiqueta con un cuerpo se implementa de forma diferente en función de si o no el controlador de etiqueta tiene que manipular el cuerpo. Un controlador de etiqueta manipula el
cuerpo cuando se lee o modifica el contenido del cuerpo.

Tag Handler no manipula el Cuerpo


Si un controlador de etiqueta simplemente necesita para evaluar el cuerpo, se pone el cuerpo mediante el getJspBody método de SimpleTag y luego evalúa el cuerpo usando el invocar método. El siguiente

controlador de etiqueta acepta una prueba parámetro y evalúa el cuerpo de la etiqueta si la prueba se evalúa como cierto . El cuerpo de la etiqueta se encapsula en un fragmento JSP. Si la prueba es cierto , el

controlador recupera el fragmento usando el getJspBody método. los invocar método dirige toda la salida a un escritor suministrado o, si el escritor es nulo , al JspWriter devuelto por el salí método de la JspContext

asociado con el controlador de etiqueta.

public class IfSimpleTag extiende SimpleTagSupport {


prueba de private boolean;
settest public void (prueba booleano) {
this.test = prueba; } doTag public void () lanza JspException, IOException {

si (prueba) {
. GetJspBody () invocar (null); }}}

Tag Handler manipula el Cuerpo


Si el controlador de etiqueta tiene que manipular el cuerpo, el controlador de etiqueta debe capturar el cuerpo en una StringWriter . los invocar método dirige toda la salida a un escritor que se suministra.
Entonces el cuerpo modificado se escribe en el JspWriter devuelto por el salí método de la JspContext . Por lo tanto, una etiqueta que convierte su cuerpo a mayúsculas se puede escribir como sigue:

SimpleWriter clase pública se extiende SimpleTagSupport {


doTag public void () lanza JspException, IOException {
StringWriter sw = new StringWriter (); jspBody.invoke (sw); jspContext ().

getout () println (sw.toString () toUpperCase ().).;


}}

Controladores de etiquetas para las etiquetas que definen las variables


Existen mecanismos de comunicación similares para la comunicación entre la página y etiquetas JSP manipuladores como para las páginas JSP y los archivos de etiquetas. Emular EN parámetros, atributos de uso de la etiqueta.

Un atributo de etiqueta se comunica entre la página de llamada y el controlador de etiqueta cuando se invoca la etiqueta. Ninguna otra comunicación se produce entre la página de llamada y el controlador de etiqueta. Emular FUERA

o parámetros anidados, usan variables con disponibilidad AL PRINCIPIO , AT_END , o ANIDADO . La variable no se ha inicializado por la página de llamada, sino que es fijado por el controlador de etiqueta. por AL PRINCIPIO la

disponibilidad, la variable está disponible en la página de llamada de la etiqueta de inicio hasta que el alcance de cualquier etiqueta donde se incluye. Si no hay etiqueta donde se incluye, entonces la variable está disponible al

final de la página. por AT_END la disponibilidad, la variable está disponible en la página de llamada después de la etiqueta de cierre hasta que el alcance de cualquier etiqueta donde se incluye. Si no hay etiqueta donde se incluye,

entonces la variable está disponible al final de la página. Para los parámetros anidados, la variable disponible en la página de llamada entre la etiqueta de inicio y la etiqueta final.

Al desarrollar un controlador de etiqueta usted es responsable de la creación y configuración del objeto referenciado por la variable en un contexto en el que se puede acceder desde la página. Esto se hace
mediante el uso de la JspContext () . setAttribute (nombre, valor) o
JspContext.setAttribute (nombre, valor, alcance) método. Recuperar el contexto de la página utilizando el getJspContext método de
SimpleTag .
Por lo general, un atributo se pasa a la etiqueta personalizada especifica el nombre de la variable y el valor de la variable depende de otro atributo. Por ejemplo, el iterador tag introducido en Capítulo 5,
tecnología JavaServer Pages recupera el nombre de la variable de la var
atribuir y determina el valor de la variable a partir de un cálculo realizado en el grupo atributo.

doTag public void () lanza JspException, IOException {


si (iterador == null)
regreso;
while (iterator.hasNext ()) {
. GetJspContext () setAttribute (var, iterator.next ()); . GetJspBody () invocar (null); }

} Public void setVar (String var) {

this.var = var;
Public void} setGroup (grupo Collection) {

this.group = grupo; si (group.size ()> 0)

iterador = group.iterator ();


}

El alcance que una variable puede haber se resume en Tabla 8-13 . El alcance limita la accesibilidad y la vida útil del objeto. Tabla 8-13 Ámbito de objetos

Nombre accesible desde Toda la vida

página Página actual Hasta que la respuesta ha sido enviado de vuelta al usuario o la petición
se pasa a una nueva página

solicitud página actual y las páginas incluidas o reenviados Hasta que la respuesta ha sido enviado de vuelta al usuario

sesión solicitud actual y cualquier solicitud posterior desde el mismo navegador (con La vida de la sesión del usuario
duración de sesión)

Nombre accesible desde Toda la vida

solicitud Actual y cualquier solicitud futura de la misma aplicación web La vida de la aplicación

TagExtraInfo Clase

Declaración de variables de la etiqueta de controladores de etiquetas discutió cómo proporcionar información sobre las variables de la etiqueta en el descriptor de la biblioteca. En esta sección se describe otro enfoque: la
definición de una clase extra info etiqueta. Se define una clase extra info etiqueta extendiendo la clase
javax.servlet.jsp.tagext.TagExtraInfo . UN TagExtraInfo debe implementar la getVariableInfo método para devolver una matriz de
VariableInfo objetos que contienen la siguiente información:

Nombre de la variable de

clase variable

Si la variable se refiere a un nuevo objeto de la

disponibilidad de la variable

El contenedor banda pasa un parámetro de tipo javax.servlet.jsp.tagext.TagData al getVariableInfo método, que contiene tuplas atributo-valor para cada uno de los atributos de la etiqueta. Estos atributos
pueden ser utilizados para proporcionar la VariableInfo objeto con el nombre y la clase de una variable EL.

El siguiente ejemplo demuestra cómo proporcionar información sobre la variable creada por el iterador etiqueta en una clase de información adicional de la etiqueta. Debido a que el nombre ( var ) y la clase ( tipo
) de la variable se pasa como atributos de las etiquetas, pueden ser recuperados utilizando el
data.getAttributeString método y se puede utilizar para rellenar el VariableInfo constructor. Para permitir que la variable var para ser utilizado sólo dentro del cuerpo de la etiqueta, se establece el alcance
del objeto a ANIDADO .

iterador paquete;
public class IteratorTEI extiende TagExtraInfo {
pública VariableInfo [] getVariableInfo (datos) {tagdata
tipo String = data.getAttributeString ( "tipo"); si (tipo == null)

type = "java.lang.Object"; volver nueva VariableInfo


[] {
nueva VariableInfo (data.getAttributeString ( "var"), el tipo, es cierto,

VariableInfo.NESTED)
}; }}

El nombre completo de la clase de información adicional etiqueta definida por una variable EL debe ser declarado en el dominio de nivel superior en el tei de clase subelemento del
etiqueta elemento. Por lo tanto, la tei de clase elemento para IteratorTei sería la siguiente:

<Tei de clase>
iterator.IteratorTEI </ clase tei>

cooperar Etiquetas
Etiquetas cooperan mediante el intercambio de objetos. La tecnología JSP es compatible con dos estilos de intercambio de objetos.

El primer estilo requiere que un objeto compartido se llamará y se almacena en el contexto de la página (uno de los objetos implícitos accesibles a las páginas JSP, así como controladores de etiquetas). Para acceder a
los objetos creados y nombrados por otra etiqueta, un controlador de etiqueta utiliza el pageContext.getAttribute (nombre, alcance)
método.

En el segundo estilo de intercambio de objeto, un objeto creado por el controlador de etiqueta envolvente de un grupo de etiquetas anidadas está disponible para todos controladores de etiquetas interiores. Esta forma de intercambio de

objeto tiene la ventaja de que utiliza un espacio de nombres privado para los objetos, lo que reduce el potencial de conflictos de nombres. Para acceder a un objeto creado por una etiqueta que encierra, un controlador de etiqueta debe

obtener primero su etiqueta envolvente mediante el método estático


SimpleTagSupport.findAncestorWithClass (de, clase) o el SimpleTagSupport.getParent método. El primer método se debe utilizar cuando un agrupamiento específico de controladores de etiquetas no se puede
garantizar. Después de que el antepasado se ha recuperado, un manejador de etiqueta se puede acceder a los objetos creados estática o dinámica. estáticamente objetos creados son miembros de la matriz. Los
objetos privados también se pueden crear de forma dinámica. Tales objetos nombrados privada tendrían que ser gestionado por el controlador de etiqueta; Un enfoque sería utilizar una Mapa para almacenar pares de
nombre a objetos. El siguiente ejemplo ilustra un controlador de etiqueta que soporta tanto el enfoque y el enfoque llamado objeto privado a compartir objetos. En el ejemplo, el controlador para una etiqueta de
consulta comprueba si un atributo nombrado ID de conexión ha sido establecido. Si el ID de conexión atributo ha sido establecido, el controlador recupera el objeto de conexión desde el contexto de la página. De lo
contrario, el controlador de etiqueta recupera primero el controlador de etiqueta para la etiqueta de cerramiento y a continuación, recupera el objeto de conexión a partir de ese controlador.

public class QueryTag extiende SimpleTagSupport {


public int doTag () {lanza JspException
Cadena cid = getConnectionId (); conexión de conexión; si
(cid! = null) {

// hay un id de conexión, lo utilizan


conexión = (Connection) pageContext.
getAttribute (cid);
} Else {
ConnectionTag ancestorTag =
(ConnectionTag) findAncestorWithClass (esto,
ConnectionTag.class);
si (ancestorTag == null) {
arrojar nueva JspTagException ( "Una consulta sin
un atributo de conexión debe estar anidada dentro de una etiqueta de
conexión. ");
} conexión = ancestorTag.getConnection ();

. . .
}}}

El código de consulta ejecutado por este controlador de etiqueta se puede utilizar en cualquiera de las siguientes maneras:

<Tt: Conexión cid = "con01" ...>


. . .
</ Tt: Conexión>
<Tt: consulta de saldos id = "" ID de conexión = ""> con01
SELECT cuenta, el balance DE acct_table
donde CUSTOMER_NUMBER =?
<Tt: param value = "$ {} requestScope.custNumber" /> </ tt: consulta>

<Tt: conexión ...>


<tt: consulta de saldos cid = "">
SELECT cuenta, el balance DE acct_table donde CUSTOMER_NUMBER =?

<Tt: param value = "$ {} requestScope.custNumber" /> </ tt: query> </ tt: Conexión>

El TLD para el controlador de etiqueta utiliza la siguiente declaración para indicar que el ID de conexión atributo es opcional:

<Tag> ...

<Atributo>
<Nombre> ID de conexión </ name> <required>
false </ required> </ attribute> </ tag>
Ejemplos controlador de etiqueta
Las etiquetas simples descritos en esta sección demuestran soluciones a dos problemas recurrentes en el desarrollo de aplicaciones JSP: reducir al mínimo la cantidad de programación Java en páginas
JSP y asegurar un aspecto común en todas las aplicaciones. De este modo, se ilustran muchos de los estilos de etiquetas discutidos en la primera parte del capítulo.

Una iteración Tag


La construcción de contenido de la página que depende de los datos generados dinámicamente a menudo requiere el uso de declaraciones de secuencias de comandos de control de flujo. Al mover la lógica de control de flujo para

etiquetar los manipuladores, etiquetas de flujo de control reducen la cantidad de secuencias de comandos necesarios en las páginas JSP. Iteración es una función de control de flujo muy común y es fácilmente manejado por una

etiqueta personalizada. La discusión sobre el uso de bibliotecas de etiquetas en Capítulo 5, tecnología JavaServer Pages introducido una biblioteca de etiquetas que contiene una iterador etiqueta. La etiqueta recupera objetos de

una colección almacenada en un componente JavaBeans y los asigna a una variable EL. El cuerpo de la etiqueta recupera información de la variable. Mientras siguen siendo elementos de la colección, la iterador etiqueta hace que

el cuerpo ser reevaluado. La etiqueta en este ejemplo se ha simplificado para que sea fácil de demostrar cómo programar una etiqueta personalizada. aplicaciones web que requieren dicha funcionalidad se debe usar el JSTL

para cada etiqueta, que se discute en Etiquetas iterador .

página JSP
los index.jsp invoca la página iterador etiqueta para iterar a través de una colección de nombres de departamento. Cada elemento de la colección se asigna a la Nombre de Departamento variable.

<% @ Taglib uri = "/ TLT" prefijo = "TLT" %> <html>

<Head>
<Title> Departamentos </ title> </ head>

<Body bgcolor = "blanco">


<Jsp: useBean id = "MyOrg" class = "myorg.Organization" /> <table border = 2 cellspacing = 3
cellpadding = 3>
<Tr> <Td> <b> Departamentos </ b> </ td> </ tr>

<TLT: iterador var = tipo "DepartmentName" = "java.lang.String"


group = "$ {} myorg.departmentNames"> <tr> <Td> <a

href="list.jsp?deptName=${departmentName}">
$ {} DepartmentName </a> </ td>
</ Tr>
</ TLT: iterador> </ table> </
body> </ html>

tag Handler
La colección se encuentra en el controlador de etiqueta por medio de la grupo atributo. El controlador de etiqueta recupera un elemento del grupo y pasa el elemento de volver a la página en la variable EL
cuyo nombre está determinada por la var atributo. La variable se accede en la página de llamada usando el lenguaje de expresión JSP. Después de que se establece la variable, el cuerpo de la etiqueta se
evalúa con el invocar método.

doTag public void () lanza JspException, IOException {


si (iterador == null)
regreso;
while (iterator.hasNext ()) {
. GetJspContext () setAttribute (var, iterator.next ()); . GetJspBody () invocar (null); }

} Public void setVar (String var) {

this.var = var;
Public void} setGroup (grupo Collection) {

this.group = grupo; si (group.size ()> 0)

iterador = group.iterator ();


}

Una biblioteca de plantillas de etiquetas


Una plantilla proporciona una manera de separar los elementos comunes que son parte de cada pantalla de los elementos que cambian con cada pantalla de una aplicación. Poner todos los elementos
comunes en un único archivo hace que sea más fácil de mantener y hacer cumplir una apariencia uniforme en todas las pantallas. También hace que el desarrollo de pantallas individuales más fácil debido a
que el diseñador puede centrarse en porciones de una pantalla que son específicos de esa pantalla, mientras que la plantilla se encarga de las partes comunes.

La plantilla es una página JSP que tiene marcadores de posición para las partes que tienen que cambiar con cada pantalla. Cada uno de estos marcadores de posición se conoce como un parámetro de la plantilla. Por ejemplo,
una plantilla simple podría incluir un parámetro de título para la parte superior de la pantalla generada y un parámetro de cuerpo para hacer referencia a una página JSP para el contenido personalizado de la pantalla.
La plantilla utiliza un conjunto de etiquetas anidadas ( definición , pantalla , y parámetro ) para definir una tabla de definiciones de pantalla y utiliza una
insertar etiqueta para insertar parámetros de una definición pantalla en una pantalla de la aplicación específica.

Páginas JSP
La plantilla, por ejemplo, la librería de Duke, Tut instalar / javaeetutorial5 / examples / web / bookstore3 / web / plantilla / template.jsp , se muestra a continuación. Esta página incluye una página JSP
que crea la definición de la pantalla y luego utiliza el insertar etiqueta para insertar parámetros de la definición en la pantalla de la aplicación.

<% @ Taglib uri = "/ tutorial-plantilla" prefix = "tt" %> <% @ page ErrorPage = "/ template /
errorinclude.jsp" %> <% @ include file = "/ template / screendefinitions.jsp" % > <html> <head> <title>

<Tt: inserto definición = "librería" parámetro = "título" /> </ title> </ head>

<Body bgcolor = "# FFFFFF">


<Tt: inserto definición = "librería" parámetro = "bandera" /> <tt: insertar definición = "librería" parámetro =
"cuerpo" />
<Center> <em> Derechos de autor y copia; 2004 Sun Microsystems, Inc. </ em> </ center> </ body> </ html>

los tut-install / javaeetutorial5 / examples / web / bookstore3 / web / plantilla / screendefinitions.jspf página crea una definición de la pantalla especificada por el atributo de la petición javax.servlet.forward.servlet_path
:

<Tt: definición name = "librería" de pantalla = "$


{requestScope
[ 'Javax.servlet.forward.servlet_path']} "> <tt: id pantalla =" / librería ">

<Tt: parámetro name = "título" value = "Librería de Duke"


directa = "true" />
<Tt: parámetro de nombre = valor "bandera" = "/ template / banner.jsp"
directa = "false" />
<Tt: parámetro de nombre = valor "cuerpo" = "/ bookstore.jsp"
directa = "false" /> </ tt:
Pantalla>
<Tt: pantalla id = "/ BOOKCATALOG">
<Tt: parámetro name = "título" directa = "true">
<Jsp: atributo name = "valor">
<Fmt: clave de mensaje = "TitleBookCatalog" /> </ jsp: attribute> </ tt:
parámetro>

<Tt: parámetro de nombre = valor "bandera" = "/ template / banner.jsp"


directa = "false" />
<Tt: parámetro de nombre = valor "cuerpo" = "/ bookcatalog.jsp" directo = "true" /> </ tt: pantalla>

. . .
</ Tt: definición>

La plantilla se crea una instancia por el Transportista servlet. Transportista primero obtiene la pantalla solicitada. Transportista realiza objetos de lógica de negocio y actualizaciones modelo basado en la
pantalla solicitada. Por ejemplo, si la pantalla es solicitado / BOOKCATALOG , Transportista determina si un libro está siendo añadido a la cesta basado en el valor del parámetro de solicitud de adición. Se
establece el precio del libro si está en venta, y después se añade el libro a la cesta. Por último, el servlet envía la solicitud a template.jsp :

Despachador clase pública se extiende HttpServlet {


@Recurso
utx UserTransaction;

doGet pública vacío (solicitud de HttpServletRequest,


HttpServletResponse respuesta) {String bookId = null; libro
libro = null; Cadena claro = null; BookDBAO bookDBAO =

(BookDBAO) getServletContext ().


getAttribute ( "bookDBAO");
HttpSession session = request.getSession (); Cadena selectedScreen = request.getServletPath
(); ShoppingCart carrito = (ShoppingCart) sesión.

getAttribute ( "cesta"); si (la compra ==


null) {
carrito = new ShoppingCart (); session.setAttribute ( "carro", la compra); } si

(selectedScreen.equals ( "/ BOOKCATALOG")) {

bookId = request.getParameter ( "Añadir"); if (! bookId.equals ( "")) {

tratar { libro = bookDBAO.getBook (bookId);

si (book.getOnSale ()) {
doble venta = book.getPrice () * 0,85; Flotador salePrice = new Float

(venta); book.setPrice (salePrice.floatValue ()); } cart.add (bookId, libro); } Catch

(BookNotFoundException ex) {

// imposible } }

} Else if (selectedScreen.equals ( "/ bookshowcart")) {


bookId = request.getParameter ( "Eliminar"); si (bookId! = null) {

cart.remove (bookId); } clear = request.getParameter ( "Borrar"); si (claro! = null

&& clear.equals ( "claro")) {

cart.clear (); }

} Else if (selectedScreen.equals ( "/ bookreceipt")) {// actualizar el inventario

tratar { utx.begin ();

bookDBAO.buyBooks (CART); utx.commit (); }


Catch (Exception ex) {

tratar { utx.rollback ();

request.getRequestDispatcher (
"/bookordererror.jsp"). hacia adelante (solicitud,
respuesta);
} Catch (Exception e) {
System.out.println (
"Error en retroceso:" + e.getMessage ());
e.printStackTrace ();
} } } tratar

{ solicitud.

getRequestDispatcher ( "/template/template.jsp").
hacia adelante (solicitud, respuesta);

} Catch (Exception ex) {


ex.printStackTrace (); }}

doPost pública vacío (solicitud de HttpServletRequest,


HttpServletResponse respuesta) {
request.setAttribute ( "selectedScreen", request.getServletPath ()); tratar { solicitud.

getRequestDispatcher ( "/template/template.jsp").
hacia adelante (solicitud, respuesta);

} Catch (Exception ex) {


ex.printStackTrace (); }}}

controladores de etiquetas
La biblioteca de etiquetas de plantilla contiene cuatro controladores de etiquetas ( DefinitionTag , ScreenTag , ParameterTag , y InsertTag ) que demuestran el uso de etiquetas de cooperar. DefinitionTag , ScreenTag
, y ParameterTag constituyen un conjunto de controladores de etiquetas anidadas que comparten objetos privados. DefinitionTag crea un objeto público denominado librería que es utilizado por InsertTag .

En doTag , Tut instalar / javaeetutorial5 / examples / web / bookstore3 / src / java / com / sun / bookstore3 / template / DefinitionTag.java

crea un objeto privado llamado pantallas que contiene una tabla hash de definiciones de pantalla. Una definición de la pantalla consiste en un identificador de pantalla y un conjunto de parámetros asociados
con la pantalla. Estos parámetros se cargan cuando el cuerpo de la etiqueta de definición, que contiene anidada pantalla
y parámetro etiquetas, se invoca. DefinitionTag crea un objeto de la clase pública Tut instalar / javaeetutorial5 / examples / web / bookstore3 / src / java / com / sun / bookstore3 / template / Definition.java , selecciona
una definición de la pantalla de la pantallas objeto basa en la URL que ha facilitado en la solicitud, y utiliza esta definición de la pantalla para inicializar un público

Definición objeto.

public int doTag () {


tratar { pantallas = new HashMap ();

. GetJspBody () invocar (null);


Definición definición = nueva definición (); contexto PageContext = (PageContext) getJspContext ();
params ArrayList = (ArrayList) screens.get (screenId);
Iterator IR = null; si (params! = null) {

IR = params.iterator (); while (ir.hasNext ())

definition.setParam ((parámetro) ir.next ());


// ponga la definición en el contexto de la página context.setAttribute (definitionName,
definición,
context.APPLICATION_SCOPE); }}

La tabla de definiciones de pantalla se rellena por ScreenTag y ParameterTag de texto proporcionado como atributos a estas etiquetas. Tabla 8-14 muestra el contenido de la tabla hash definiciones de

pantalla para la aplicación de librería de Duke. Tabla 8-14 Definiciones de pantalla

Identificación de pantalla Título Bandera Cuerpo

/librería Librería de Duke /banner.jsp /bookstore.jsp

/ BOOKCATALOG catálogo de libros /banner.jsp /bookcatalog.jsp

/ bookdetails Descripción del libro /banner.jsp /bookdetails.jsp

/ bookshowcart Carrito de compras /banner.jsp /bookshowcart.jsp

/ bookcashier Cajero /banner.jsp /bookcashier.jsp

/ bookreceipt Recibo /banner.jsp /bookreceipt.jsp

Si la URL aprobada en la solicitud es / librería , el Definición objeto contiene los elementos de la primera fila de Tabla 8-14 (ver Tabla 8-15 ). Contenido Tabla 8-15 Definición de objeto para el URL / librería

Título Bandera Cuerpo

Librería de Duke /banner.jsp /bookstore.jsp

Los parámetros de la URL / librería se muestran en la Tabla 8-16 . Los parámetros especifican que el valor de la título parámetro, Librería de Duke , debe ser insertado directamente en el flujo de salida, pero

los valores de bandera y cuerpo deben incluirse de forma dinámica. Tabla 8-16 Parámetros para la URL / librería

Nombre del parámetro parámetro Valor isDirect

título Librería de Duke cierto

bandera /banner.jsp falso

cuerpo /bookstore.jsp falso

tut-install / javaeetutorial5 / examples / web / bookstore3 / src / java / com / sun / bookstore3 / template / InsertTag.java
inserta parámetros de la definición de la pantalla en la respuesta. los doTag método recupera el objeto definición del contexto de la página y luego inserta el valor del parámetro. Si el parámetro es directa,
que se inserta directamente en la respuesta; de lo contrario, la solicitud se envía al parámetro, y la respuesta se incluye de forma dinámica en la respuesta global.
doTag public void () {lanza JspTagException
Definición definición = null; Parámetro Parámetro = null;
directInclude boolean = false;

contexto PageContext = (PageContext) getJspContext ();

// obtener la definición de la definición del contexto de la página = (definición)


context.getAttribute (
definitionName, context.APPLICATION_SCOPE); // obtener el parámetro

si (nombreParámetro! =! nula definición && = null)


parámetro = (parámetro)
definition.getParam (nombreParámetro);

si (parámetro! = null)
directInclude = parameter.isDirect (); tratar { // si el parámetro es directa,

impresión a cabo
si (parámetro directInclude &&! = null)
. Context.getOut () print (parameter.getValue ()); // si el parámetro es indirecta,

incluir los resultados de despachar a la página


else {
if ((parámetro! = null) &&
(Parameter.getValue ()! = Null)) context.include
(parameter.getValue ()); }

} Catch (Exception ex) {


arrojar nueva JspTagException (ex.getMessage ()); }}

Anterior: Capítulo 7 de JavaServer Pages Standard Tag Library Siguiente: Capítulo 9 de secuencias de comandos en páginas JSP

© 2010, Oracle Corporation y / o sus filiales

Вам также может понравиться