编程语言
首页 > 编程语言> > java-在Wicket中实现后台下载的最简单方法是什么?

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 */;
    }
}

这感觉有些摇摇晃晃,但似乎可行.

解决方法:

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

ajax download

标签:wicket,java
来源: https://codeday.me/bug/20191210/2099365.html