Las etiquetas personalizadas son elementos del lenguaje JSP definidos por el usuario. Cuando una página JSP contiene una etiqueta personalizada que se convierte en un servlet, la etiqueta se convierte en operaciones en un objeto llamado controlador de etiquetas, que es lo que llama el contenedor web cuando se ejecuta el servlet.
La extensión de etiquetas JSP le permite crear nuevas etiquetas e insertarlas directamente en una página JSP. Los controladores de etiquetas simples se introdujeron en la especificación JSP 2.0 para escribir estas etiquetas personalizadas.
Puede heredar la clase SimpleTagSupport y anular el método doTag() para desarrollar la etiqueta personalizada más simple.
A continuación, queremos crear una etiqueta personalizada llamada <ex:Hello> con el siguiente formato:
<ejemplo:Hola/>
Para crear etiquetas JSP personalizadas, primero debe crear la clase Java que maneja las etiquetas. Entonces, creemos una clase HelloTag de la siguiente manera:
paquete com.tutorialspoint;importar javax.servlet.jsp.tagext.*;importar javax.servlet.jsp.*;importar java.io.*;la clase pública HelloTag extiende SimpleTagSupport { public void doTag() lanza JspException, IOException { JspWriter fuera = getJspContext().getOut(); out.println("¡Hola etiqueta personalizada!");
El siguiente código reescribe el método doTag(), que utiliza el método getJspContext() para obtener el objeto JspContext actual y pasa "¡Hola etiqueta personalizada!" al objeto JspWriter.
Compile la clase anterior y cópiela en el directorio de la variable de entorno CLASSPATH. Finalmente, cree la siguiente biblioteca de etiquetas: <directorio de instalación de Tomcat> webappsROOTWEB-INFcustom.tld.
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>TLD de ejemplo</short-name> <tag> <nombre>Hola</nombre > <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>vacío</body-content> </tag></taglib>
A continuación, podemos usar la etiqueta Hello en el archivo JSP:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Una etiqueta personalizada de muestra</title> </head> <body> <ex:Hola /> </cuerpo></html>
El resultado del programa anterior es:
¡Hola etiqueta personalizada!
Puede incluir el contenido del mensaje en etiquetas al igual que la biblioteca de etiquetas estándar. Si queremos incluir contenido en nuestro Hello personalizado, el formato es el siguiente:
<ex:Hola> Este es el cuerpo del mensaje</ex:Hola>
Podemos modificar el archivo de clase de procesamiento de etiquetas, el código es el siguiente:
paquete com.tutorialspoint;importar javax.servlet.jsp.tagext.*;importar javax.servlet.jsp.*;importar java.io.*;la clase pública HelloTag extiende SimpleTagSupport { StringWriter sw = new StringWriter(); public void doTag( ) lanza JspException, IOException { getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString() }}
A continuación necesitamos modificar el archivo TLD de la siguiente manera:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>TLD de ejemplo con cuerpo</short-name> <tag> <nombre>Hola< /nombre> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>sin script</body-content> </tag></taglib>
Ahora podemos usar la etiqueta modificada en JSP como se muestra a continuación:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Una etiqueta personalizada de muestra</title> </head> <body> <ex:Hola > Este es el cuerpo del mensaje </ex:Hola> </body></html>
El resultado del programa anterior es el siguiente:
Este es el cuerpo del mensaje.
Puede establecer varios atributos en estándares personalizados. Para recibir atributos, la clase de etiqueta personalizada de valor debe implementar el método de establecimiento. El método de establecimiento en JavaBean es el siguiente:
paquete com.tutorialspoint;importar javax.servlet.jsp.tagext.*;importar javax.servlet.jsp.*;importar java.io.*;la clase pública HelloTag extiende SimpleTagSupport { mensaje de cadena privado; setMessage público vacío (mensaje de cadena) { this.message = msg; } StringWriter sw = new StringWriter(); public void doTag() lanza JspException, IOException { if (message != null) { /* Usar el mensaje del atributo */ JspWriter out = getJspContext().getOut(); out.println( message } else { /* Usar el mensaje del; cuerpo del contenido */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); }}
El nombre de la propiedad es "mensaje", por lo que el método de establecimiento es setMessage(). Ahora agreguemos este atributo en el elemento <attribute> utilizado en el archivo TLD:
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>TLD de ejemplo con cuerpo</short-name> <tag> <nombre>Hola< /nombre> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>scriptless</body-content> <atributo> <nombre>mensaje</nombre> </atributo> </tag></taglib>
Ahora podemos usar el atributo de mensaje en el archivo JSP de la siguiente manera:
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>Una etiqueta personalizada de muestra</title> </head> <body> <ex:Hola message="Esta es una etiqueta personalizada" /> </body></html>
El resultado de salida de los datos del ejemplo anterior es:
Esta es una etiqueta personalizada
También puede incluir los siguientes atributos:
propiedad | describir |
---|---|
nombre | Define el nombre del atributo. El nombre del atributo debe ser único para cada etiqueta. |
requerido | Especifica si el atributo es obligatorio u opcional. Si se establece en falso, es opcional. |
valorrexpr | Declara si el atributo de etiqueta es válido al ejecutar la expresión. |
tipo | El tipo de clase Java que define esta propiedad. Predeterminado especificado como cadena |
descripción | Información de descripción |
fragmento | Si se declara este atributo, el valor del atributo se tratará como un JspFragment . |
A continuación se muestra un ejemplo de cómo especificar propiedades relevantes:
..... <atributo> <nombre>nombre_atributo</nombre> <required>falso</required> <tipo>java.util.Fecha</tipo> <fragmento>falso</fragmento> </atributo>.. ...
Si está utilizando ambos atributos, modifique el archivo TLD de la siguiente manera:
..... <atributo> <nombre>nombre_atributo1</nombre> <required>falso</required> <tipo>java.util.Boolean</tipo> <fragmento>falso</fragmento> </atributo> <atributo > <nombre>nombre_atributo2</nombre> <required>verdadero</required> <tipo>java.util.Fecha</tipo> </atributo>.....