Установка кодировки 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.

РЕДАКТИРОВАТЬ: В итоге я сделал это с помощью фильтра сервлета с подклассом HttpServletResposeWrapper. Оболочка переопределяет setContentType (), чтобы принудительно использовать требуемую кодировку для ответа.


person Juha Syrjälä    schedule 30.09.2008    source источник


Ответы (4)


Вы рассматривали фильтр? Может быть, не так элегантно, как что-то в Tapestry, но с использованием простого фильтра, который регистрирует интересующие сопоставления 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() {
}

}
person Brian    schedule 02.10.2008
comment
Хм. Это устанавливает кодировку для входящего запроса. Мне нужно будет изменить кодировку исходящего ответа. Приложение My Tapestry не предназначено для отправки форм. Мое приложение просто обслуживает страницу формы. - person Juha Syrjälä; 06.10.2008
comment
Кодировка ответа может быть установлена ​​согласно спецификации 2.4. Вы используете сервер J2EE 1.4? java.sun .com / j2ee / 1.4 / docs / api / javax / servlet /. - person Brian; 14.10.2008

Вы могли бы сделать:

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

Предложение фильтра хорошее. Вы также можете смешивать сервлеты с Tapestry. Например, у нас есть сервлеты для обслуживания отображения XML-документов и динамически генерируемых файлов Excel. Просто убедитесь, что правильно настроили сопоставления в web.xml, чтобы сервлеты не проходили через Tapestry.

person Paul Croarkin    schedule 02.10.2008

В Tapestry есть концепция фильтров, которые могут применяться к конвейеру запроса / ответа, но с тем преимуществом, что вы можете получить доступ к T5 IoC Container & Services.

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

person Joel    schedule 31.01.2009