Impostazione della codifica ISO-8859-1 per una singola pagina di Tapestry 4 in un'applicazione che altrimenti sarebbe totalmente UTF-8

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

Domanda

Ho un'applicazione Tapestry che sta servendo la sua pagina come UTF-8. Cioè, le risposte del server hanno un'intestazione:

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

Ora all'interno di questa applicazione c'è una singola pagina che dovrebbe essere servita con codifica ISO-8859-1. Cioè, la risposta del server dovrebbe avere questa intestazione:

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

Come si fa? Non voglio cambiare la codifica predefinita per l'intera applicazione.

Sulla base della ricerca su Google, ho provato a seguire:

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

Ma né l'impostazione di tali valori con l'annotazione @Meta né la sostituzione del metodo getOutputEncoding funzionano.

Sto usando Tapestry 4.0.2.

EDIT: ho finito per farlo con un filtro Servlet con HttpServletResposeWrapper sottoclassato. Il wrapper sovrascrive setContentType () per forzare la codifica richiesta per la risposta.

È stato utile?

Soluzione

Hai considerato un filtro? Forse non è elegante come qualcosa all'interno di Tapestry, ma usando un semplice filtro, che registra la mappatura o le mappe degli URL di interesse. Uno dei suoi parametri di init sarebbe la codifica del tuo after. Esempio:

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

}

Altri suggerimenti

Avresti potuto fare:

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

Il suggerimento sul filtro è buono. Puoi anche mescolare servlet con Tapestry. Ad esempio, abbiamo servlet per la visualizzazione di documenti XML e file Excel generati dinamicamente. Assicurati solo di impostare correttamente i mapping in web.xml in modo che i servlet non passino attraverso Tapestry.

Tapestry ha il concetto di filtri che possono essere applicati alla pipeline richiesta / risposta, ma con il vantaggio di poter accedere al contenitore IoC T5 & amp; Servizi.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top