Насколько я могу судить, это подпадает под «вы не можете этого сделать». Я собираюсь переосмыслить свое решение и обойти его, но я подумал, что спросить здесь стоит хотя бы попробовать.
Мой сервлет JSP/Spring/Struts создает отчеты, записывает их в PDF и ставит в очередь для загрузки, а затем ждет, пока пользователь запросит дополнительные отчеты. Детали не слишком важны. Я передаю PDF на сервер с помощью следующего вызова функции:
public static void streamFileToBrowser(File docFile, HttpServletResponse response) throws Exception {
try {
// return file to user
// set contextType
response.setContentType("application/pdf");
// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setHeader("Content-Disposition","attachment; filename=" + docFile.getName() );
ServletOutputStream outs = response.getOutputStream();
byte[] outputFileBytes = util_getBytesFromFile(docFile.getAbsolutePath());
response.setContentLength(outputFileBytes.length);
outs.write(outputFileBytes); // byte[]
outs.flush();
outs.close();
} catch (Exception e) {
throw e;
}
}
Это довольно прямолинейно. Я использую объект ответа ServletOutputStream для отправки своих битов. Это работает хорошо.
Однако иногда я ловлю некоторые ошибки, возникающие при формировании отчетов. Это информативные сообщения типа "Нет заказов от аккаунта бла-бла-бла". У меня есть раздел в моем JSP, который будет их перехватывать и отображать.
Итак, вот в чем загвоздка: когда у меня нет отчета для отправки, я не вызываю вышеуказанную функцию. Но я всегда вызываю что-то вроде:
return mapping.findForward("pullReports");
как последняя строка в моем методе ActionForward, и появляются ошибки. Однако, если у меня есть биты для отправки через функцию streamFileToBrowser(), мой возможный вызов map.findForward ничего не делает.
Немного копания говорит мне, что Struts может обрабатывать только один ответ на объект HttpServletResponse за раз. Я использовал его с моим вызовом streamFileToBrowser(), поэтому возможный вызов map.findForward(...) ничего не делает для моего клиента.
Кто-нибудь еще сталкивался с этим и нашел решение?