Newsgroup: it.comp.java
Titolo: IllegalStateException

Ciao al newsgroup,
ho un'applicazione basata sul framework Struts in Apache Tomcat. Una
pagina presenta un report che l'utente puo' esportare in formato PDF.
Quando l'utente clicca sul link di export, un popup appare nel
browser, con l'opzione se aprire o salvare il file.
La richiesta di export si traduce nell'invocazione di una action:
public ActionForward execute(ActionMapping actionMapping, ActionForm
actionForm,
         HttpServletRequest httpServletRequest, HttpServletResponse
httpServletResponse)
   {
      ReportExporter.getInstance().exportReport(
            "questionnaire" + ReportExporter.getReportType(),
httpServletRequest,
            httpServletResponse);
      return actionMapping.findForward("questionnairePrint");
   }
L'action ritorna un forward che redirige la risposta ad una pagina JSP
(la pagina di input).
Segue il metodo exportReport():
   public void exportReport(String reportName, HttpServletRequest
httpServletRequest,
         HttpServletResponse httpServletResponse)
   {
            ByteArrayOutputStream outputStream = new
ByteArrayOutputStream();
            JasperExportManager.exportReportToPdfStream(printObj,
outputStream);
            String fileName = reportName + "_" +
System.currentTimeMillis() + "_.pdf";
            httpServletResponse.setContentType("application/pdf");
            httpServletResponse.addHeader("Content-disposition",
"attachment; filename=\""
                  + fileName + "\"");
            httpServletResponse.setContentLength(outputStream.size());
            ServletOutputStream responseOutputStream =
httpServletResponse.getOutputStream();
            outputStream.writeTo(responseOutputStream);
   }
Quindi, come potete vedere, il metodo getOutputStream() viene invocato
sulla risposta. Il risultato e' un errore causato dal successivo
tentativo della JSP di accedere nuovamente allo stream di output della
risposta:
java.lang.IllegalStateException: getOutputStream() has already been
called for this response
	org.apache.catalina.connector.Response.getWriter(Response.java:599)
 
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:
195)
 
javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:
111)
	org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:
124)
 
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:
117)
	org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:172)
	org.apache.struts.taglib.tiles.InsertTag
$InsertHandler.doEndTag(InsertTag.java:889)
	org.apache.struts.taglib.tiles.InsertTag.doEndTag(InsertTag.java:462)
 
org.apache.jsp.jsp.layouts.pageLayout_jsp._jspx_meth_tiles_insert_0(pageLayout_jsp.java:
383)
 
org.apache.jsp.jsp.layouts.pageLayout_jsp._jspService(pageLayout_jsp.java:
159)
Evidentemente c'e' un modo migliore di fare quello che sto cercando di
fare.
E' possibile far si'  che il file PDF venga rediretto su un canale
differente rispetto alla JSP?
Ho letto la risposta ad un problema simile al mio che suggeriva di
usare una frame, ma io vorrei evitare questa soluzione, a meno che
qualcuno di voi non la consigli caldamente.
E' possibile farlo usando qualche specifica funzionalita' di Struts?
Al limite potrei usare AJAX, che ne dite?
Avete suggerimenti?
Grazie dell'attenzione
TN

eh si perchè prima scrivi sull'out e poi lo usi in un altro modo.
non puoi usare una servlet per generare il file ?
-- 
Davide Consonni

 TN
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 called for this response
Struts mette a disposizione una DownloadAction, che puoi estendere per
ottenere esattamente quello che ti serve: far interpretare al browser
il contenuto della risposta che generi nella tua Action come file PDF
(o qualsiasi altra cosa ti necessiti).
Non puoi inviare al client 2 streams in una stessa richiesta HTTP: nel
tuo caso uno di tipo application/pdf e l'altro di tipo text/html e
questo e' il motivo dell'errore.
--
SoulSpirit

 Struts mette a disposizione una DownloadAction, che puoi estendere per
Eh, si', ma e' stata introdotta in Struts 1.2, mentre io utilizzo la
versione 1.1
Nell'attesa di migrare tutto verso JSF, alla fine ho usato una servlet
Grazie lo stesso
TN