在应用程序中为单个Tapestry 4页面设置ISO-8859-1编码,否则完全为UTF-8

时间:2020-03-06 14:55:40  来源:igfitidea点击:

我有一个Tapestry应用程序,其页面以UTF-8表示。也就是说,服务器响应具有标头:

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

现在,在此应用程序中,应该使用ISO-8859-1编码来提供一个页面。也就是说,服务器响应应具有以下标头:

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

这该怎么做?我不想更改整个应用程序的默认编码。

基于谷歌搜索,我尝试了以下方法:

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

但是,使用@Meta注释设置这些值或者覆盖getOutputEncoding方法均无效。

我正在使用Tapestry 4.0.2.

编辑:我最终使用子类HttpServletResposeWrapper的Servlet过滤器完成了此操作。包装器重写setContentType()来强制响应所需的编码。

解决方案

我们是否考虑过过滤器?也许不像Tapestry中的工具那样优雅,但使用普通的Filter来注册感兴趣的url映射。它的init参数之一是after的编码。例子:

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

}

筛选器建议是好的。我们还可以将servlet与Tapestry混合使用。例如,我们有用于显示XML文档和动态生成的Excel文件的servlet。只要确保在web.xml中正确设置了映射,就可以避免Servlet不通过Tapestry。

Tapestry具有可以应用于请求/响应管道的筛选器的概念,但是具有可以访问T5 IoC容器和服务的优点。

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

我们可以完成以下操作:

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