Filter
.
Para generar un Filtro es necesario que la Clase en cuestión herede ("inherit") el comportamiento de la clase llamada Filter, através de dicha Clase se tiene acceso a los métodos y mecanismos ofrecidos por un filtro. Este procedimiento es muy similar al de un Servlet que hereda ("inherit") su comportamiento de la Clase HttpServlet ( o GenericServlet).Los tres métodos que debe implementar un filtro son:
doFilter (Obligatorio): Este método es la parte medular de todo Filtro ya que dentro de él se incluyen las tareas principales de ejecución.
init (Opcional) : Es un método ejecutado antes del método doFilter, su labor principal es adquirir/inicializar algún recurso que será empleado por doFilter.
destroy (Opcional) : Ejecutado una vez que ha terminado el método doFilter, su labor es liberar los recursos utilizados/adquiridos en el proceso de ejecución los cuales generalmente son aquellos reservados por init.
Código Fuente ImpuestosRegistro.java
.
package com.osmosislatina.filtros; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.osmosislatina.beans.*; import java.util.*; public class ImpuestosRegistro implements Filter { private FilterConfig config; public void init(FilterConfig config) throws ServletException { this.config = config; } public void destroy() { config = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response); // Definir variables para colocar nota de impuestos int impuestos = 0; String nota = ""; // Extraer si filtro incluye impuestos try { impuestos = Integer.parseInt(config.getInitParameter("impuestos")); } catch (NumberFormatException exc) { config.getServletContext().log("No fue posible convertir parámetro de filtro a numero entero", exc); } if (impuestos > 0) { // Existe una tarifa de impuestos definida en filtro nota = " Aplica " + impuestos + " % impuestos "; } // Extraer Sesión HttpSession session = ((HttpServletRequest)request).getSession(); session.setAttribute("impuesto",nota); // Datos de la Puja Date fecha = new Date(); String nombre = request.getParameter("producto"); String cantidad = request.getParameter("cantidad"); String precio = request.getParameter("precio"); String puja = " * Puja Realizada : " + fecha + " / Producto : " + nombre + " / Cantidad : " + cantidad + " / Precio Unitario : $" + precio; config.getServletContext().log("Registro PUJA: " + puja); } } |
Primeramente se define la librería ("package") a la cual pertenecerá esta Clase, en este caso
com.osmosislatina.filtros
, para posteriormente declarar la Clase principalImpuestoRegistro
que implementa la Interfasejavax.servlet.Filter
una característica primordial de todo filtro.Es definido un campo del tipo
FilterConfig
que contendrá datos de configuración acerca del filtro.Se declara el método
init
que toma como dato de entrada un objeto de tipoFilterConfig
el cual es asignado al campo definido anteriormente. Vale mencionar que dicho dato de entrada proviene de los datos de configuración del filtro según definidos en web.xml.Posteriormente se define el método
destroy
que asigna un valor nulo (null
) al campoconfig
.El método principal
doFilter
toma como datos de entrada un objetoServletRequest
que representa la requisición, un objetoServletResponse
que contiene el objeto de respuesta, y otro objetoFilterChain
que representa una cadena de filtros; la lógica definida en este método se describe a continuación :Como primer paso se invoca el mismo métdo
doFilter
sobre la cadena de filtros (FilterChain
), el cual toma como parámetros la requisición y respuesta proporcionados como datos de entrada. Esta invocación simplemente indica que debe ser aplicado el filtro. NOTA: El grupo de filtros o cadena a la que se refiereFilterChain
es definida en el archivo web.xmlSe definen dos variables para colocar configuraciones y valores del filtro, seguido se declara un bloque try/catch para extraer el parémetro
impuestos
definido en la configuración del filtro (definido en web.xml). Nótese que dicho parámetro es extraído através del métodogetInitParameter
del objetoconfig
.En base al valor de configuración se asigna este valor a la variable
nota
, para posteriormente ser colocado en la sesión del usuario bajo el nombre deimpuesto
. NOTA: Observe que la sesión del usuario, aunque extraída del objetorequest
, se realiza através de un cast haciaHttpServletRequest
, lo anterior es necesario ya que el objetorequest
de un filtro proviene de la interfase genéricaServletRequest
más no de la sub-interfaseHttpServletRequest
.Posteriormente se genera un objeto con la fecha del sistema, y a su vez se extraen de la requisición (
request
) los parámetrosproducto, cantidad
yprecio
, los cuales son colocados en un String llamadopuja
.Finalmente, mediante el objeto
config
se accesa el registro ("Log") del "Servlet Engine" através del métodogetServletConfig
para enviar el valor antes generado (puja
) hacia el registro.
En la siguiente sección se describe como es configurado este filtro en el archivo de configuración web.xml.