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

Tags Personalizadas JSP

Rótulos personalizados são elementos da linguagem JSP definidos pelo usuário. Quando uma página JSP contém um rótulo personalizado, ele é convertido em servlet, e o rótulo é convertido em operações para ser    Operações do objeto chamado tag handler, que são chamadas pelo Web container quando o servlet é executado.

A extensão de rótulos JSP permite que você crie novos rótulos e os insira diretamente em uma página JSP. JSP 2A especificação .0 introduziu Simple Tag Handlers para escrever esses rótulos personalizados.

Você pode herdar a classe SimpleTagSupport e sobrescrever o método doTag() para desenvolver o rótulo personalizado mais simples.

Criar o rótulo "Hello"

Em seguida, queremos criar um rótulo personalizado chamado <ex:Hello>, o formato do rótulo é:

<ex:Hello />

Para criar um rótulo JSP personalizado, você deve primeiro criar uma classe Java que manipula o rótulo. Portanto, vamos criar uma classe HelloTag, conforme mostrado a seguir:

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!");
  }
}

O seguinte código sobrescreve o método doTag(), que usa o método getJspContext() para obter o objeto JspContext atual e passa "Hello Custom Tag!" para o objeto JspWriter.

Compile os classes acima, copie-as para o diretório CLASSPATH da variável de ambiente. Finalmente, crie a seguinte biblioteca de rótulos: <Tomcat installation directory>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 seguir, podemos usar o rótulo Hello no arquivo JSP:

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

O resultado de saída do programa acima é:

Hello Custom Tag!

Acesso ao corpo do rótulo

Você pode incluir o conteúdo da mensagem no rótulo, como a biblioteca de rótulos padrão. Se quisermos incluir conteúdo no nosso personalizado Hello, o formato é o seguinte:

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

Podemos modificar o arquivo da classe do processador de rótulo, o código é o seguinte:

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());
    }
}

Em seguida, precisamos modificar o arquivo TLD, conforme mostrado a seguir:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Exemplo TLD com Corpo</short-name>
  <tag>
    <name>Hello</name>
    <tag-class>com.w3codebox.HelloTag</tag-class>
    <body-content>scriptless</body-content>
  </tag>
</taglib>

Agora podemos usar o rótulo modificado no JSP, conforme mostrado a seguir:

<%@ 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>

O resultado de saída do programa acima é mostrado a seguir:

This is message body

Propriedades do rótulo personalizado

Você pode configurar várias propriedades no padrão personalizado, para receber propriedades, a classe de rótulo personalizado deve implementar o método setter, o método setter no JavaBean é mostrado a seguir:

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 mensagem da propriedade */
          JspWriter out = getJspContext().getOut();
          out.println( message );
       }
       else {
          /* Usar mensagem do corpo do conteúdo */
          getJspBody().invoke(sw);
          getJspContext().getOut().println(sw.toString());
       }
   }
}

O nome do atributo é "message", então o método setter é setMessage(). Agora vamos adicionar este atributo no elemento <attribute> do arquivo TLD:

<taglib>
  <tlib-version>1.0</tlib-version>
  <jsp-version>2.0</jsp-version>
  <short-name>Exemplo TLD com Corpo</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>

Agora podemos usar a propriedade message em arquivos JSP, conforme exemplo a seguir:

<%@ 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>

O resultado da saída do exemplo acima é:

This is custom tag

Você ainda pode incluir os seguintes atributos:

AtributoDescrição
nameDefine o nome do atributo. O nome do atributo de cada tag deve ser único.
requiredespecifica se o atributo é obrigatório ou opcional. Se definido como false, é opcional.
rtexprvaluedeclara se o atributo é válido no tempo de execução da expressão.
typeDefine o tipo de classe Java do atributo. O valor padrão é String
descriptioninformação descritiva
fragmentSe declarado, o valor do atributo será tratado como um JspFragment

A seguir está um exemplo de atributo relacionado especificado:

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

Se você usou dois atributos, modifique o arquivo TLD conforme abaixo:

.....
    <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>
.....