Cuando empezamos a trabajar un Java EE se nos presentan muchos conceptos nuevos ,a veces demasiados pero uno de los más clásicos es el concepto de java filter o filtro java .Practicamente todos los frameworks de capa de presentación los usan de una forma o de otra para aportar nuevas funcionalidad extendiendo de las ya disponibles . Ahora bien ¿como funcionan? y sobre todo para que sirven. Vamos a partir de la idea que tenemos una aplicación web con tres páginas.
Java Filter
Un filtro de java se encarga de añadir una nueva funcionalidad a la aplicación colocandose entre el usuario y las páginas .Por ejemplo en nuestro caso vamos a implementar un sencillo filtro que construye unas estadisticas sobre cuantas veces se ha visitado cada página
Java Filter (Construcción)
Definir un filtro en Java es bastante sencillo sobre todo a partir de Servlet 3.0 que nos podemos apoyar en el sistema de anotaciones. Un Filtro implementa la interface Filter de JEE que aporte el método doFilter.
Vamos a ver él código de este filtro :
</pre>
ackage com.arquitecturajava;
import java.io.IOException;
import java.util.HashMap;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter(filterName="/FiltroEstadistica",urlPatterns="/*" )
public class FiltroEstadistica implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
@SuppressWarnings("unchecked")
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
HttpServletRequest peticion= (HttpServletRequest)request;
ServletContext contexto= request.getServletContext();
HashMap<String, Integer> urls;
if (contexto.getAttribute("estadistica")==null) {
//creamos un objeto en el contexto
urls= new HashMap<String,Integer>();
urls.put(peticion.getRequestURL().toString(), 1);
contexto.setAttribute("estadistica", urls);
}else {
// actualizamos claves e incrementamos
urls=(HashMap<String,Integer>)contexto.getAttribute("estadistica");
if (urls.get(peticion.getRequestURL().toString())==null) {
urls.put(peticion.getRequestURL().toString(), 1);
}else {
urls.put(peticion.getRequestURL().toString(), urls.get(peticion.getRequestURL().toString())+1);
}
}
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
<pre>
El filtro es relativamente sencillo .Se encarga de almacenar un HashMap o diccionario en el contexto de de aplicación (ámbito de aplicación). Este mapa contendrá el nombre de la página y las veces que hemos accedido a ella .
De esta forma será luego muy sencillo construir un JSP básico que accede al contexto (ServletContext) y se encargue de imprimir por pantalla la lista de páginas ya acceso que ha guardado . Vamos a ver su código a traves del uso de scriptlet de JSP que aunque no es la mejor práctica sirve para clarificar .
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.HashMap" %>
<%@page import="java.util.Set" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
HashMap<String,Integer> mapa=(HashMap<String,Integer>)application.getAttribute("estadistica");
Set<String> conjunto=mapa.keySet();
for (String clave :conjunto) {
out.println("pagina :" +clave +" visitas :"+mapa.get(clave)+"<br/>");
}
%>
</body>
</html>
Realizada esta operación el JSP nos mostrará lo siguiente :
El código : JavaFiltros





Muchas gracias por el aporte, muy claro y facil de probar.
Saludos.
gracias 🙂
muy claro para ti
gracias 🙂
hola que tal Cecilio!
Tengo una duda de como generar mensajes desde un servlet, ya que estoy leyendo el libro “EJB 3.1 Cookbook” de Richard M. Reese,de la editorial Packt Publishing capítulo 3 Message-Driven Beans.
Para ser exacto a la hora de declarar el objecto Queue
@Inject
@JMSConnectionFactory(“jms/RemoteConnectionFactory”)
private JMSContext context;
@Resource(lookup=”TestQ”)
private Queue queue;
***(en el libro el objeto QueueConnectionFactory lo declara distinto
@Resource(mappedName=”jms/SomeMessageFactory”)
private QueueConnectionFactory queueConnectionFactory;
)
Esto lo cheque por el libro Beginning Java EE 7 de Antonio goncalves en la parte de producir mensajes dentro del contenedor.
Con esto ya no tenia error en declarar QueueConnectionFactory en el servidor Wildfly, pero en Queue me sigue tirando error
*******
Deployment failed: TestServletJMSWildFly.war: {
“outcome” : “failed”,
“failure-description” : {“JBAS014771: Services with
missing/unavailable dependencies” :
[“jboss.naming.context.java.module.TestServletJMSWildFly.TestServletJMSWildFly.env.\”com.servlet.TextServlet\”.queue
is missing
[jboss.naming.context.java.module.TestServletJMSWildFly.TestServletJMSWildFly.env.TestQ]”]},
“rolled-back” : true
}
******
Tambien lo probe en el servidor Jboss EAP 6.4/6.3
Ojala y me puedas solventar esta duda, de como generar mensajes desde un servlet?