Java AbstractResource.ResourceResponse在写入OutputStream时阻塞用户界面
我想通过实现一个AbstractResource,使用Wicket下载一个CSV文件。它看起来像这样:Java AbstractResource.ResourceResponse在写入OutputStream时阻塞用户界面,java,wicket,download,wicket-1.6,wicketstuff,Java,Wicket,Download,Wicket 1.6,Wicketstuff,我想通过实现一个AbstractResource,使用Wicket下载一个CSV文件。它看起来像这样: public class ExportCsvFileResource extends AbstractResource { @Override protected AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes attributes) { Abstract
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);
}
}
}
公共类ExportCsvFileResource扩展了AbstractResource
{
@凌驾
受保护的AbstractResource.ResourceResponse newResourceResponse(IResource.Attributes属性)
{
AbstractResource.ResourceResponse ResourceResponse=新的AbstractResource.ResourceResponse();
resourceResponse.setContentType(“text/csv”);
setFileName(“导出的联系人文件.csv”);
resourceResponse.SetTextEncode(“utf-8”);
resourceResponse.setWriteCallback(新的AbstractResource.WriteCallback()
{
@凌驾
public void writeData(IResource.Attributes)引发IOException
{
OutputStream=attributes.getResponse().getOutputStream();
GenerateContentInBatch(流);
}
});
返回资源响应;
}
私有void generateContentInBatch(OutputStream)
{
int numberOfChunks=/。。。
对于(int i=0;i,这里是一个延迟加载的示例:
我不知道这对AbstractResource对象是如何起作用的,但这应该会让您走上正确的方向。看看wicket示例中的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));
}
});