2008-09-30 27 views
4

我有一个Tapestry应用程序以UTF-8的形式为其页面提供服务。也就是说,服务器响应有标题:在应用程序中为单个Tapestry 4页面设置ISO-8859-1编码,否则该应用程序完全是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。

编辑:我结束了这样做与Servlet过滤器与子类HttpServletResposeWrapper。包装器重写setContentType()以强制响应所需的编码。

回答

3

你有没有考虑一个过滤器?也许不如Tapestry中的东西那么优雅,但是使用一个简单的Filter来注册感兴趣的url映射。其初始化参数之一将是您之后的编码。例如:

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

嗯。这为* incoming *请求设置了编码。我需要改变传出响应的编码。我的Tapestry应用程序不是处理表单提交的应用程序。我的应用程序只提供表单页面。 – 2008-10-06 09:49:59

1

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

2

你可以这样做:

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