Inicio /
Filtro que reemplaza el texto de un archivo xsl servido por un servidor web java de aplicaciones

Se expone un ejemplo práctico en el que se implementa un filtro web que permite la sustitución de una cadena de textos al servir el servidor web (en nuestro caso un Tomcat) un archivo xsl. Este ejemplo nos permitirá adentrarnos en el funcionamiento de los filtros y de la clase ServletResponse.

Para comenzar explicaremos que un filtro web son una clases java que se ejecutan cuando se realizar cualquier petición al servidor que concuerde con la configuración de este, por tanto podrá modificar la salida, controlar el acceso a determinados recursos, etc

En el siguiente ejemplo se expone la clase que implementa en sí el filtro.

package xslfix.filter
import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class XSLFilter implements Filter {
private final static String WORD1 = "method=\"xhtml\"";
private final static String WORD2 = "method=\"html\"";
private final static String CONTEN_TYPE_XSL = "text/xml";

public static final Logger logger = Logger.getLogger(XSLFilter.class);

/* (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
if (logger.isDebugEnabled())
logger.debug("| doFilter | TRACE --> METHOD_BEGIN");

HttpServletResponse resp = (HttpServletResponse)res;

FilterHttpServletResponseWrapper resSuplantada = new FilterHttpServletResponseWrapper(resp);
chain.doFilter( req, resSuplantada );

if (resSuplantada.getContentType()!=null && resSuplantada.getContentType().equalsIgnoreCase(CONTEN_TYPE_XSL))
{
if (logger.isDebugEnabled())
logger.debug("| doFilter | TRACE --> contentType: "+resSuplantada.getContentType());

resSuplantada.replace(WORD1,WORD2);
}

byte[] auxBytes = resSuplantada.getContent().getBytes();
resp.setContentLength(auxBytes.length);
resp.getOutputStream().write(auxBytes);
}
/* (non-Javadoc)
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig arg0) throws ServletException {
if (logger.isDebugEnabled())
logger.debug("| init | TRACE --> METHOD_BEGIN");
}

/* (non-Javadoc)
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
}
}

De este código destaca la línea:

Chain.doFilter (req, resSuplantada)

Que ejecutará la lógica de la petición realizada, por tanto podremos hacer los cambios antes o como es este caso después, ya que después de esta línea tendremos acceso al fichero xsl pedido por la aplicación web.

Vemos que tenemos que pasarle un ServletResponse, en nuestro caso hemos realizado una clase que hereda de esta y que hemos modificado para poder tener acceso a su contenido y poder manipularlo a nuestro antojo.

Por último vemos que tenemos que escupir la salida, para lo cual lo haremos sobre el objeto ServletResponse original y que se hace con la línea de código:

resp.getOutputStream().write(auxBytes);

Veamos la clase que hemos implementado para sustituir ServletResponse, la hemos llamado FilterHttpServletResponseWrapper, vemos que en vez de ser hija de ServletResponse lo es de HttpServletResponseWrapper que nos facilita la manipulación de su contenido.

package xslfix.filter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class FilterHttpServletResponseWrapper extends HttpServletResponseWrapper{

private StringOutputStream pw = new StringOutputStream();

public FilterHttpServletResponseWrapper(HttpServletResponse aux)
{
super(aux);
}

public String getContent()
{
return pw.toString();
}

/* public String getContentType()
{
return getContentType();
}*/

public void replace (String param1, String param2)
{
pw.replace(param1, param2);
}

/*public PrintWriter getWriter() {
return getWriter();
}*/

public ServletOutputStream getOutputStream() {
return pw;
}

public void setContentType(String type) {
super.setContentType(type);
}
}


Vemos que tiene un método llamado replace, que es el que nos permite modificar su contenido.

También podemos observar que tiene un objeto de la clase StringOutputStream y llamado pw, en este objeto es donde se almacenará automáticamente el contenido de la xsl. Le hemos añadido unos métodos, para convertir su contenido en un String y poder remplazar lo que necesitemos de ella.

package xslfix.filter;

import javax.servlet.ServletOutputStream;

public class StringOutputStream extends ServletOutputStream{

 // This buffer will contain the stream
 protected StringBuffer buf = new StringBuffer();

public StringOutputStream() {}

 public void close() {}

 public void flush() {

  // Clear the buffer
  buf.delete(0, buf.length());
 }

 public void write(byte[] b) {
  String str = new String(b);
  this.buf.append(str);
 }
 
 public void write(byte[] b, int off, int len) {
  String str = new String(b, off, len);
  this.buf.append(str);
 }

 public void write(int b) {
  String str = Integer.toString(b);
  this.buf.append(str);
 }

 public String toString() {
  return buf.toString();
 }
 
 public void replace(String param1, String param2)
 {
  int indexStart =buf.indexOf(param1);
  
  if (indexStart>=0)
  {
   buf.replace(indexStart,indexStart+param1.length(),param2);
  }
 }
}


Ahora nos faltará modificar el archivo web.xml para que nos reconozca el filtro para lo cual añadiremos las siguientes líneas:


<filter>
      <filter-name>XSLFilter</filter-name>
      <filter-class>xslfix.filter.XSLFilter</filter-class>
</filter>
<filter-mapping>
      <filter-name>XSLFilter</filter-name>
      <url-pattern>/*</url-pattern>
</filter-mapping>
 

El url-pattern es el patrón que nos indica que entradas coincidentes con el patrón serán tratadas por el filtro.


Daniel P. @ 21:26 | comentarios (0) | Links Permanentes



<< November 2024 >>
Sun Mon Tue Wed Thu Fri Sat
  1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
 

archivos

November - 2013
October - 2013
July - 2013
June - 2013
May - 2013
April - 2013
March - 2013
February - 2013
November - 2010
October - 2010
September - 2010
August - 2010
June - 2010
November - 2009
October - 2009
September - 2009
March - 2009
February - 2009
January - 2009
September - 2008
May - 2008
April - 2008
November - 2007
October - 2007
May - 2007
April - 2007
March - 2007
February - 2007
January - 2007
December - 2006
September - 2006
August - 2006
June - 2006
May - 2006
April - 2006
February - 2006
January - 2006
December - 2005
November - 2005

powered by SimpleBlog 2.0

rss feed




Ir a Blog de Recetas de Cocina