在Wicket中实现后台下载的最简单方法是什么?

时间:2010-04-19 14:49:39

标签: java wicket

我有一个简单的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 */;
    }
}

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

1 个答案:

答案 0 :(得分:3)

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

ajax download