Установка кодировки ISO-8859-1 для одной страницы Tapestry 4 в приложении, которая в остальном полностью UTF-8
У меня есть приложение Tapestry, которое обслуживает его страницу как UTF-8. То есть ответы сервера имеют заголовок:
Content-type: text/html;charset=UTF-8
Теперь в этом приложении есть одна страница, которая должна быть подана с кодировкой ISO-8859-1. То есть ответ сервера должен иметь этот заголовок:
Content-type: text/html;charset=ISO-8859-1
Как это сделать? Я не хочу менять кодировку по умолчанию для всего приложения.
На основе поиска в Google я пробовал следующее:
@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.
EDIT: я закончил это с помощью фильтра Servlet с подклассом HttpServletResposeWrapper. Оболочка переопределяет setContentType(), чтобы принудительно потребовать кодировку для ответа.
Ответы
Ответ 1
Вы считали фильтр? Возможно, это не так элегантно, как что-то внутри Tapestry, но с использованием простого фильтра, который регистрирует отображаемые URL-адреса. Одним из его параметров init будет кодирование вашего после. Пример:
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() {
}
}
Ответ 2
Вы могли бы сделать:
@Override
public ContentType getResponseContentType() {
return new ContentType("text/html;charset=" + someCharEncoding);
}
Ответ 3
Предложение фильтра хорошее. Вы также можете смешивать сервлеты с Гобеленом. Например, у нас есть сервлеты для отображения XML-документов и динамически создаваемых файлов Excel. Просто убедитесь, что правильно установите сопоставления в web.xml, чтобы сервлеты не проходили через Гобелен.
Ответ 4
Tapestry имеет концепцию фильтров, которые могут применяться к конвейеру запроса/ответа, но с тем преимуществом, что вы можете получить доступ к контейнеру и сервисам T5 IoC.
http://tapestry.apache.org/tapestry5/tapestry-core/guide/request.html