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… Read more »
[…] Otros artículos relacionados: Servlet 3.0 , ServletContext ,ServletFilter […]
[…] artículos relacionados : ServletContext, Java Filter , […]
[…] param) . El siguiente paso es declarar un listener que nos inicialice el framework y por último un filtro que protega toda la aplicación de accesos no permitidos y delegue en Spring Framework todas las […]