2008-09-30 5 views
4

J'ai une application Tapestry qui sert sa page en UTF-8. Cela est, les réponses du serveur ont en-tête:Définition de l'encodage ISO-8859-1 pour une seule page Tapestry 4 dans une application totalement UTF-8

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

maintenant dans cette application il y a une seule page qui doit être servi avec le codage ISO-8859-1. Autrement dit, la réponse du serveur doit avoir cet en-tête:

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

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

Basé sur google recherche J'ai essayé suivante:

@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 ou méthode getOutputEncoding primordiale fonctionne. J'utilise Tapestry 4.0.2.

EDIT: J'ai fini par faire cela avec un filtre de servlet avec HttpServletResposeWrapper sous-classé. L'encapsuleur remplace setContentType() pour forcer le codage requis pour la réponse.

Répondre

3

Avez-vous considéré un filtre? Peut-être pas aussi élégant que quelque chose dans Tapestry, mais en utilisant un filtre simple, qui enregistre le (s) mappage (s) d'url d'intérêt. 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() { 
} 

} 
+0

Hmm. Ceci définit l'encodage pour la requête * incoming *. Je devrais changer l'encodage pour la réponse sortante. Mon application Tapestry n'est pas celle qui gère la soumission de formulaire. Mon application ne sert que la page de formulaire. –

+0

Le codage de réponse peut être défini à partir de la spécification 2.4. Êtes-vous dans un serveur J2EE 1.4? http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/ServletResponse.html#setCharacterEncoding(java.lang.String) –

1

La suggestion de filtre est bonne. Vous pouvez également mélanger des servlets avec Tapestry. Par exemple, nous avons des servlets servant à afficher des documents XML et des 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.

2

vous auriez pu faire:

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