English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Etiquetas personalizadas de JSP

Las etiquetas personalizadas son elementos del lenguaje JSP definidos por el usuario. Cuando una página JSP contiene una etiqueta personalizada, se convierte en un servlet, y la etiqueta se convierte en una    Las operaciones del objeto llamado tag handler, es decir, las operaciones que el contenedor web llama cuando se ejecuta el servlet.

La extensión de etiquetas JSP te permite crear nuevas etiquetas e insertarlas directamente en una página JSP. JSP 2La especificación .0 introdujo los gestores de etiqueta simples para escribir estos marcadores personalizados.

Puedes heredar de SimpleTagSupport y reescribir el método doTag() para desarrollar una etiqueta personalizada más simple.

Crear la etiqueta "Hello"

A continuación, queremos crear una etiqueta personalizada llamada <ex:Hello>, con el formato siguiente:

<ex:Hello />

Para crear una etiqueta JSP personalizada, primero debes crear la clase Java que maneja la etiqueta. Por lo tanto, creemos una clase HelloTag, como se muestra a continuación:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
  public void doTag() throws JspException, IOException {
    JspWriter out = getJspContext().getOut();
    out.println("Hello Custom Tag!");
  }
}

El siguiente código reescribe el método doTag(), que utiliza el método getJspContext() para obtener el objeto JspContext actual y pasa "Hello Custom Tag!" al objeto JspWriter.

Compila las clases anteriores y cópialas al directorio CLASSPATH de la variable de entorno. Finalmente, crea la siguiente biblioteca de etiquetas: <directorio de instalación de Tomcat>webapps\ROOT\WEB-INF\custom.tld。

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>empty</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>A sample custom tag</title>
  </head>
  body>
    <ex:Hello/>
  </body>
</html>

El resultado de salida del programa anterior es el siguiente:

Hello Custom Tag!

Acceder al cuerpo de la etiqueta

Puedes incluir contenido de mensaje en la etiqueta como lo harías en una biblioteca de etiquetas estándar. Si queremos incluir contenido en nuestra etiqueta personalizada Hello, el formato es el siguiente:

<ex:Hello>
   This is message body
</ex:Hello>

Podemos modificar el archivo de clase del procesador de etiqueta, el código es el siguiente:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       getJspBody().invoke(sw);
       getJspContext().getOut().println(sw.toString());
    }
}

A continuación, necesitamos modificar el archivo TLD, como se muestra a continuación:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD with Body</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</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>A sample custom tag</title>
  </head>
  body>
    <ex:Hello>
        This is message body
    </ex:Hello>
  </body>
</html>

El resultado de salida del programa anterior se muestra a continuación:

This is message body

Atributos de etiqueta personalizada

Puedes configurar varios atributos en los estándares personalizados, para recibir atributos, la clase de etiqueta personalizada debe implementar el método setter, el método setter en JavaBean se muestra a continuación:

package com.w3codebox;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;
public class HelloTag extends SimpleTagSupport {
   private String message;
   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()
      throws JspException, IOException
    {
       if (message != null) {
          /* Usar el mensaje desde el atributo */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* Usar el mensaje desde el cuerpo del contenido */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }
}

El nombre del atributo es "message", por lo tanto, el método setter es setMessage(). Ahora agreguemos este atributo al elemento <attribute> del archivo TLD:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Example TLD with Body</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
    <attribute>
       <name>message</name>
    </attribute>
  </tag>
</taglib>

Ahora podemos usar la propiedad message en los archivos JSP, como se muestra a continuación:

<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%>
<html>
  <head>
    <title>A sample custom tag</title>
  </head>
  body>
    <ex:Hello message="This is custom tag" />
  </body>
</html>

El resultado de la salida de los datos del ejemplo anterior es:

This is custom tag

También puede incluir los siguientes atributos:

AtributoDescripción
nameDefine el nombre del atributo. Cada nombre de atributo debe ser único para cada etiqueta.
requiredEspecificar si el atributo es obligatorio o opcional. Si se establece en false, es opcional.
rtexprvalueDeclarar si el atributo está disponible en la expresión de ejecución.
typeDefine el tipo de clase Java del atributo. El valor predeterminado es String
descriptioninformación de descripción
fragmentSi se declara este atributo, el valor del atributo se considerará un JspFragment

A continuación se muestra un ejemplo de atributos relacionados especificados:

.....
    <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
    </attribute>
.....

Si ha utilizado dos atributos, modifique el archivo TLD como se muestra a continuación:

.....
    <attribute>
      <name>attribute_name1</name>
      <required>false</required>
      <type>java.util.Boolean</type>
      <fragment>false</fragment>
    </attribute>
    <attribute>
      <name>attribute_name2</name>
      <required>true</required>
      <type>java.util.Date</type>
    </attribute>
.....