Soweit ich das beurteilen kann, fällt das unter "das können Sie nicht tun". Ich bin dabei, meine Lösung zu überdenken und zu umgehen, aber ich dachte, dass hier zu fragen war zumindest einen Versuch wert.
Mein JSP/Spring/Struts-Servlet erstellt Berichte, schreibt sie in das PDF-Format und stellt sie zum Herunterladen in eine Warteschlange, dann wartet es darauf, dass der Benutzer weitere Berichte anfordert. Die Details sind nicht allzu wichtig. Ich streame die PDF-Datei mit dem folgenden Funktionsaufruf an den Server:
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;
}
}
Das ist ziemlich einfach. Ich verwende das ServletOutputStream-Objekt der Antwort, um meine Bits zu versenden. Das funktioniert gut.
Allerdings treten manchmal Fehler auf, die bei der Erstellung der Berichte verursacht werden. Dabei handelt es sich um informative Meldungen wie "Es gab keine Bestellungen vom Konto blah-blah-blah". Ich habe einen Abschnitt in meiner JSP, der diese abfängt und anzeigt.
Jetzt kommt das Problem: Wenn ich keinen Bericht zu senden habe, rufe ich die obige Funktion nicht auf. Aber ich rufe immer etwas auf wie:
return mapping.findForward("pullReports");
als letzte Zeile in meiner ActionForward-Methode und die Fehler erscheinen. Allerdings, wenn ich Bits über die streamFileToBrowser() Funktion zu senden haben, meine eventuellen Aufruf zu mapping.findForward tut nichts.
Ein bisschen graben sagt mir, dass Struts nur in der Lage ist, eine Antwort auf das HttpServletResponse-Objekt zu einem Zeitpunkt zu behandeln. Ich habe es mit meinem Aufruf zu streamFileToBrowser() verwendet, so dass der eventuelle Aufruf zu mapping.findForward(...) nichts tut, soweit mein Client betroffen ist.
Hat sonst noch jemand dieses Problem und eine Lösung gefunden?