Daniel Prado Rodríguez - Página Personal - Presentación
Daniel Prado Rodríguez Visita: CocinaTusRecetas o de Guía turística de Nueva York 
  Sábado, 27 de Julio de 2024 Inicio | Contactar
Añadir a favoritos | Imprimir 
 
» Bienvenidos a mi página web

Daniel Prado Rodríguez En primer lugar quisiera presentarme, mi nombre es Daniel Prado Rodríguez y vivo en Lugo de Llanera (Asturias - España).

Actualmente trabajo en Sermicro, como progamador Senior para el proyecto del portal del principado de Asturias. Los motivos que me han llevado a realizar está página son en primer lugar la de ofrecer mi Curriculum Vitae siempre actualizado y un medio para contactar conmigo. No obstante también tendrán cabida otros contenidos como recursos paraa programadores o información sobre mi tierra natal.

No obstante no deja de asombrarme este medio, que permite que tú, que has llegado aquí posiblemente por azar, quizá solo con la intención de curiosear, me conozcas un poco mejor. Así que, si algo te interesa, si quieres preguntar o comentar algo, no dudes en contactar conmigo. Mi dirección de correo y el libro de visitas de esta web están a tu entera disposición.


» Viajes Destacados

Viaje a Roma

Visitar Londres

Guía de Nueva York

Visitar la Riviera Maya

Visitar Túnez

Viaje a Tenerife

Viaje a Benidorm

Visitar Florencia

Guía de Milán

Guía de Boston

Visitar Washington DC

Viajar a Philadelphia


» Programacion » Java » Filtro que reemplaza el texto de un archivo xsl servido por un servidor web java de aplicaciones Ver
29 de Diciembre de 2006 (Daniel P.)

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.


» Publicidad

  
» Programacion Ver
Viernes, 29 de Diciembre de 2006

Java

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


» Programacion Ver
Viernes, 29 de Diciembre de 2006

Java

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.
 
Mapa web |  Página principal  | Blog de Recetas | Recetas de Pescado | Tasaciones Inmobiliarias Asturias | Política de privacidad | Política de cookies
www.daniel.prado.name - Página Personal - © Copyright