Wicket 8:如何同时开始下载和切换页面/替换面板?

问题描述 投票:0回答:1

我有一个表单,

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
期间等),但面板仍然没有正确交换。

download wicket wicket-8
1个回答
0
投票

您可以使用`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)
进行重定向。

© www.soinside.com 2019 - 2024. All rights reserved.