2016-08-08 87 views
2

我現在使用Jasper創建報表並且幾乎一切順利。我們設置它的方式是,如果用戶將預覽報告,報告(pdf)將顯示在新標籤上。問題是如果發生錯誤,新的Tab仍然會被打開,而不是僅僅在原始頁面上顯示反饋面板。Java Wicket - 防止表單從異常發生時創建新選項卡

如何設置表單,以便在原始頁面上顯示反饋面板而不是新打開的Tab?

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> 

在此先感謝任何會回答的人。 ^^

回答

0

您必須執行表單(Ajax) - 提交沒有目標,然後在檢查可能的錯誤後啓動實際下載。

請參閱https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow瞭解使用Ajax和附件內容處置的示例。

+0

嗨先生!我已經確定下載部分。我現在想要的是當發生異常時,無論是預覽還是下載報表,都要停止創建新選項卡。 –

+0

請參閱WiseTree的答案以獲得更好的解釋。 – svenmeier

2

如果您向target="_blank"表單提交任何表單提交,瀏覽器將自動打開一個新選項卡來呈現表單提交的響應。這是預期的行爲,並試圖阻止它正在打破標準target="_blank"的行爲。我想我的意思是你應該真的認爲是否打破這種標準行爲是你想要做的事情。

如果是這樣,我將如何去做。警告:不會乾淨。

使用Ajax(AjaxButtonAjaxFormSubmitBehavior)提交表單。由於它是通過Ajax完成的,因此瀏覽器不會調用默認的表單提交行爲,因此不會打開新的選項卡。

Ajax然後調用表單處理。出錯時,重新呈現反饋面板並返回。成功附加JavaScript以在請求返回時在相應鏈接上調用默認表單提交。這將執行標準表單提交行爲,因此執行target="_blank"。它會再次驗證表單,但是它會繼續執行最初的預期行爲。

您可以通過幾種不同的方式完成您在所需鏈接上調用默認表單提交的方式,完全取決於您。作爲一種快速和骯髒的方式,你可以隱藏你現在(可視化)的按鈕,並執行JavaScript來點擊按鈕。或者,如果您不想要難看的隱藏點擊行爲,則可以使用隱藏表單字段來標識哪個按鈕已被點擊。

相關問題