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
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
cyber-shot
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
cyber-shot
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.
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{Stringsaida=request.getParameter("saida");HttpSessionsession=request.getSession(true);RequestDispatcherdispatcher=getServletContext().getRequestDispatcher("/resultado.jsp");Connectioncon=null;PreparedStatementpst=null;ResultSetrs=null;Vectorresultado=newVector();MontaResultadores=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);}elsewhile(rs.next()){res=newMontaResultado();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(Exceptione){System.out.println("ERRO NA CONSULTA");e.printStackTrace(System.out);}finally{try{con.close();}catch(Exceptioner){System.out.println("NAO FOI POSSIVEL FECHAR O CON");er.printStackTrace(System.out);}}}privateOracleConnectionCacheImplocci=null;privateOracleConnectionPoolDataSourceocpds=null;privatestaticfinalStringCONSULTA="select tombamento,marca,descricao,"+"data_hora,n_serie from equipamento "+"where num_saida = ? "+"order by data_hora";
C
cyber-shot
Paulo, consegui resolver o problema de uma maneira bem simples :