Problemas com consultas em sql no jsp?

23 respostas
S
Estou desenvolvendo uma aplicação em jsp que acessa um banco de dados mas na hora de imprimir em html no browser dis qua as variáveis não foram instanciadas. o código é:
<%@ page import="java.sql.*" %>
<%@ page import="java.lang.String"%>
<%
        
      Connection con = null;       

      try 
      {
          
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
       
          
          con = DriverManager.getConnection("jdbc:odbc:cliente");

          
          Statement consulta = con.createStatement();  
   
          
         String SQL = "Select codigo,data,nome,endereco,bairro,tel1,tel2,celular,cidade,uf,cep from clientes";

          
          ResultSet resultado = consulta.executeQuery(SQL);
   
          
          while(resultado.next())
          {

             // Os métodos getXXX recuperam os dados de acordo com o tipo SQL do dado:
             String codigo = resultado.getString("codigo");
             String data = resultado.getString("data");
             String nome = resultado.getString("nome");
             String endereco = resultado.getString("endereco");
             String bairro = resultado.getString("bairro");
             String telefone1 = resultado.getString("tel1");
	       String telefone2 = resultado.getString("tel2");
             String celular = resultado.getString("celular");
             String cidade = resultado.getString("cidade");
             String estado = resultado.getString("uf");
             String cep = resultado.getString("cep");

            

             }

     }
      catch(SQLException e) {e.printStackTrace(); }
      finally
      {
         try 
         {
            con.close();
         }
        catch(SQLException onConClose)
         {
             System.out.println("Houve erro no fechamento da conexão");
             onConClose.printStackTrace();
         }
      }
          
   
%>

<html>
<head>
<title>Clientes</title>
</head>

<body>
<table border="1" bgcolor="Silver">

<Tr>
<td>
<table bgcolor="Silver" bordercolor="Silver">
<tr>
	<td>Código:</TD>
	<td><h3><%=codigo%></h3></TD>
	<td><p align="right">Data:</p></TD>
	<td><h3><%= data %></h3></TD>
<tr>
<tr>
	<td>Nome:</TD>
	<td COLSPAN="4"><h3><%= nome %></h3></TD>
<tr>

	<td>Enderço:</TD>
	<td><h3><%= endereco %></h3></TD>
	<td>Bairro:</TD>
	<td><h3><%= bairro %></h3></TD>
</tr>
	
</tr>
<tr>
    <td>Tel1:</TD>
	<td><h3><%= telefone1 %></h3></TD>
	<td>Tel2:</TD>
	<td><h3><%= telefone2 %></h3></TD>	
</tr>
<tr>
	<td>Celular:</TD>
	<td><h3><%= celular %></h3></TD>	
	<td>Cidade:</TD>
	<td><h3><%= cidade %></h3></TD>
</TR>
<TR>
	<td>UF:</TD>
	<td><h3><%= estado %></h3></TD>
	<td>CEP:</TD>
	<td><h3><%= cep %></h3></TD>
</TR>
</table>
</td>
</tr>
</table>
<br><br><br><br>
<a href="javascript:history.back(-1)">voltar</a>
</body>
</body>
não entendo de onde vem o erro. Se puderem me ajudar eu agradeço. Valeu?

23 Respostas

wbsouza

Posta aí o erro que tá acontecendo.

De qualquer forma, encorajo vc a mudar de estratégia, pois o JSP deve ser somente uma camada de apresentação, sendo que o Acesso a banco de dados deveria ser por um bean da camada de negócio (DAO).

Pesquise um pouco a respeito de MVC para que vc faça uma aplicação mais profissional.

[]s, Welington B. Souza

S
Tem dados na base de dados e o engraçado é que seu digitar o nome do arquivo que faz as consultas ele me dá um retorno nulo nos campos em que quero o resultado da consulta e se eu for na pagina principal e clicar em consulta ele dá este erro:
JSP Error


Exceção:

java.lang.NullPointerException
	at _teste._jspService(_teste.java, Compiled Code)
	at oracle.jsp.runtime.HttpJsp.service(HttpJsp.java)
	at oracle.jsp.app.JspApplication.dispatchRequest(JspApplication.java)
	at oracle.jsp.JspServlet.doDispatch(JspServlet.java)
	at oracle.jsp.JspServlet.internalService(JspServlet.java, Compiled Code)
	at oracle.jsp.JspServlet.service(JspServlet.java)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:588)
	at org.apache.jserv.JServConnection.processRequest(JServConnection.java)
	at org.apache.jserv.JServConnection.run(JServConnection.java)
	at java.lang.Thread.run(Thread.java:479)
S
O código postado mudou pra:
<%@ page import="java.sql.*" %>
<%@ page import="java.lang.String"%>
<%

         String codigo = "", data = "", nome ="", endereco = "", bairro = "", 
		  telefone1 = "", telefone2 = "", celular = "", cidade = "", estado = "", cep = "";
		 Connection con = null;       

      try 
      {
          
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
       
          
          con = DriverManager.getConnection("jdbc:odbc:cliente");

          
          Statement consulta = con.createStatement();  
   
          
         String SQL = "Select codigo,data,nome,endereco,bairro,tel1,tel2,celular,cidade,uf,cep from clientes";

          ResultSet resultado = consulta.executeQuery(SQL);
   
          while(resultado.next())
          {
		     if(true){
             // Os métodos getXXX recuperam os dados de acordo com o tipo SQL do dado:
             codigo = resultado.getString("codigo");
             data = resultado.getString("data");
             nome = resultado.getString("nome");
             endereco = resultado.getString("endereco");
             bairro = resultado.getString("bairro");
             telefone1 = resultado.getString("tel1");
	         telefone2 = resultado.getString("tel2");
             celular = resultado.getString("celular");
             cidade = resultado.getString("cidade");
             estado = resultado.getString("uf");
             cep = resultado.getString("cep");
			 }
			 else {con.close();}
            }

     }
      catch(SQLException e) {e.printStackTrace(); }
      finally
      {
         try 
         {
            con.close();
         }
        catch(SQLException onConClose)
         {
             System.out.println("Houve erro no fechamento da conexão");
             onConClose.printStackTrace();
         }
      }
          
   
%>

<html>
<head>
<title>Clientes</title>
</head>

<body>
<table border="1" bgcolor="Silver">

<Tr>
<td>
<table bgcolor="Silver" bordercolor="Silver">
<tr>
	<td>Código:</TD>
	<td><h3><%=codigo%></h3></TD>
	<td><p align="right">Data:</p></TD>
	<td><h3><%= data %></h3></TD>
<tr>
<tr>
	<td>Nome:</TD>
	<td COLSPAN="4"><h3><%= nome %></h3></TD>
<tr>

	<td>Enderço:</TD>
	<td><h3><%= endereco %></h3></TD>
	<td>Bairro:</TD>
	<td><h3><%= bairro %></h3></TD>
</tr>
	
</tr>
<tr>
    <td>Tel1:</TD>
	<td><h3><%= telefone1 %></h3></TD>
	<td>Tel2:</TD>
	<td><h3><%= telefone2 %></h3></TD>	
</tr>
<tr>
	<td>Celular:</TD>
	<td><h3><%= celular %></h3></TD>	
	<td>Cidade:</TD>
	<td><h3><%= cidade %></h3></TD>
</TR>
<TR>
	<td>UF:</TD>
	<td><h3><%= estado %></h3></TD>
	<td>CEP:</TD>
	<td><h3><%= cep %></h3></TD>
</TR>
</table>
</td>
</tr>
</table>
<br><br><br><br>
<a href="javascript:history.back(-1)">voltar</a>
</body>
</body>
Leandro_Rangel_Santo

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();

não tinha que tar retornando uma referencia pra algum lugar ?

S

Como algum lugar? Nesta linha não é só pra carregar um driver? Acha que deve colocar o endereço da base de dados aí? Como colocar?

cv1

“Leandro Rangel Santos”:
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();

não tinha que tar retornando uma referencia pra algum lugar ?

Nao, é só instanciar e ele já se configura - bizarro isso, aliás… não faça igual no seu código sem a supervisão de um adulto :smiley:

Leandro_Rangel_Santo

3 camadas é aonda
separa isso ai que a manutanção do codigo vai ser bem mais facil

fora que o nullpointer quando é capturado la no jsp ,ele não mostra corretamente onde foi o erro

S

Concordo plenamente chará! Mas como fazer quando o código tiver que retornar um valhor pra página html? no caso está tudo junto e é só declarar as vareáveis que quero no html, se eu separar o html como carregar as variáveis? instanciando objetos como no java compilado? E este erro que está dando? Será que estou ficando louco? :oops:

Leandro_Rangel_Santo

facil e rapido ,usa javaBeans
você usa o bean para fazer a consulta sql ,coloca os valores que te interessa em atributos ,e pega os atributos no jsp ,ai você separa logica de negocio da interfaçe

S

E este pau na consulta? Como faço? Como posso debugar pra ver onde está o erro?

Leandro_Rangel_Santo

normalmente o printStackTrace do nullPointerException diz a linha onde ocorreu o erro
mas como ele ta sendo processado no jsp ,são outros 500
vc pode ir colocando debugs no codigo pra ver ate onde ele vai

S

consegui fazer a pagina parar de dar erro, só que agora ela não retorna os valores da consulta, volta tudo em branco. O código ficou assim:

<%@ page import="java.sql.*" %>
<%

        String codigo = "", data = "", nome ="", endereco = "", bairro = "",
        telefone1 = "", telefone2 = "", celular = "", cidade = "", estado = "", cep = "";
        
        String url = "jdbc:odbc:clientes";        
        Connection con;       
        
        try{
            Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ).newInstance();   
            con = DriverManager.getConnection(url);
            System.out.println("CONEXAO: " + con);
            Statement consulta = con.createStatement(); 
            System.out.println("STATEMENT: " + con);
            
            String SQL = "Select codigo,data,nome,endereco,bairro,tel1,tel2,celular,cidade,uf,cep from clientes";
            ResultSet resultado = consulta.executeQuery(SQL);
            
            while(resultado.next()){
                codigo = resultado.getString("codigo");
                data = resultado.getString("data");
                nome = resultado.getString("nome");
                endereco = resultado.getString("endereco");
                bairro = resultado.getString("bairro");
                telefone1 = resultado.getString("tel1");
                telefone2 = resultado.getString("tel2");
                celular = resultado.getString("celular");
                cidade = resultado.getString("cidade");
                estado = resultado.getString("uf");
                cep = resultado.getString("cep"); 
            }  
        } 
        catch(SQLException e) {e.printStackTrace(); } 
        catch(ClassNotFoundException ex) {ex.printStackTrace();} 
        catch(InstantiationException ie) {ie.printStackTrace();}
        catch(IllegalAccessException iae) {iae.printStackTrace();}
        
        System.out.println(codigo+" "+data+" "+nome+" "+endereco+" "
        +bairro+" "+telefone1+" "+telefone2+" "+celular+" "+cidade+" "+estado+" "+cep);

%>
<html>
<head>
<title>Clientes</title>
</head>

<body>
<table border="1" bgcolor="Silver">

<Tr>
<td>
<form>
<table bgcolor="Silver" bordercolor="Silver">
<tr>
	<td>Código:</TD>
	<td><h3><input type="text" name="cod" value="<%=codigo%>" size="04"></h3></TD>
	<td><p align="right">Data:</p></TD>
	<td><h3><input type="text" name="data" value="<%= data %>" size="04"></h3></TD>
<tr>
<tr>
	<td>Nome:</TD>
	<td COLSPAN="4"><h3><input type="text" name="name" value="<%= nome %>" size="59"></h3></TD>
<tr>

	<td>Enderço:</TD>
	<td><h3><input type="text" name="end" value="<%= endereco %>"></h3></TD>
	<td>Bairro:</TD>
	<td><h3><input type="text" name="bairro" value="<%= bairro %>"></h3></TD>
</tr>
	
</tr>
<tr>
    <td>Tel1:</TD>
	<td><h3><input type="text" name="tel1" value="<%= telefone1 %>"></h3></TD>
	<td>Tel2:</TD>
	<td><h3><input type="text" name="tel2" value="<%= telefone2 %>"></h3></TD>	
</tr>
<tr>
	<td>Celular:</TD>
	<td><h3><input type="text" name="cel" value="<%= celular %>"></h3></TD>	
	<td>Cidade:</TD>
	<td><h3><input type="text" name="city" value="<%= cidade %>"></h3></TD>
</TR>
<TR>
	<td>UF:</TD>
	<td><h3><input type="text" name="uf" value="<%= estado %>"></h3></TD>
	<td>CEP:</TD>
	<td><h3><input type="text" name="cep" value="<%= cep %>"></h3></TD>
</TR>
</table>
</form>
</td>
</tr>
</table>
<br><br><br><br>
<a href="javascript:history.back(-1)">voltar</a>
</body>
</body>

Se eu separar o html, como faço para que o formulário reconheça as variáveis no html? O que tenho que mudar pra conectar uma base de dados oracle8i?

wbsouza

No JSP é meio chato mesmo o debug. Mais um ponto a vavor para separar a sua aplicação da camada de apresentação.

Voltando ao seu codigo, o erro pode ser em diversos pontos. Procure pegar a dependência de objetos. Por exemplo no trecho que executa o SQL. verifique se o objeto é null antes de passar para o proximo passo.

como por exemplo:

... ... ... con = DriverManager.getConnection(url); if (con != null) { Statement consulta = con.createStatement(); if (consulta != null) { String SQL = "Select codigo,data,nome,endereco,bairro,tel1,tel2,celular,cidade,uf,cep from clientes"; ResultSet resultado = consulta.executeQuery(SQL); if (resultado != null) { while(resultado.next()){ codigo = resultado.getString("codigo"); data = resultado.getString("data"); nome = resultado.getString("nome"); endereco = resultado.getString("endereco"); bairro = resultado.getString("bairro"); telefone1 = resultado.getString("tel1"); telefone2 = resultado.getString("tel2"); celular = resultado.getString("celular"); cidade = resultado.getString("cidade"); estado = resultado.getString("uf"); cep = resultado.getString("cep"); } else System.out.println("resultado igual a null"); } else System.out.println("consulta igual a null"); } else System.out.println("con igual a null"); ... ... ...

[]s, Welington B. Souza

S

Como aplicação stand alone o código funciona perfeitamente, o resultado do select é impresso e tudo mais, só que quando coloco no jsp as variáveis que chamei dentro do form do html não carregam nenum valor. Se eu ver o source pelo browser o campo value aparece assim: value = “”. Também quero separar meu código, mas como faço pra apresentar, por exemplo, o resultado deste select numa pagina html independente do arquivo jsp? Pode me dar um exemplo? Valeu pela ajuda galera! Desculpe incomodar mas poreciso aprender isso! :smiley:

wbsouza
  1. Não use este metodo de acesso a banco de dados para internet. Estude um pouco de Pooling de conexões. Hoje praticamente todo WebContainer tem suporte para isto através de DataSources. A idéia é a seguinte: vc terá uma coleção de conexões prontas para serem usadas, eliminando assim o overread causado pela criação conexão sob demanda e posterior destruição (é um processo muito custoso).

  2. Crie uma servlet que receba as requisições. Esta servlet irá acionar a camada de negócio (java beans). Os beans que precisarem acessar dados, solicitarão uma conexão para o Pool, usarão esta conexão para obter os dados necessários e populam o bean que será exibido na camada de apresentação (também pode ser uma coleção de beans que representam os seus registros “value objects”). Após este trabalho, basta setar um atributo na sessão do usuário e fazer um forward para a camada de apresentação (para um JSP)

  3. do JSP vc irá consultar os objetos que foram setados pelo processo anterior, e exibí-los da maneira apropriada.

E goooooooooool !

Sua aplicação internet no modelo MVC. Não deixe de ler a respeito deste padrão! Depois que vc tiver já familiarizado com esta estrutura, será super tranquilo partir para uma Struts ou algo parecido.

[]s, Welington B. Souza

S

Tá web, só não vizualizo a forma com que minah pagina irá apresentar as variaveis na tela sem o html estar colado com o código, e pro favor me responda, proque não consigu imprimir o resultado de minha consulta na tela? :cry: o qeu est’;a errado com meu código atualmente? :cry:
por enquanto isto é mais importante do que tudo! :cry: Me ajude por favor!

Leandro_Rangel_Santo

o que apareceu nesse seu debug ?

S

Na Página isso não é usado. Esqueci de tirar na hora de postar, mas quando uso no debug ele imprime o que está no banco de dados, naturalmente. Pelo que percebi, não há comunicação emtre o código e o html. Não tem nenhuma tag que tenho que por no html pra eu vizualizar o resultado?

Só lembrando que neste caso quero fazer uma persquisa no banco de dados e mostrar no html abaixo do código. :cry:

Leandro_Rangel_Santo

tente declarar essas strings que vc ta chamando fora do scriptlet que vc ta fazendo a consulta
fazendo dentro de um <%! … %>

S

É meu caro, não deu certo. Estou quase desistindo. Acho que vou comprar o livro “Tudo o que Você Queria Saber Sobre JSP” FERNANDO ANSELMO Visual Books . Já leu este livro? Se não aprovar conhece algum em protuguês e bem prático?

wbsouza

Só uma dúvida. Que container vc está usando?

Por acaso não é o JServ? Se for, este não é o melhor pra vc que tá começando.

Experimente usar um TomCat ou Resin que lhe dará mais retorno. Se vc precisa realmente debugar o JSP :cry: , existe um plugin para o eclipse que faz este papel se vc tiver usando o Resin como container.

[]s, Welington B. Souza

S

Eu estou usando o container que vem junto do apache no oracle8i. Instalei o SGBD e de quebra ele instalou o webserver. O resin não consegui configura-lo. O tomcat acontece o mesmo. Tipo tive vendo este negócio de java bens que parece que vai fazer meu projeto decolar. O código que escrevi está assim:

import javax.servlet.*;
 import javax.servlet.http.*;
 import java.text.*;
 import java.io.*;
 import java.util.*;
 import java.sql.*;
 public class Cliente extends HttpServlet &#123;
     
     public String url = "jdbc&#58;odbc&#58;clientes";        
     public Connection con;
     
     public void doPost&#40; HttpServletRequest request, HttpServletResponse response &#41;
     throws ServletException, IOException&#123;
         
         try&#123;
             Class.forName&#40; "sun.jdbc.odbc.JdbcOdbcDriver" &#41;.newInstance&#40;&#41;;   
             con = DriverManager.getConnection&#40;url&#41;;
             System.out.println&#40;"CONEXAO&#58; " + con&#41;;
             Statement consulta = con.createStatement&#40;&#41;; 
             System.out.println&#40;"STATEMENT&#58; " + con&#41;;
             String SQL = "Select codigo,data,nome,endereco,bairro,tel1,tel2,celular,cidade,uf,cep from clientes";
             ResultSet resultado = consulta.executeQuery&#40;SQL&#41;;
             
             List linhas = new ArrayList&#40;&#41;;
             while&#40;resultado.next&#40;&#41;&#41;&#123;
                 
                 String&#91;&#93; colunas = new String&#91;11&#93;; 
                 colunas&#91;0&#93; = resultado.getString&#40;"codigo"&#41;;
                 colunas&#91;1&#93; = resultado.getString&#40;"data"&#41;;
                 colunas&#91;2&#93; = resultado.getString&#40;"nome"&#41;;
                 colunas&#91;3&#93; = resultado.getString&#40;"endereco"&#41;;
                 colunas&#91;4&#93; = resultado.getString&#40;"bairro"&#41;;
                 colunas&#91;5&#93; = resultado.getString&#40;"tel1"&#41;;
                 colunas&#91;6&#93; = resultado.getString&#40;"tel2"&#41;;
                 colunas&#91;7&#93; = resultado.getString&#40;"celular"&#41;;
                 colunas&#91;8&#93; = resultado.getString&#40;"cidade"&#41;;
                 colunas&#91;9&#93; = resultado.getString&#40;"uf"&#41;;
                 colunas&#91;10&#93; = resultado.getString&#40;"cep"&#41;; 
                 linhas.add&#40;colunas&#41;;                 
             &#125; 
              
         &#125;
         catch&#40;SQLException e&#41; &#123;e.printStackTrace&#40;&#41;; &#125; 
         catch&#40;ClassNotFoundException ex&#41; &#123;ex.printStackTrace&#40;&#41;;&#125; 
         catch&#40;InstantiationException ie&#41; &#123;ie.printStackTrace&#40;&#41;;&#125;
         catch&#40;IllegalAccessException iae&#41; &#123;iae.printStackTrace&#40;&#41;;&#125;
     &#125;
 &#125;

Como usar bens neste código?

wbsouza

O JServ (container que vem com o Oracle) é ultrapassado para esta finalidade, instale um container mais moderno, ou que pelo menos seja padrão para JSP/Servlets. O JServ não é!

A respeito de configuração do Tomcat, aqui no GUJ tem um tutorial que trata do assunto em http://www.guj.com.br/servlet/guj?PARSE=true&MAMUTE_ACTION=br.com.guj.action.ListTutorial&MAMUTE_TEMPLATE=ShowTutorial&LIST_TUTORIAL=single&TutorialId=9&PAGE=1

Não vejo dificuldades em configurá-lo, basta ler o manual e fazer o que manda. Praticamente vc precisa somente instalar o JDK (tudo bem com java isto já é obrigatório), rodar o instalador se tiver no windows (next, next, finish) ou descompactar o download em um diretório. Depois setar a variável de ambiente JAVA_HOME e CATALINA_HOME e pronto.

A única diferença é que vc vai acessar o Tomcat usando http://localhost:8080

Qual a dificuldade nisso?

Amigo, é preciso pesquisar um pouco, caso contrário vc ficará igual a uma mosca no vidro. Não consegue avançar, ou avança muito lentamente.

Leia primeiro este tutorial, que ele vai te resolver alguns problemas. Depois que estiver tranquilo no assunto, leia alguma coisa de JDBC, depois MVC, e por aí vai …

Vá estudando e montando seus projetos na medida do possível.

Não dá pra passar o carro na frente dois bois.

Me desculpe a bronca, mas este post está se estendendo muito e sem avanços!

[]s, Welington B. Souza

Criado 9 de setembro de 2003
Ultima resposta 12 de set. de 2003
Respostas 23
Participantes 4