Configuración de la codificación ISO-8859-1 para una sola página de Tapestry 4 en una aplicación que de lo contrario es totalmente UTF-8

StackOverflow https://stackoverflow.com/questions/153482

Pregunta

Tengo una aplicación Tapestry que sirve a su página como UTF-8. Es decir, las respuestas del servidor tienen encabezado:

Content-type: text/html;charset=UTF-8

Ahora, dentro de esta aplicación, hay una sola página que debe servirse con la codificación ISO-8859-1. Es decir, la respuesta del servidor debe tener este encabezado:

Content-type: text/html;charset=ISO-8859-1

¿Cómo hacer esto? No quiero cambiar la codificación predeterminada para toda la aplicación.

Según la búsqueda en Google, he intentado lo siguiente:

 @Meta({    "org.apache.tapestry.output-encoding=ISO-8859-1", 
    "org.apache.tapestry.response-encoding=ISO-8859-1", 
    "org.apache.tapestry.template-encoding=ISO-8859-1",
    "tapestry.response-encoding=ISO-8859-1"})
 abstract class MyPage extends BasePage {

    @Override
    protected String getOutputEncoding() {
        return "ISO-8859-1";
    }
 }

Pero ninguno de los valores de configuración con la anotación @Meta o la invalidación del método getOutputEncoding funciona.

Estoy usando Tapestry 4.0.2.

EDITAR: Terminé haciendo esto con un filtro de Servlet con subclase HttpServletResposeWrapper. El contenedor anula setContentType () para forzar la codificación requerida para la respuesta.

¿Fue útil?

Solución

¿Has considerado un filtro? Tal vez no sea tan elegante como algo dentro de Tapestry, pero usando un filtro simple, que registra los mapas de url de interés. Uno de sus parámetros de inicio sería la codificación de su posterior. Ejemplo:

public class EncodingFilter implements Filter {
private String encoding;
private FilterConfig filterConfig;

/**
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
public void init(FilterConfig fc) throws ServletException {
this.filterConfig = fc;
this.encoding = filterConfig.getInitParameter("encoding");
}

/**
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
*/
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
req.setCharacterEncoding(encoding);
chain.doFilter(req, resp);
}

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

}

Otros consejos

Podrías haberlo hecho:

    @Override
public ContentType getResponseContentType() {
        return new ContentType("text/html;charset=" + someCharEncoding);
}

La sugerencia de filtro es buena. También puedes mezclar servlets con tapiz. Por ejemplo, tenemos servlets para mostrar documentos XML y archivos de Excel generados dinámicamente. Solo asegúrese de configurar correctamente las asignaciones en web.xml para que los servlets no pasen por Tapestry.

Tapestry tiene el concepto de filtros que se pueden aplicar a la línea de solicitud / respuesta, pero con la ventaja de que puede acceder al contenedor de IoC T5 & amp; Servicios.

http://tapestry.apache.org/tapestry5/tapestry -core / guide / request.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top