Java.lang.IllegalStateException: Writer is already being use

7 respostas
I

O que está errado?

iz

Error: 500
Location: /servlet/ServletBusca
Internal Servlet Error:

java.lang.IllegalStateException: Writer is already being used for this request

at org.apache.tomcat.facade.HttpServletResponseFacade.getOutputStream(HttpServletResponseFacade.java:158)

at ServletBusca.service(ServletBusca.java:204)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)

at org.apache.tomcat.core.Handler.service(Handler.java:286)

at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)

at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)

at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)

at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)

at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)

at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)

at java.lang.Thread.run(Thread.java:484)
java.lang.NullPointerException

at ServletBusca.service(ServletBusca.java:100)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)

at org.apache.tomcat.core.ServletWrapper.doService(ServletWrapper.java:404)

at org.apache.tomcat.core.Handler.service(Handler.java:286)

at org.apache.tomcat.core.ServletWrapper.service(ServletWrapper.java:372)

at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:797)

at org.apache.tomcat.core.ContextManager.service(ContextManager.java:743)

at org.apache.tomcat.service.http.HttpConnectionHandler.processConnection(HttpConnectionHandler.java:210)

at org.apache.tomcat.service.TcpWorkerThread.runIt(PoolTcpEndpoint.java:416)

at org.apache.tomcat.util.ThreadPool$ControlRunnable.run(ThreadPool.java:498)

at java.lang.Thread.run(Thread.java:484)

7 Respostas

urubatan

parece que você esta chamando getOurputStream para o request mais de uma vez, posta uma parte do código ai para nois dar uma conferida :slight_smile:

Guilherme_Silveira

isso, sevoce ja pegou o writer uma vez, nao ira funcionar uma chamada para o get output stream… tente checar na linha indicada pelo erro se voce nao esta chamando o metodo por uma segunda vez

Abraco

Guilherme

Paulo_Silveira

a partir do momento que voce pegou o Writer, nao pode pegar o OutputStream, e vice versa!

I

Ao pessoal do forum desculpe por este código grande, mas deem uma olhada, na verdade é um código de teste, no momento estou envolvido em outro projeto, mas em breve volto pro java, e estou interessado em servlet.

iz

public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//Definindo o Content Type
    response.setContentType("text/html");
    java.io.PrintWriter out = response.getWriter();
    
    /* Criando um StringBuffer para aumentar a performace de resposta do Servlet
     *pois assim mandamos todos os dados em apenas uma conexão HTTP*/
     StringBuffer buffer = new StringBuffer();
     try
     {
         //Aqui o tipooper do FORM da pág. index.html que foi definido no FORM como hidden

         String tipooper = /*request.getParameter("par_tipooper")=*/"consulta";

         /*if (tipooper == ""){ 
             System.out.println("Tipo da operaçao está vazio");
             break;
             }*/
         
         if (tipooper.equalsIgnoreCase("consulta"))
         {
             //Inserindo tags HTML para que seja gerada uma pg
             buffer.append("<html><head><title>ServletSearch</title><head>");
             buffer.append("<font face=Arial size=2>");
             
             String palavraChave = "izaias"; //request.getParameter("par_busca");
             String query = new String();
             
             /*
              Selecionando url, título e descrição databela tbl_cadsites
              *onde a palavra passada é encontrada nos campos descrição,
              *título ou url
             */
             
             query = "Select url, titulo, descricao from tbl_cadsites where url like '%"+palavraChave;
             
             /* Executa a query e cria um objeto ResultSet */
             
             ResultSet rs = stmt.executeQuery(query);
             
             //Exibe os dados, navegando até o fim do result set
             
             boolean more = rs.next();
             if(!more)
                 buffer.append("<B> Não foi encontrado nenhum registro!!<BR></B>
“);

else

buffer.append(”<B><H3>Veja abaixo o resultado da busca: </B></H3><p>

");
int cont=0;
             
             while (more)
             {
                 //Navegando através de cada atributo, obtendo o conteúdo e exibindo-o
                 
                 cont++;
                 buffer.append("&lt;B&gt;" + cont + " - &lt;A href="" + rs.getString(1) + "" target="" + rs.getString(2)+ " &gt;&lt;/A&gt;&lt;/b&gt;
“);

buffer.append(”<BR><I>

“);

buffer.append(rs.getString(3));

buffer.append(”</I><P><HR>

");
//Vai para o prox. resgitro
                 
                 more = rs.next();
             }
             
             buffer.append("&lt;BR&gt;Total de registros encontrados: " +cont);
             //Fecha o result set
             rs.close();
         }
         
         else
             
         {
             buffer.append("&lt;html&gt;&lt;head&gt;&lt;title&gt;ServletSearch - Inclusão&lt;/title&gt;&lt;/head&gt;");
             buffer.append("&lt;font face=Arial size=2&gt;

");

String urlsite = "URL";/* request.getParameter("par_url");*/
             String titulo = "TITULO"; /* request.getParameter("par_titulo");*/
             String descricao = "DESCRICAO"; /*request.getParameter("par_descricao");*/
             String nome_responsavel = "NOME"; /*request.getParameter("par_nome");*/
             String email_responsavel = "EMAIL";/*request.getParameter("par_email");*/
             
             String query = new String();
             
             /*
              *Inserindo no Banco um resgistro
             */
             
             query ="insert into tbl_cadsites(urlsite, titulo, descricao, nome_responsavel, email_responsavel)";
             
             //Executa a Query mas não retorna nenhum valor
             
             stmt.executeUpdate(query);
             buffer.append("Dados cadastrados com sucesso!!&lt;br&gt;

");
}

} 

     catch(SQLException sql)
     {
         buffer.append("Ocorreu um erro na insercao do documento &lt;BR&gt;
“);

buffer.append(“Possivelmente a URL que vc está cadastrando  existe, faça uma busca!!”);

buffer.append(”<pre>Erro: “+ sql.toString() +”</pre>

");

}
//Incermenta o contador de visitas.
     int contador_local;
     synchronized(this)
     {
         contador_local = ++contador;
     }
     
     buffer.append("&lt;BR&gt;&lt;B&gt;&lt;A Href="http://iz:8080/&gt;&lt;/A&gt;&lt;/B&gt;");
     buffer.append("&lt;p&gt;&lt;table cols=3 width="50%" &gt;&lt;tr&gt;
“);

buffer.append(”<td NOWRAP><FONT face=Arial size=2> Voce e o visitante numero: </font></td>

“);

buffer.append(”<td NOWRAP BGCOLOR="#000000"><center><b><font face=Arial size=2>"+contador_local+"</font></td></center></b>

“);

buffer.append(”</body></html>");
/*
      *O método setContentLenght define o tamanho do conteudo que será enviado ao cliente.
     */
     
     response.setContentLength(buffer.length());
     response.getOutputStream().println(buffer.toString());
}


private static boolean checkForWarning(SQLWarning warn)
throws SQLException
{
    boolean rc = false;
    
    //Se um objeto SQLWarning for recebido, exibe as msgs de Warning.
    
    if (warn!=null)
    {
        System.out.println("
*** Warning ***

");

rc = true;
while(warn != null)
        {
            System.out.println("SQLState : "+ warn.getSQLState());
            System.out.println("Menssagem: "+ warn.getMessage());
            System.out.println("Vendor   : "+ warn.getErrorCode());
            System.out.println("");
            warn = warn.getNextWarning();
        }
    }
    
    return rc;
}



public String getServletInfo() {
    return "Servlet que implementa um site de busca.";
}

}

Paulo_Silveira

certo
mas qual eh o erro desta vez?

Guilherme_Silveira

como nos falamos anteriormente, o erro esta em primeiro chamar res.getWriter() e depois res.getOutputStream(). use somente o writer ou o outputstream. repara no seu codigo, no comeco ta o writer e no meio pro fim o outputstream.

Guilherme

I

Valeu caras obrigadão, em breve volto com mais dúvidas

iz

Criado 28 de setembro de 2002
Ultima resposta 30 de set. de 2002
Respostas 7
Participantes 4