Définition du codage ISO-8859-1 pour une seule page Tapestry 4 dans une application qui est sinon totalement totalement UTF-8

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

Question

J'ai une application Tapestry qui sert sa page au format UTF-8. C'est-à-dire que les réponses du serveur ont un en-tête:

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

Dans cette application, une seule page devrait être servie avec le codage ISO-8859-1. C'est-à-dire que la réponse du serveur devrait avoir cet en-tête:

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

Comment faire cela? Je ne veux pas changer le codage par défaut pour toute l'application.

Sur la base de la recherche Google, j'ai essayé de suivre:

 @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";
    }
 }

Mais ni la définition de ces valeurs avec l'annotation @Meta ni la substitution de la méthode getOutputEncoding ne fonctionnent.

J'utilise Tapestry 4.0.2.

EDIT: j'ai fini par le faire avec un filtre Servlet avec un sous-groupe HttpServletResposeWrapper. Le wrapper substitue setContentType () pour forcer le codage requis pour la réponse.

Était-ce utile?

La solution

Avez-vous envisagé un filtre? Peut-être pas aussi élégant que quelque chose dans Tapestry, mais en utilisant un filtre simple, qui enregistre le ou les mappages d'URL qui vous intéressent. Un de ses paramètres init serait l'encodage de votre après. Exemple:

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() {
}

}

Autres conseils

Vous auriez pu faire:

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

La suggestion de filtre est bonne. Vous pouvez également mélanger des servlets avec Tapestry. Par exemple, nous avons des servlets pour l'affichage de documents XML et de fichiers Excel générés dynamiquement. Assurez-vous simplement que les mappages sont correctement définis dans web.xml afin que les servlets ne passent pas par Tapestry.

Tapestry utilise le concept de filtres pouvant être appliqué au pipeline de demandes / réponses, mais présente l’avantage de pouvoir accéder au conteneur T5 IoC Container & amp; Services.

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top