Установка кодировки ISO-8859-1 для одной страницы Tapestry 4 в приложении, которая в остальном полностью соответствует UTF-8

StackOverflow https://stackoverflow.com/questions/153482

Вопрос

У меня есть приложение 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(), чтобы принудительно ввести требуемую кодировку для ответа.

Это было полезно?

Решение

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

}

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top