Erro JSP

9 respostas
P

Boa noite!

Eu estou enfrentando o seguinte problema:

Eu quero listar os dados de um questionário em uma página JSP. Pra isso, eu estou usando o método getString da classe ResultSet. O código da classe DAO é o seguinte:

public ResultSet obterQuestoes(String questionario) {
        ResultSet resultado = null;
        Statement stmt = null;
        String sSQL = "";

        try {
            conectarBD();

            sSQL = "SELECT a.titulo, b.enunciado, c.peso FROM questionario a, questao b, ";
            sSQL = sSQL + "questionario_questao c WHERE a.id = c.questionario_id ";
            sSQL = sSQL + "AND b.id = c.questao_id AND a.id = ";
            sSQL = sSQL + questionario;

            stmt = CONEXAO.createStatement();
            resultado = stmt.executeQuery(sSQL);

            //stmt.close();
            //CONEXAO.close();
            return resultado;
        } catch (SQLException e) {
            System.out.println(e.getStackTrace());
        }
       return null;
    }

E essa é a página JSP de onde eu quero listar os dados:

<%
    QuestionarioDAO qDAO = new QuestionarioDAO();
    String[] questionarios;
    questionarios = request.getParameterValues("chk_escolha");

    if (questionarios != null) {
        for (int i = 0; i < questionarios.length; i++)
        {
            ResultSet resultado = qDAO.obterQuestoes(questionarios[i]);
            //out.println("<h3> Nome do question&aacute;rio: "+resultado.getString(0)+"</h3><br>");
            out.println(resultado.getString(1));
            resultado.close();
            resultado = null;
        }
    }
%>

E esse é o erro que aparece quando tento listar os dados:

org.apache.jasper.JasperException: Exception in JSP: /visualizar_exportar_questionario.jsp:20

17:         {
18:             ResultSet resultado = qDAO.obterQuestoes(questionarios[i]);
19:             //out.println("<h3> Nome do questionário: "+resultado.getString(0)+"</h3><br>");
20:             out.println(resultado.getString(1));
21:             resultado.close();
22:             resultado = null;
23:         }


Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:451)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

javax.servlet.ServletException
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774)
	org.apache.jsp.visualizar_005fexportar_005fquestionario_jsp._jspService(visualizar_005fexportar_005fquestionario_jsp.java:79)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

root cause

java.sql.SQLException
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
	com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
	com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528)
	com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448)
	org.apache.jsp.visualizar_005fexportar_005fquestionario_jsp._jspService(visualizar_005fexportar_005fquestionario_jsp.java:65)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.28 logs.

Os dados estão sendo sendo passados corretamente para a página.

Espero que alguém possa me ajudar. :roll:

Abraços.

9 Respostas

Laubstein_M_cio

Já tentou pegar o sql gerado e executar diretamente no seu banco? (ferramenta)

P

Laubstein, M?cio, já fiz isso, o SQL é executado corretamente quando eu faço a consulta diretamente no mySQL.

Eu já testei usando o isClosed() do ResultSet, mas ele sempre retorna falso. O problema é quando eu uso o getString.

Laubstein_M_cio

Se foi com o mesmo usuário beleza, então tente explorar, antes da linha que da pau, coloque um break point e também coloque o objeto resultado no “visualizador” da sua IDE, e tente olhar suas propriedades e executar os metodos por lá, assim você talvez identifique o erro mais rapidamente.

P

Depurando o programa, eu vi que a variável resultado recebe normalmente o valor do método obterQuestoes(). Mas quando eu uso o método getString(), “misteriosamente” a variável resultado perde o valor, e o depurador mostra a seguinte mensagem:

resultado = >"resultado" não é uma variável conhecida no contexto atual.<

Primeira vez que eu vejo essa mensagem. :shock:

Laubstein_M_cio

hehe, eu também nunca vi esse erro, qualquer outro método invocado desse objeto acredito que reproduzirá o mesmo erro ou não?

P

Olha, essa é uma das coisas que você faz funcionar e não entende como fez funcionar.

Eu usei o resultado.First() antes do método getString() e agora está funcionando que é uma beleza. O mais estranho ainda e que mesmo o método isClosed() retornando false, os métodos isFirst() e isLast() estavam retornando false.

Obrigado pela ajuda Laubstein, M?cio.

Laubstein_M_cio

Beleza, achei que o ponteiro estava na row certa desde o começo, bem, ate a proxima!

davidbuzatto

Um pouco atrasado, mas vou falar.
Vc sempre precisa posicionar o ponteiro de registros do ResultSet no primeiro registro antes de tentar fazer algo.

Quando vc obtém um ResultSet, ele vem dessa forma.

ResultSet --> ----------- | linha 1 | | linha 2 | | linha 3 | | linha 4 | | linha n | -----------
Então vc dá um next ou first no ResultSet e o ponteiro vai para o primeiro registro.

ResultSet ----------- --> | linha 1 | | linha 2 | | linha 3 | | linha 4 | | linha n | -----------

Ai sim vc pode começar a usá-lo.

P

valeu davidbuzatto.

Eu usei o método beforeFirst() pra testar, e realmente a minha lógica estava errada, porque eu queria pegar um registro com o ponteiro apontando pra nenhum campo.

Obrigado pela explicação.

Criado 14 de novembro de 2009
Ultima resposta 15 de nov. de 2009
Respostas 9
Participantes 3