Java Wicket - 在发生异常时阻止表单创建新选项卡

时间:2016-08-08 11:05:34

标签: forms tabs wicket

我正在使用Jasper创建报告,几乎一切顺利。我们设置它的方式是,如果用户将预览报告,报告(pdf)将显示在新标签上。问题是如果发生错误,仍然会打开一个新的选项卡而不是仅显示原始页面上的反馈面板。

如何设置表单,使反馈面板显示在原始页面而不是新打开的标签?

Form<?> form = new Form<Void>("form");
form.add(new AttributeAppender("target", Model.of("_blank")));

SubmitLink view= new SubmitLink("view") {
    @Override
    public void onSubmit() {
        //code inside a try-catch to generate the report using Jasper}
};    

CptiDownloadButton download = new CptiDownloadButton("download", new AbstractReadOnlyModel<File>(){
 //CptiDownloadButton extends SubmitLink button and is a modification of Mr Ivaynberg's DownloadLink
};


<form wicket:id="form">
    <a href="#" wicket:id="submit"><input type="button" wicket:message="value:search"/></a>
    <a href="#" wicket:id="download"><input type="button"  wicket:message="value:download"/></a>
</form>

提前感谢任何回答的人。 ^^

2 个答案:

答案 0 :(得分:2)

如果您使用target="_blank"对表单进行任何表单提交,浏览器将自动打开一个新选项卡以呈现表单提交中的响应。这是预期的行为,并试图阻止它违反了标准的target="_blank"行为。我想我所说的是你应该真的想到打破这种标准行为是否是你想做的事情。

如果是,请按照以下方式进行操作。警告:不要干净。

使用Ajax(AjaxButtonAjaxFormSubmitBehavior)提交表单。由于它是通过ajax完成的,因此浏览器不会调用默认的表单提交行为,因此无法打开新选项卡。

然后Ajax调用表单处理。出错时,重新渲染反馈面板并返回。成功时,附加JavaScript以在请求返回时在相应链接上调用默认表单提交。这将执行标准表单提交行为,因此执行target="_blank"。它将再次验证表单,但随后它将继续执行最初预期的行为。

您在所需链接上调用默认表单提交的方式可以通过几种不同的方式完成,完全取决于您。作为一种快速而肮脏的方式,您可以隐藏您现在拥有的按钮(直观地)并执行javascript以单击按钮。或者,如果您不想要难看的隐藏点击行为,您可以使用隐藏的表单字段来标识已单击的按钮。

答案 1 :(得分:0)

你必须做一个没有目标的表单(Ajax)-submit,然后在检查可能的错误后启动实际的下载。

有关使用Ajax和附件内容处置的示例,请参阅https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow