Servlet 3.0 y Java Filter

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

Related Post