Que erro é esse?

7 respostas
C

Pessoal,
Estou rodando uma consulta do banco oracle que verifica uma autenticacao retornando um campo numérico. Se a consulta for false ele gera o seguinte erro na minha página JSP:

java.lang.IllegalStateException: Cannot forward as OutputStream or Writer has already been obtained

Alguém tem idéia do que seja ?
[/b]

7 Respostas

Guilherme_Silveira

Oopps… tudo bom?
Seu erro nao tem nada a ve com o banco de dados.
Acontece que durante uma request via http, se vc envia os cabecalhos e algum texto pro cliente, vc nao pode pedir pra ele dar um FORWARD, q vc deve estar dando como o erro descreve.
Voce precisa entao:
ou acumular a saida toda antes de jogar na tela
ou dar um jeito de mudar esse forward para algo diferente

abraco

Gui

C

Guilherme,

Analisando melhor o código eu achei por bem tratar o erro direto na página jsp ao invés de deixar por conta da servlet. Uma vez que isso irá eliminar o erro dito anteriormente. Assim sendo a idéia é passar como sessão o meu objeto ResultSet para o jsp que irá verificar se é false, sendo, irá avisar ao usuário. Dessa forma a performance irá melhorar, pois não terei mais que fazer o método forward da classe RequestDispatcher.
Agradeço a ajuda,
João Paulo

Obs.: Eu tenho um amigo que mora em Colonia. Ele é alemão e trabalha como webdesigner.

Guilherme_Silveira

oia soh, galera q conhece galera de colonia
soh nao vai me dizer que o nome dele eh Nik pro favor pq eh o da nossa empresa :)…
e de onde c onhece ele?

gui

Paulo_Silveira

coloca o seu jsp pra gente

ou vc ta dando um foward/refresh (sendRedirect) ou ta pegando o poutputStream mais de uma vez

C

Desculpe o tamanho do código, mas quis mandar inteiro para ficar mais fácil de ser analisado. Dessa forma eu só consigo pegar da segunda linda da tabela em diante por causa do rs.next() estar sendo chamado duas vezes. Mas o outro erro está acontecendo no dispatcher.forward

Obrigado pela ajuda.

public void doPost(HttpServletRequest request, HttpServletResponse response)
  throws ServletException, IOException
  {
    String saida = request.getParameter("saida");
    HttpSession session = request.getSession(true);
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/resultado.jsp");

    Connection con=null;
    PreparedStatement pst=null;
    ResultSet rs=null;

    Vector resultado = new Vector();
    MontaResultado res = null;

    try
    {
      con = occi.getConnection();
      pst = con.prepareStatement(CONSULTA);
      pst.setString(1,saida);
      rs = pst.executeQuery();

    if (!rs.next())
    {
      session.setAttribute("erro","Número não encontrado");
      dispatcher = getServletContext().getRequestDispatcher("/consulta.jsp");
      dispatcher.forward(request,response);
    } else
      while(rs.next())
      {
          res = new MontaResultado();
          res.setTombamento(rs.getString("tombamento"));
          res.setMarca(rs.getString("marca"));
          res.setDescricao(rs.getString("descricao"));
          res.setSerie(rs.getString("n_serie"));

          resultado.add(res);
       }

      session.setAttribute("resultado",resultado);
      dispatcher.forward(request,response);
      rs.close();
      rs = null;
      pst.close();
      pst = null;

      } catch (Exception e)
      {
        System.out.println("ERRO NA CONSULTA");
        e.printStackTrace(System.out);
      }
      finally
      {
        try
        {
          con.close();
        } catch (Exception er)
          {
            System.out.println("NAO FOI POSSIVEL FECHAR O CON");
            er.printStackTrace(System.out);
          }
      }
  }
  private OracleConnectionCacheImpl occi = null;
  private OracleConnectionPoolDataSource ocpds = null;

  private static final String CONSULTA ="select tombamento,marca,descricao,"+
  "data_hora,n_serie from equipamento "+
  "where num_saida = ? "+
  "order by data_hora";
C

Paulo, consegui resolver o problema de uma maneira bem simples :

while(rs.next())

{

res = new MontaResultado();

res.setTombamento(rs.getString(1));

res.setMarca(rs.getString(marca));

res.setDescricao(rs.getString(descricao));

res.setSerie(rs.getString(n_serie));

result = rs.getString(1);
resultado.add(res);
 }


 session.setAttribute("result",result);

Criei uma variavel armazenando o primeiro campo do select. Depois passei na sessao e na minha pagina JSP tratei-a da seguinte forma:

<%@ page import=equipamentos.MontaResultado,java.util.Vector %>

<%

String result = (String)session.getAttribute(result);
if (result.equals(""))

{

%>

<jsp:forward page="/vazio.jsp" />

<%

} else

{

%>

Bom, como estou começando a entender melhor a plataforma J2EE até que ficou uma solução prática. Demorei mas consegui !

Obrigado !

Paulo_Silveira

eh isso ai

o faward tem de vir antes de qualquer html “cuspido”

Criado 26 de setembro de 2002
Ultima resposta 26 de set. de 2002
Respostas 7
Participantes 3