【问题标题】:What's the easiest way to implement background downloading in Wicket?在 Wicket 中实现后台下载的最简单方法是什么?
【发布时间】:2010-04-19 14:49:38
【问题描述】:

我有一个简单的 Wicket 表单,让用户可以选择一些数据,然后下载包含他们要求的 ZIP 文件(动态生成)。目前表单按钮的onSubmit() 方法如下所示:

public void onSubmit() {
    IResourceStream stream = /* assemble the data they asked for ... */ ;
    ResourceStreamRequestTarget target = new ResourceStreamRequestTarget(stream);
    target.setFileName("download.zip");
    RequestCycle.get().setRequestTarget(target);
}

这可行,但是请求当然会停止,并且不可能向用户显示任何其他反馈。

我想要的是典型的“您请求的下载 [NAME] 应该自动开始。如果没有,请单击此链接。”理想情况下,仍然显示相同的页面,因此用户可以立即选择一些不同的数据并下载。

我认为使用 Wicket 的 Ajax 类可以做到这一点,但到目前为止,我已经设法避免使用它们,而且对我来说并不是很明显。在这里,我最快的出路是什么?


更新每个 Zeratul 的回答,如下:我最终得到的是这样的:

class MyDownloader extends AbstractAjaxBehavior {

    private final MyForm form;

    MyDownloader(MyForm form) {
        this.form = form;
    }

    void startDownload(AjaxRequestTarget target) {
        target.addComponent(myForm);
        target.appendJavascript("window.location.href='" + getCallbackUrl() + "'");
    }

    @Override
    public void onRequest() {
        try {
            ResourceStreamRequestTarget streamTarget = form.getStreamTarget();
            form.info(/* some status message */);
            getComponent().getRequestCycle().setRequestTarget(streamTarget);
        catch (SomeException e) {
            form.error(e.getMessage());
        }
    }
}

class MyForm extends Form {

    private final MyDownloader myDownloader;
    private final Object myModel;

    MyForm(Object aModel) {
        super("myForm");
        myModel = aModel;
        myDownloader = new MyDownloader(this);

        add(myDownloader);

        add(/* form components */);
        add(new AjaxButton("download", new Model<String>("Download"), this) {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                myDownloader.startDownload(target);
            }
        });

        add(new FeedbackPanel("feedback"));
    }

    ResourceStreamRequestTarget getStreamTarget() throws SomeException {
        return /* target based on form input */;
    }
}

这感觉有点摇摇晃晃,但似乎有效。

【问题讨论】:

    标签: java wicket


    【解决方案1】:

    Apache cwiki 上有一篇关于此的文章,它可能适合你:

    ajax download

    【讨论】:

    • 看起来它应该可以解决问题,并且下载部分确实有效,但不幸的是它没有告诉我如何实际更新页面 - 该示例建议将组件添加到AjaxRequestTarget,但不清楚目标实际上是什么或这些组件最终在哪里。
    • 好的,想通了——只需要将封闭表单添加到目标。奇怪的 API,但它有效。谢谢。
    • @DavidMoles 这就是 Wicket 中所有 AJAX 的处理方式:框架将 AjaxRequestTarget 的实例传递给您的代码,您必须添加所有要重新渲染的组件。跨度>
    猜你喜欢
    • 2011-03-21
    • 2023-03-20
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多