0

我想通过实现 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函数生成内容时(这非常耗时),用户界面没有响应。我单击按钮等,但没有任何反应,只有在文件生成完成后,我才能再次使用该界面。

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

4

2 回答 2

2

查看 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));
    }
});
于 2014-02-07T14:11:18.467 回答
0

下面是一个延迟加载的例子:

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

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

于 2014-02-07T13:40:28.817 回答