Taglibs - Segunda Parte: Implementação de um TagLib

Dezembro 2016


Voir la première partie de l'astuce Taglibs (Primeira Parte): Apresentação
Um arquivo XML, que é o descritor do Taglib, é obrigatório para usar um TagLib. Este arquivo define as tags (etiquetas) da biblioteca. Abaixo, veja este exemplo:
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<taglib> 
 <tlib-version>1.0</tlib-version> 
 <jsp-version>1.2</jsp-version> 
  <short-name>montagamoi</short-name> 

<uri>http://www.owliance.com/taglibs/montagamoi-1.0</uri> 
 <description>Biblioteca de taglibs</description>  
<tag> 
  <name>switchtag</name> 
  <tag-class>monpackage.SwitchTag</tag-class> 
  <description>Tag que exibe o corpo...</description> 
  <attribute> 
   <name>test</name> 
   <required>true</required> 
   <rtexprvalue>true</rtexprvalue> 
  </attribute> 
 </tag> 
 <tag> 
  <name>casetag</name> 
  <tag-class>monpackage.CaseTag</tag-class> 
  <description> Tag que exibe o corpo...</description> 
  <attribute> 
   <name>value</name> 
   <required>true</required> 
   <rtexprvalue>true</rtexprvalue> 
  </attribute> 
 </tag> 
 <tag> 
  <name>iteratetag</name> 
  <tag-class>meupacote.IterateTag</tag-class> 
  <description> Tag que exibe o corpo...</description> 
  <attribute> 
   <name>count</name> 
   <required>true</required> 
   <rtexprvalue>true</rtexprvalue> 
   <type>java.lang.Integer</type> 
  </attribute> 
 </tag> 
</taglib>


Neste arquivo de exemplo, encontraremos três tags :
  • Switchtag e Casetag : para a simulação de um bloco "switch ... case"
  • Iteratetag : para a simulação de um iterator.


As informações da primeira parte do arquivo tld são:
  • <tlib-version> : Obrigatória, diz respeito à versão da biblioteca.
  • <jsp-version> : Obrigatória, define a versão JSP.
  • <short-name> : Obrigatória, define o nome da biblioteca.
  • <description> : Opcional, é a descrição da biblioteca.
  • <tag> : esta tag deve existir cada vez que se define uma Tag da biblioteca.


No que diz respeito às tags que compõem a biblioteca:
  • Tag : para declarer uma nova tag.
  • Name : nome da Tag e é este nome que será utilizado nas páginas JSP.
  • Tag-Class : define a classe do TagLib.
  • body-content : Opcional, define o tipo do corpo do tag
    • JSP : o corpo da tag contém tags JSP
    • tagdependent : a interpretação do corpo é feita pela tag
    • empty : o corpo deve estar vazio
  • Description : descrição da tag.
  • Attribute : é a lista dos atributos da tag.

A Tag "attribute" contém as seguintes tags:
    • Name : nome do atributo
    • Required :
      • true : o atributo é obrigatório
      • false : opcional.
    • Rtexprvalue : define se o atributo pode ser o resultado de uma tag de expressão.
    • Type : tipo do atributo, padrão, é o java.lang.String.


Na página JSP que utiliza o Taglib:
<%@ taglib uri="http://www.owliance.com/taglibs/montagamoi-1.0" prefix="montagamoi"%> 

<br/> 
<br/> 
<montagamoi:iteratetag count="10"> 
<br/> 
<montagamoi:switchtag test="3"> 
<montagamoi:casetag value="0">Zero</montagamoi:casetag> 
<montagamoi:casetag value="1">Um</montagamoi:casetag> 
<montagamoi:casetag value="2">Dois</montagamoi:casetag> 
<montagamoi:casetag value="3">Três</montagamoi:casetag> 
</montagamoi:switchtag> 
</montagamoi:iteratetag>


Abaixo, o conteúdo da classe IterateTag.java

pacote meupacote; 
import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.BodyTagSupport; 

public class IterateTag extends BodyTagSupport { 
 /** 

  • /
private static final long serialVersionUID = 9368853820192946960L; private int count = 0; private int current; public void setCount(int i) { count = i; } public int doStartTag() throws JspException { current = 0; if (current < count) { return EVAL_BODY_INCLUDE; } else { return SKIP_BODY; } } public int doAfterBody() throws JspException { current++; if (current < count) { return EVAL_BODY_AGAIN; } else { return SKIP_BODY; } } }


Abaixo, o conteúdo da classe CaseTag

pacote meupacote; 

import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.TagSupport; 

public class CaseTag extends TagSupport { 
 public String value; 

 public void setValue(String p_value) { 
  this.value = p_value; 
 } 
 public int doStartTag() throws JspException { 
  if (this.getParent() instanceof SwitchTag) { 
   SwitchTag parent = (SwitchTag) getParent(); 
   if (parent.isValid(this.value)) 
    return EVAL_BODY_INCLUDE; 
   else 
    return SKIP_BODY; 
  } else { 
   throw new JspException( 
     "A Tag case deve ficar dentro da tag Switch"); 
  } 
 } 
}


Abaixo, o conteúdo da classe SwitchTag

 pacote meupacote; 

import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.tagext.TagSupport; 

public class SwitchTag extends TagSupport { 
 /** 

  • /
private static final long serialVersionUID = 3752830055610590228L; private String test; public int doStartTag() throws JspException { return EVAL_BODY_INCLUDE; } public void setTest(String p_value) { test = p_value; } public boolean isValid(String caseValue) { if (test == null) return false; return (test.equals(caseValue)); } }
    • doStartTag() é chamada durante o encontro da abertura , ela retorna um inteiro.
      • EVAL_BODY_INCLUDE: processamento contínuo com avaliação do corpo.
      • SKIP_BODY: continuação do tratamento sem avaliação do corpo.
    • doEndTag() é chamada no encontro da tag de fechamento, ela retorna um inteiro.
      • EVAL_PAGE : continuação do processamento da JSP
      • SKIP_PAGE : interrupção do processamento do resto da JSP.



Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « Taglibs - Segunda Parte: Implementação de um TagLib »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.