Я отправляю отчет о яшме в формате PDF для скачивания. Но когда я это делаю, я не могу перезагрузить или перенаправить страницу.
Страница, которая вызывает загрузку, использует отправку формы для начала загрузки файла. Ответ, предоставленный Говиндой Сахаре, был опубликован до того, как я сделал это разъяснение. Однако его ответ может быть реализован без особых усилий, так как форма имеет только один выбор (большой или маленький).
Ниже приведена функция, которая обрабатывает ответ сервера:
private void generateReportPDF(JasperReport jasperReport, List<? extends Object> data, Map<String, Object> parameters, HttpServletResponse resp) throws Exception {
byte[] bytes = null;
if( data == null ) {
bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, reportDao.getConnection());
}
else {
bytes = JasperRunManager.runReportToPdf(jasperReport, parameters, new JRBeanCollectionDataSource(data));
}
resp.reset();
resp.resetBuffer();
resp.setContentType("application/pdf");
resp.addHeader("Content-Disposition", "attachment; filename=" + jasperReport.getName() + ".pdf");
resp.setContentLength(bytes.length);
ServletOutputStream ouputStream = resp.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
return;
}
Из-за этогофункция, мой контроллер не может перенаправить страницу, и я получаю следующую ошибку при попытке.
SEVERE: Servlet.service() for servlet [myapp-dispatcher] in context with path [/myapp] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed] with root cause
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
Я хочу перезагрузить страницу. Это на экране печати этикеток, и после загрузки файла я хочу, чтобы страница перезагрузилась / перенаправила себя так, чтобы напечатанные этикетки отображались на новом месте. Поскольку контроллер не может перенаправить, я должен изменить исходный процесс, который обрабатывает ответ, или реализовать JavaScript, чтобы он происходил после обработки файла.
Этот вопрос запрашивает перехватзагружает и отвечает на них, но не требует весны, поэтому ответы потребуют больше изменений, чем я хочу сделать.
Использование одного из ответов из вопроса, который мне удалось обойти. но это меня не устраивает.
$(document).ready(function() {
$('#printBtn').click(function() {
if(confirm('<spring:message code="print.alert.confirm"/>') ? true : false)
{
window.addEventListener('focus', window_focus, false);
function window_focus(){
//remove buttons
var elem1 = document.getElementById('printBtn');
elem1.parentNode.removeChild(elem1);
//elem1.parentNode.replaceChild(newbutton);
var elem2 = document.getElementById('clearBtn');
elem2.parentNode.removeChild(elem2);
var elem3 = document.getElementById('restoreBtn');
elem3.parentNode.removeChild(elem3);
document.getElementById('button_spot').innerHTML = "The page will reload after you get the file.";
//watch for page to lose focus due to download dialog box
window.addEventListener('focusout', pageNoFocus);
function pageNoFocus(){
//watch for page to resume focus
window.removeEventListener('focusout', pageNoFocus);
window.addEventListener('focus', pageFocus);
function pageFocus(){
window.removeEventListener('focus', pageFocus);
location.reload();
}
}
}
return true;
}
return false;
});
$('#clearBtn').click(function() {
return confirm('<spring:message code="print.alert.clear"/>') ? true : false;
});
$('#restoreBtn').click(function() {
return confirm('<spring:message code="print.alert.restore"/>') ? true : false;
});
});