Ajuda para desvendar um erro - HTTP 500

Pessoal… alguém sabe pq q aparece esse erro???
eu nao alterei nada no código, e apareceu isso…

[code]HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: getOutputStream() has already been called for this response
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

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)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
org.apache.jsp.GeraRelatorio_jsp._jspService(GeraRelatorio_jsp.java:132)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.17 logs.[/code]

alice5,
Coloque seu codigo aqui !!

Mas isso deve ser algum tipo de conflito com o stream out.

a única parte do meu código q usa isso, é essa, onde eu baixo o arquivo q eu criei:

[code]// baixando o Relatorio.xls para o usuario
File t_file = new File(request.getRealPath("") + "/temp/Relatorio.xls");
long fileSize = t_file.length();
InputStream in = new FileInputStream(t_file);
if (in != null)
{
response.reset();
response.setContentType("application/x-msdownload");

String s = "attachment; filename=" + t_file.getName();
response.setHeader("Content-Disposition", s);
response.setContentLength((int) fileSize);
byte[] b = new byte[2048];
int len = 0;
while ((len = in.read(b)) > 0)
{
	response.getOutputStream().write(b, 0, len);
}
in.close();

}[/code]

Este código esta em um jsp ou um servlet ?

olha… vou ser bem sincera com vc… eu ainda nao sei a diferença entre esses dois… mas o código ta num arquivo .jsp, e nao tem html!

Fiz algumas pequenas alterações e o browser estar fazendo o download normalmente.

Testei no jakarta-tomcat-5.0.18, plataforma windows

Segue o jsp, com algumas alterações

<html>
<head><title>Number Guess</title></head>
<body bgcolor="white">

<jsp:directive.page import="java.io.*"/>


<% 
File t_file = new File(request.getRealPath("") + "/temp/relatorio.xls");
long fileSize = t_file.length();
InputStream in = new FileInputStream(t_file);
if (in != null)
{
   response.reset();               
   //response.setContentType("application/ms-excel"); //Abre o arquivo no bowser
   response.setContentType("application/download");
   
   String s = "attachment; filename=" + t_file.getName();
   response.setHeader("Content-Disposition", s);
   response.setContentLength((int) fileSize);
   byte[] b = new byte[2048];
   int len = 0;
   while ((len = in.read(b)) > 0)
   {
      response.getOutputStream().write(b, 0, len);
   }
   in.close();
}



%>
</body>
</html>

olha… não é possível… copiei e colei o código aqui, e deu esse mesmo erro:
java.lang.IllegalStateException: getOutputStream() has already been called for this response

Isso ta com cara de conflito… sei lá… ta falando q a função já foi chamada por essa response… :frowning:

alice5,

O jsp esta sendo “chamado” por um servlet ?
Faça um pequeno teste chamando a pagina direto do browser !!

o conflito pode ser entre o JSPWriter out e o stream out do servlet !

Mais uma alternativa

tirei o response.getOutputStream() e usei o out, que é o JspWriter
http://java.sun.com/j2ee/sdk_1.2.1/techdocs/api/javax/servlet/jsp/JspWriter.html

[code]
<html>
<head><title>Number Guess</title></head>
<body bgcolor="white">

<jsp:directive.page import="java.io.*"/>

<%

File t_file = new File(request.getRealPath("") + "/temp/relatorio.xls");
long fileSize = t_file.length();
InputStream in = new FileInputStream(t_file);

if (in != null)
{
response.reset();
//response.setContentType("application/ms-excel"); //Abre o arquivo no bowser
response.setContentType("application/download");

String s = "attachment; filename=" + t_file.getName();
response.setHeader("Content-Disposition", s);
response.setContentLength((int) fileSize);
byte[] b = new byte[2048];
int len = 0;
while ((len = in.read(b)) > 0)
{
//response.getOutputStream().write(b, 0, len);
out.print(b);
}
in.close();
}
out.clear();
out = pageContext.pushBody();

%>

</body>
</html>[/code]

Nao deu certo… e pior que esse erro se dá do nada… :frowning:

Bem, eu tenho um arquivo “…temp/Relatorio.xls” que está no meu servidor, e queria fazer o download normal desse arquivo para o usuário… alguém tem alguma rotina que faça isso?

Qual erro deu no código do meu post anterior ?
Executei aqui com o tomcat e o download foi feito corretamente.

Qual erro utilizando out.print(b)?
Bem, o download deu certo, mas o arquivo ficou todo errado… nem consegui abrir pelo excel!!! :frowning:

desculpe-me, não tinha tentado visualizar o arquivo !! :oops:

refiz algumas coisas…
estou incluindo o codigo do meu servlet e do jsp …eles estao funcionado aqui !!

Qq coisa coloque o codigo do seu servlet !!!

[code]
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*

  • @author paulo.marcelo
    */
    public class HelloWorldExample extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    try {
    forward("/download.jsp", request, response);
    } catch (Exception exp) {
    exp.printStackTrace();
    }
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    doPost(request, response);
    }

    private void forward(String pageToForward, HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    getServletContext().getRequestDispatcher(pageToForward).forward(request, response);
    }

}[/code]

&lt;html&gt;
&lt;head&gt;&lt;title&gt;Number Guess&lt;/title&gt;&lt;/head&gt;
&lt;body bgcolor=&quot;white&quot;&gt;

&lt;jsp&#58;directive.page import=&quot;java.io.*&quot;/&gt;


&lt;% 

File t_file = new File&#40;request.getRealPath&#40;&quot;&quot;&#41; + &quot;/temp/relatorio.xls&quot;&#41;;
long fileSize = t_file.length&#40;&#41;;
InputStream in = new FileInputStream&#40;t_file&#41;;

if &#40;in != null&#41;
&#123;
   response.reset&#40;&#41;;               
   //response.setContentType&#40;&quot;application/ms-excel&quot;&#41;; //Abre o arquivo no bowser
   response.setContentType&#40;&quot;application/download&quot;&#41;;
   
   String s = &quot;attachment; filename=&quot; + t_file.getName&#40;&#41;;
   response.setHeader&#40;&quot;Content-Disposition&quot;, s&#41;;
   response.setContentLength&#40;&#40;int&#41; fileSize&#41;;
   byte&#91;&#93; b = new byte&#91;2048&#93;;
   int len = 0;
   while &#40;&#40;len = in.read&#40;b&#41;&#41; &gt; 0&#41;
   &#123;
      response.getOutputStream&#40;&#41;.write&#40;b, 0, len&#41;;
   &#125;
   in.close&#40;&#41;;
&#125;

out.clear&#40;&#41;;
out = pageContext.pushBody&#40;&#41;; 


%&gt;

&lt;/body&gt;
&lt;/html&gt;

att,

Deu certo!

Muito obrigada pela ajuda, viu?
Não teria conseguido sem vc!
Valeu mesmo!!! :grin: