Seam и ServletOutputStream - сброс не виден сразу - PullRequest
0 голосов
/ 24 февраля 2011

Я конвертирую 6-летнее приложение в Seam 2.2.Приложение используется для запуска в java 1.4 и weblogic 8. Оно использует только jsp и servlet.В одном сервлете я использую:

    public void doGet (HttpServletRequest req,HttpServletResponse res) throws  ServletException,IOException
        {
            //...

            ServletOutputStream out = = res.getOutputStream();

            // displaying a lot of messages
            // after each println() I do a flush()
            out.println("lots of messages.....");
            out.flush();

            out.close(); 
            //...
        } 

При запуске приложения сообщения сразу же просматривались в браузере.

Когда я запускаю это с использованием Seam 2.2 в Weblogic 10 и Java 1.6, сообщенияне сразу видно в браузере.Только после завершения работы сервлета.

Можно ли что-то изменить, чтобы это исправить?

Я не хочу изменять / преобразовывать сервлет в компонент Seam.Сервлет работает нормально.Единственная вещь - это сброс сообщений в окно браузера, который происходит только после того, как сервлет перестал работать.

Возможно, причина в том, что сервлет теперь проходит через фильтр шва:

<filter>
  <filter-name>Seam Filter</filter-name>
  <filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>Seam Filter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Возможно, причина в том, что запрос проходит через SeamFilter, как вы и предполагали. Я думаю, что не сам SeamFilter буферизирует поток данных из вашего сервлета, а фильтр Ajax4Jsf, который вызывается в цепочке фильтров.

Если у вас есть RichFaces в classpath, есть компонент шва, который регистрирует фильтр Ajax4jsf в цепочке. А именно, компонент Seam равен org.jboss.seam.web.ajax4jsfFilter.

Если вам не нужны RichFaces, попробуйте удалить его из пути к классам. Если вам это нужно, я предлагаю переопределить org.jboss.seam.web.ajax4jsfFilter, чтобы пропустить фильтр Ajax4Jsf для запросов, направленных на ваш сервлет.

Другим возможным решением является преобразование вашего сервлета в фильтр в качестве компонента Seam (см. Аннотацию @Filter) и размещение его в начале цепочки с атрибутомround. Что-то вроде:

@Name("FormerServlet")
@Scope(STATELESS)
@BypassInterceptors
@Filter(around = "org.jboss.seam.web.ajax4jsfFilterInstantiator")
public class FormerServletFilter implements Filter
{

    protected void init(FilterConfig filterConfig) throws Exception
    {
    }


    protected void doDestroy()
    {
    }

    /**
     * Performs the filtering for a request.
     */
    protected void doFilter(final HttpServletRequest request, final HttpServletResponse response,
                            final FilterChain chain) throws Exception
    {
        if (thisRequestShoudBeManagedByMyServlet(request) )
        {
           // do here what you previously did in the servlet

        } else
        {
            // go ahead with the Seam lifecycle
            chain.doFilter(request, response);
        }
    }
2 голосов
/ 25 февраля 2011

Вы запускаете сервлет - здесь нет никакого отношения к Шову.Я подозреваю, что вам нужно переоценить свой дизайн, поскольку в действительности нет точного перевода из сервлета в структуру Seam.

...