Criação de uma Tag Personalizada Básica
Este guia demonstra como implementar tags personalizadas em JSP, começando com uma tag simples que exibe uma mensagem de saudação.
Classe Java: SaudacaoTag.java
package com.web.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class SaudacaoTag extends TagSupport {
private static final long serialVersionUID = 1L;
private String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public int doStartTag() throws JspException {
JspWriter saida = this.pageContext.getOut();
try {
saida.println(nome + ", bem-vindo à tag personalizada!");
} catch (IOException e) {
e.printStackTrace();
}
return TagSupport.SKIP_BODY;
}
}
Arquivo de descrição da biblioteca de tags (TLD): /WEB-INF/biblioteca.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>bibliotecaTag</short-name>
<tag>
<name>saudacao</name>
<tag-class>com.web.tag.SaudacaoTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>nome</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Página JSP: saudaaco.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="minhaTag" uri="/WEB-INF/biblioteca.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Exemplo de Saudação com Tag</title>
</head>
<body>
<minhaTag:saudacao nome="Visitante"/>
</body>
</html>
Tag com Corpo para Iteração
A seguir, uma tag que percorre uma lista de itens, útil para renderizar coleções dinâmicas.
Classe Java: IteradorTag.java
package com.web.tag;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
public class IteradorTag extends TagSupport {
private static final long serialVersionUID = 1L;
private String variavel;
private String itens;
private Iterator iterador;
public String getVariavel() {
return variavel;
}
public void setVariavel(String variavel) {
this.variavel = variavel;
}
public String getItens() {
return itens;
}
public void setItens(String itens) {
this.itens = itens;
}
public Iterator getIterador() {
return iterador;
}
public void setIterador(Iterator iterador) {
this.iterador = iterador;
}
@Override
public int doStartTag() throws JspException {
Object valor = this.pageContext.getAttribute(itens);
if (valor != null && valor instanceof List) {
this.iterador = ((List) valor).iterator();
if (iterador.hasNext()) {
this.pageContext.setAttribute(variavel, iterador.next());
return TagSupport.EVAL_BODY_INCLUDE;
} else {
return TagSupport.SKIP_BODY;
}
} else {
return TagSupport.SKIP_BODY;
}
}
@Override
public int doAfterBody() throws JspException {
if (iterador.hasNext()) {
this.pageContext.setAttribute(variavel, iterador.next());
return TagSupport.EVAL_BODY_AGAIN;
} else {
return TagSupport.SKIP_BODY;
}
}
}
Atualize o TLD para incluir a nova definição de tag.
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>bibliotecaTag</short-name>
<tag>
<name>iterador</name>
<tag-class>com.web.tag.IteradorTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>variavel</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>itens</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Página JSP: iterador.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="minhaTag" uri="/WEB-INF/biblioteca.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Iteração com Tag Personalizada</title>
<%
List<String> usuarios = new ArrayList<>();
usuarios.add("Ana");
usuarios.add("Bruno");
usuarios.add("Carla");
pageContext.setAttribute("usuarios", usuarios);
%>
</head>
<body>
<minhaTag:iterador itens="usuarios" var="u">
<p>${u}</p>
</minhaTag:iterador>
</body>
</html>
Tag Simples com SimpleTagSupport
Para uma abordagem mais moderna, utilize SimpleTagSupport, que simplifcia o ciclo de vida da tag.
Classe Java: IteradorSimplesTag.java
package com.web.tag;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IteradorSimplesTag extends SimpleTagSupport {
private static final long serialVersionUID = 1L;
private String variavel;
private String itens;
public String getVariavel() {
return variavel;
}
public void setVariavel(String variavel) {
this.variavel = variavel;
}
public String getItens() {
return itens;
}
public void setItens(String itens) {
this.itens = itens;
}
@Override
public void doTag() throws JspException, IOException {
Object valor = this.getJspContext().getAttribute(itens);
if (valor != null && valor instanceof List) {
Iterator iterador = ((List) valor).iterator();
while (iterador.hasNext()) {
this.getJspContext().setAttribute(variavel, iterador.next());
this.getJspBody().invoke(null);
}
}
}
}
Adicione esta tag ao arquivo TLD.
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.0</tlib-version>
<short-name>bibliotecaTag</short-name>
<tag>
<name>iteradorSimples</name>
<tag-class>com.web.tag.IteradorSimplesTag</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>variavel</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>itens</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Página JSP: iteradorSimples.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="minhaTag" uri="/WEB-INF/biblioteca.tld" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Exemplo de Tag Simples</title>
<%
List<String> clientes = new ArrayList<>();
clientes.add("David");
clientes.add("Elena");
clientes.add("Fábio");
pageContext.setAttribute("clientes", clientes);
%>
</head>
<body>
<minhaTag:iteradorSimples itens="clientes" var="c">
<p>${c}</p>
</minhaTag:iteradorSimples>
</body>
</html>