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 に答える