Definindo-ISO 8859-1 que codifica para uma única página tapeçaria 4 na aplicação que é de outra forma totalmente UTF-8
-
03-07-2019 - |
Pergunta
Eu tenho um aplicativo de tapeçaria que está servindo a sua página como UTF-8. Ou seja, as respostas do servidor tem cabeçalho:
Content-type: text/html;charset=UTF-8
Agora, dentro desta aplicação há uma única página que deve ser servido com ISO-8859-1. Ou seja, a resposta do servidor deve ter este cabeçalho:
Content-type: text/html;charset=ISO-8859-1
Como fazer isso? Eu não quero para o padrão de mudança de codificação para aplicação inteira.
Com base no Google busca Tentei seguinte:
@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";
}
}
Mas nem definir esses valores com @Meta anotação ou substituindo getOutputEncoding método funciona.
Eu estou usando Tapestry 4.0.2.
EDIT: Acabei fazendo isso com um filtro de Servlet com subclasse HttpServletResposeWrapper. setContentType O invólucro substituições () a força requerida que codifica para a resposta.
Solução
Você considerou um filtro? Talvez não tão elegante como algo dentro de tapeçaria, mas usando um filtro simples, que registra o mapeamento url (s) de interesse. Um dos seus parâmetros de inicialização seria a codificação de sua depois. Exemplo:
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() {
}
}
Outras dicas
Você poderia ter feito:
@Override
public ContentType getResponseContentType() {
return new ContentType("text/html;charset=" + someCharEncoding);
}
A sugestão filtro é bom. Você também pode misturar servlets com tapeçaria. Por exemplo, temos servlets para servir exibindo documentos XML e arquivos do Excel geradas dinamicamente. Apenas certifique-se de que definir corretamente os mapeamentos no web.xml para que que os servlets não passam por Tapestry.
Tapestry tem o conceito de filtros que podem ser aplicados para o pipeline de solicitação / resposta, mas com a vantagem de que você pode acessar a T5 IoC Container & Serviços.
http://tapestry.apache.org/tapestry5/tapestry -core / guia / request.html