Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/01/2007, 05:01
Langas
 
Fecha de Ingreso: enero-2007
Mensajes: 17
Antigüedad: 17 años, 4 meses
Puntos: 0
IllegalStateException en JSP

Hola, estoy creando una aplicación en JSP sobre Tomcat 5.5 para generar un archivo de texto en mi máquina local y que pueda ser descargado por un usuario remoto. Para ello hago uso de un taglib que contiene el método sendFile:

private void sendFile(String s, HttpServletResponse httpservletresponse)
throws JspException
{
String s1 = System.getProperty("file.separator");
try
{
pageContext.getOut().clearBuffer();
}
catch(Exception exception) { }
int i = s.lastIndexOf(s1);
if(i < 0 && s1.equals("\\"))
{
i = s.lastIndexOf("/");
}
String s2;
if(i > 0 && i != s.length() - 1)
{
s2 = s.substring(i + 1);
} else
{
s2 = s;
}
httpservletresponse.setContentType(getContentType( s2) + "; name=" + s2);
if(!inline)
{
httpservletresponse.setHeader("Content-Disposition", "attachment;filename=\"" + s2 + "\"");
} else
{
httpservletresponse.setHeader("Content-Disposition", "inline;filename=\"" + s2 + "\"");
}
ServletOutputStream servletoutputstream;
try
{
servletoutputstream = httpservletresponse.getOutputStream();
}
catch(Exception exception1)
{
throw new JspException("Could not get OutputStream: " + exception1.getMessage());
}
if(!dumpFile(s, servletoutputstream))
{
throw new JspException("Could not download file");
}
try
{
servletoutputstream.flush();
servletoutputstream.close();
}
catch(Exception exception2) { }
}

El problema es que Tomcat me da una IllegalStateException, diciéndome que ya he llamado a getOutputStream para esa respuesta, lo que no entiendo, ya que no estoy llamando a getWriter. Esta es la traza del error:

03-ene-2007 11:19:09 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() para servlet jsp lanzó excepción
java.lang.IllegalStateException: getOutputStream() ya ha sido llamado para esta respuesta
at org.apache.catalina.connector.Response.getWriter(R esponse.java:599)
at org.apache.catalina.connector.ResponseFacade.getWr iter(ResponseFacade.java:195)
at org.apache.jasper.runtime.JspWriterImpl.initOut(Js pWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffe r(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release( PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalR eleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePa geContext(JspFactoryImpl.java:75)
at org.apache.jsp.descargaInformeAgregado_jsp._jspSer vice(descargaInformeAgregado_jsp.java:241)
at org.apache.jasper.runtime.HttpJspBase.service(Http JspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:802)
at org.apache.jasper.servlet.JspServletWrapper.servic e(JspServletWrapper.java:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFil e(JspServlet.java:314)
at org.apache.jasper.servlet.JspServlet.service(JspSe rvlet.java:264)
at javax.servlet.http.HttpServlet.service(HttpServlet .java:802)
at org.apache.catalina.core.ApplicationFilterChain.in ternalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.do Filter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invo ke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invo ke(StandardContextValve.java:178)
at org.apache.catalina.authenticator.AuthenticatorBas e.invoke(AuthenticatorBase.java:524)
at org.apache.catalina.core.StandardHostValve.invoke( StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invok e(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.servic e(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(H ttp11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11 ConnectionHandler.processConnection(Http11BaseProt ocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.process Socket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThr ead.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlR unnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Unknown Source)

Y la parte relevante del código fuente de la aplicación (las String tempInforme y nombreInforme ya están inicializadas; "do: download" es la etiqueta del taglib):


<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /></head>
<body>
<%
String dirInforme = "/files/temp";
String rutaInforme = "webapps/tarific/files/temp/" + nombreInforme;
BufferedWriter salidaInforme = new BufferedWriter(new FileWriter(rutaInforme));
File ficheroInforme = new File(rutaInforme);
salidaInforme.write(tempInforme);
salidaInforme.close();
if (!(ficheroInforme.exists())){
%>
ERROR. El archivo no se ha guardado correctamente
<%
} else {
%>
<do:download file="<%=nombreInforme%>" dir="<%=dirInforme%>"/>
<%
}
Registros.close();
StatementRegistros.close();
ConnRegistros.close();
%>
</body>
</html>

¿Alguien puede ayudarme? Muchas gracias por vuestra atención.