Desenvolvimento de Tags Personalizadas em JSP

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>

Tags: jsp servlet Tag Personalizado TagSupport SimpleTagSupport

Publicado em 6-5 03:54 por Thomas