我有一个表单,
onSubmit
,从服务器请求一些依赖于输入的数据,并创建一个文件和它的ResourceStream
。
该文件相当重要,因此应立即开始下载。但我不能允许多个请求/提交发生,所以我想同时切换页面或更换面板。
有办法做到这一点吗?下载文件并单击即可切换页面/面板?
到目前为止,我创建了一个
ResourceStreamRequestHandler handler
并使用 getRequestCycle().scheduleRequestHandlerAfterCurrent(handler)
在 onSubmit
期间启动下载。
onSubmit() {
// Get the data.
// ...
ResourceStreamRequestHandler handler = new ResourceStreamRequestHandler(getResourceStream(data...), getFileName(data...));
getRequestCycle().scheduleRequestHandlerAfterCurrent(handler);
// oldPanel.this.replaceWith(new newPanel(data...));
// setResponsePage(mainPage.class);
}
问题是,如果我使用
setResponsePage
返回主页,下载不会开始,如果我尝试replaceWith(new newPanel())
,下载开始,但面板未正确更换。我什至尝试从newPanel
启动下载(例如在onAfterRender
期间等),但面板仍然没有正确交换。
您可以使用`org.apache.wicket.extensions.ajax.AjaxDownloadBehavior。
private void initDownloadInNewWindow()
{
IResource resource = new ExampleResource("downloaded via ajax in a new browser window")
.setContentDisposition(ContentDisposition.INLINE);
final AjaxDownloadBehavior download = new AjaxDownloadBehavior(resource)
{
private static final long serialVersionUID = 1L;
@Override
protected void onBeforeDownload(IPartialPageRequestHandler handler)
{
downloadingContainer.setVisible(true);
handler.add(downloadingContainer);
}
@Override
protected void onDownloadSuccess(AjaxRequestTarget target)
{
downloadingContainer.setVisible(false);
target.add(downloadingContainer);
}
@Override
protected void onDownloadFailed(AjaxRequestTarget target)
{
downloadingContainer.setVisible(false);
target.add(downloadingContainer);
target.appendJavaScript("alert('Download failed');");
}
@Override
protected void onDownloadCompleted(AjaxRequestTarget target)
{
downloadingContainer.setVisible(false);
target.add(downloadingContainer);
}
};
download.setLocation(AjaxDownloadBehavior.Location.NewWindow);
add(download);
add(new AjaxLink<Void>("downloadInNewWindow")
{
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target)
{
download.initiate(target);
}
});
}
参见 https://examples9x.wicket.apache.org/ajax/download 例如。它的源代码可以在https://github.com/apache/wicket/blob/master/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/AjaxDownloadPage.java找到
您需要在新窗口/选项卡中触发下载,然后调用
setResponsePage(NewPage.class)
进行重定向。