在应用程序中为单个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); }