【问题标题】:AbstractResource.ResourceResponse blocks user-interface while writing to OutputStreamAbstractResource.ResourceResponse 在写入 OutputStream 时阻塞用户界面
【发布时间】:2014-02-07 12:13:09
【问题描述】:

我想通过实现 AbstractResource 来使用 Wicket 下载 CSV 文件。它看起来像这样:

public class ExportCsvFileResource extends AbstractResource 
{
   @Override
   protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes) 
   {
        AbstractResource.ResourceResponse resourceResponse = new AbstractResource.ResourceResponse();
        resourceResponse.setContentType("text/csv");
        resourceResponse.setFileName("exported-contacts-file.csv");
        resourceResponse.setTextEncoding("utf-8");
        resourceResponse.setWriteCallback(new AbstractResource.WriteCallback() 
        {
            @Override
            public void writeData(IResource.Attributes attributes) throws IOException 
            {
                OutputStream stream = attributes.getResponse().getOutputStream();
                generateContentInBatches(stream);
            }
        });
        return resourceResponse;
    }
    private void generateContentInBatches(OutputStream stream) 
    {
        int numberOfChunks=//...
        for (int i=0; i<numberOfChunks; i++) 
        {
            byte[] contentChunk = retrieveContentFromBackend(i);
            IOUtils.write(contentChunk, stream);
        }  
    }
}

问题在于,当使用 retrieveContentFromBackend 函数生成内容时(这非常耗时),用户界面没有响应。我点击按钮等,但没有任何反应,只有在文件生成完成后才能再次使用界面。

如何避免在文件逐渐生成时阻塞用户界面?

【问题讨论】:

    标签: java wicket download wicket-1.6 wicketstuff


    【解决方案1】:

    看看 wicket-examples 中的 RequestMapperApplication 和 MapperDemoResourceReference。

    你可以挂载资源引用:

    mountResource("/print/${sheet}/${format}", new MapperDemoResourceReference());
    

    要在不阻塞页面的情况下加载此类资源,您必须呈现直接触发资源的链接:

    add(new WebMarkupContainer("link")
    {
        @Override
        protected void onComponentTag(ComponentTag tag)
        {
            super.onComponentTag(tag);
    
            PageParameters parameters = new PageParameters();
            parameters.add("sheet", "sheet1");
            parameters.add("format", "A4");
            tag.put("href", urlFor(new MapperDemoResourceReference(), parameters));
        }
    });
    

    【讨论】:

      【解决方案2】:

      这是一个延迟加载的例子:

      http://www.wicket-library.com/wicket-examples/ajax/lazy-loading?1

      我不知道这如何与您的 AbstractResource 对象一起使用,但这应该会让您朝着正确的方向前进。

      【讨论】:

        猜你喜欢
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 2012-05-21
        相关资源
        最近更新 更多