quarta-feira, 11 de abril de 2007

Pra que serve e como funciona o ServletContextAttributeListener?

O ServletContextAttributeListener é um listener que recebe sinais quando um atributo é adicionado, removido ou alterado no contexto. Para quem não sabe, um atributo de contexto é válido para todos os servlets, threads e sessões de uma aplicação. Para testar seu funcionamento criei uma classe implementando a interface ServletContextAttributeListener e um servlet para adicionar, remover e alterar atributos do contexto.

Segue o código do listener:
package meupacote.listeners;

import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextAttributeEvent;

public class MeuServletContextAttributeListener implements ServletContextAttributeListener
{
public void attributeAdded(ServletContextAttributeEvent e)
{
System.out.println("Atributo adicionado: nome=" +
e.getName() + ", valor=" + e.getValue()
);
}

public void attributeRemoved(ServletContextAttributeEvent e)
{
System.out.println("Atributo removido: nome=" +
e.getName() + ", valor=" + e.getValue()
);
}

public void attributeReplaced(ServletContextAttributeEvent e)
{
System.out.println("Atributo alterado: nome=" +
e.getName() + ", valorAntigo=" + e.getValue()
);
}
}
Veja que para implementar esse listener é preciso sobrescrever os métodos attributeAdded, que é chamado quando um atributo é adicionado, attributeRemoved, que é chamado quando um atributo é removido e attributeReplaced que é chamado quando um atributo é alterado.

O evento que esses métodos recebem possue dois métodos: getName e getValue, eles servem para pegar o nome e o valor do atributo manejado na ação. É preciso observar que no attributeReplaced, o getValue do evento retorna o valor anterior ao que foi alterado.

Agora veja o código do servlet que inclui, altera e remove atributos do contexto:
public class MudaAtributoContexto extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException
{
String acao = request.getParameter("acao");
String nome = request.getParameter("nome");
String valor = request.getParameter("valor");

response.setContentType("text/html");
PrintWriter out = response.getWriter();

if( nome!=null )
{
if( "remover".equals(acao) )
{
getServletContext().removeAttribute(nome);
out.print("Removido: " + nome);
}
else
{
getServletContext().setAttribute(nome, valor);
out.print("Setado: " + nome + " = " + valor);
}
}

StringBuilder s = new StringBuilder("<form><b>Incluir: </b>")
.append(" nome: <input name=\"nome\"/>")
.append(" valor: <input name=\"valor\"/>")
.append(" <input type=\"submit\"/>")
.append("</form><hr />");

Enumeration e = getServletContext().getAttributeNames();
while( e.hasMoreElements() )
{
String n = (String)e.nextElement();
Object v = getServletContext().getAttribute(n);

s.append("<form>")
.append(" nome: <input name=\"nome\" value=\"" + n + "\">")
.append(" valor: <input name=\"valor\" value=\"" + v + "\">")
.append(" Remover? <input name=\"acao\" value=\"remover\" type=\"checkbox\">")
.append(" <input value=\"Alterar\" type=\"submit\">")
.append("</form>");
}

out.print(s);
}
}

Depois de registrado o servlet e o listener no web.xml é só testar. Se por exemplo adicionarmos um atributo de nome pais e valor igual a Brasil, depois alterarmos esse mesmo atributo para Guatemala e ao final removê-lo. Teremos as seguintes linhas escritas no output:

Atributo adicionado: nome=pais, valor=Brasil
Atributo alterado: nome=pais, valorAntigo=Brasil
Atributo removido: nome=pais, valor=Guatemala

Nenhum comentário:

Postar um comentário