2016-08-08 7 views
2

Я создаю отчеты с использованием Jasper прямо сейчас, и почти все идет хорошо. Мы установили его таким образом, что если пользователь будет просматривать отчет, отчет (pdf) будет показан на новой вкладке. Проблема в том, что если произошла ошибка, новая вкладка все же будет открыта, а не будет показана панель обратной связи на исходной странице.Java Wicket - предотвращение создания формы из новой вкладки при возникновении исключения

Как настроить форму таким образом, чтобы панель обратной связи отображалась на исходной странице вместо недавно открытой вкладки?

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 (AjaxButton или AjaxFormSubmitBehavior), чтобы отправить форму. Поскольку это делается через ajax, браузер не будет вызывать поведение отправки по умолчанию, поэтому не открывает новую вкладку.

Ajax затем вызывает обработку формы. При ошибке повторите визуализацию панели обратной связи и верните ее. В случае успеха добавьте JavaScript, чтобы вызвать отправку формы по умолчанию по соответствующей ссылке при возврате запроса. Это приведет к поведению стандартного представления формы, следовательно, к выполнению target="_blank". Это еще раз подтвердит форму, но затем она продолжит выполнение первоначально намеченного поведения.

Способ, которым вы ссылаетесь на отправку по умолчанию по желаемой ссылке, может быть выполнен несколькими способами и полностью зависит от вас. Как быстрый и грязный способ вы можете скрыть кнопки, которые у вас есть прямо сейчас (визуально), и выполнить javascript, чтобы щелкнуть по кнопке. Или вы можете использовать скрытое поле формы, чтобы определить, какая кнопка была нажата, если вы не хотите уродливого скрытого нажатия.