Tomcat 6 + MySQL Driver - Erro

Boa noite galera :slight_smile:

Estou aprendendo a desenvolver em Java para web, utilizando a apostila FJ21 da Caelum.

Estou seguindo o exercício da agenda, porém não estou conseguindo fazer a conexão com o banco, uma vez que ele sempre dispara a exceção informando que o driver não foi encontrado.

Segue o código:

ConnectionFactory.java

[code]package br.com.scarela.contato.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
public Connection getConnection()
{
try
{
return DriverManager.getConnection(“jdbc:mysql//localhost/fj21”, “root”, “root”);
}
catch(SQLException e)
{
throw new RuntimeException(e);
}
}
}
[/code]

AdicionaContatoServlet.java

[code]package br.com.scarela.contato.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.scarela.contato.dao.ContatoDAO;
import br.com.scarela.contato.model.Contato;

public class AdicionaContatoServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();

	String nome = request.getParameter("nome");
	String endereco = request.getParameter("endereco");
	String email = request.getParameter("email");
	String dataEmTexto = request.getParameter("dataNascimento");
	Calendar dataNascimento = null;
	
	try
	{
		Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);
		dataNascimento = Calendar.getInstance();
		dataNascimento.setTime(date);
	} catch(ParseException e)
	{
		out.println("Erro de conversão de data");
		return;
	}
	
	Contato contato = new Contato();
	contato.setNome(nome);
	contato.setEmail(email);
	contato.setEndereco(endereco);
	contato.setDataNascimento(dataNascimento);
	
	ContatoDAO dao = new ContatoDAO();
	/*
	dao.addContato(contato);
	*/
	out.println("<html>");
	out.println("<body>");
	//out.println("Contato " + contato.getNome() + " adicionado com sucesso");
	out.println("</body>");
	out.println("</html>");
}

}
[/code]

ContatoDAO.java

[code]package br.com.scarela.contato.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.sql.Date;
import java.util.List;

import br.com.scarela.contato.model.Contato;

public class ContatoDAO {

private Connection connection;
//
public ContatoDAO()
{
	this.connection = new ConnectionFactory().getConnection();
}
//
public void addContato(Contato contato)
{
	String sql = "insert into contatos (nome,email,endereco,dataNascimento) values (?,?,?,?)";
	//
	try
	{
		
		PreparedStatement stmt = connection.prepareStatement(sql);
		// preenche os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
		// executa
		stmt.execute();
		stmt.close();
		System.out.println("Gravado!");
		connection.close();
	}
	catch(SQLException e)
	{
		throw new RuntimeException(e);
	}
}

//
public List<Contato> getLista() {
	try {
	List<Contato> contatos = new ArrayList<Contato>();
	PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
	ResultSet rs = stmt.executeQuery();
	while (rs.next()) {
	// criando o objeto Contato
		Contato contato = new Contato();
		contato.setId(rs.getLong("id"));
		contato.setNome(rs.getString("nome"));
		contato.setEmail(rs.getString("email"));
		contato.setEndereco(rs.getString("endereco"));
				// montando a data através do Calendar
		Calendar data = Calendar.getInstance();
		data.setTime(rs.getDate("dataNascimento"));
		contato.setDataNascimento(data);
			// adicionando o objeto à lista
		contatos.add(contato);
		rs.close();
		stmt.close();
		return contatos;
	}}
	catch (SQLException e) {
		 throw new RuntimeException(e);
		 }
	return null;
	}

}[/code]

web.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

Agenda

index.html
index.htm
index.jsp
default.html
default.htm
default.jsp

  <servlet>
<servlet-name>AdicionaContatoServlet</servlet-name>
<servlet-class>br.com.scarela.contato.servlet.AdicionaContatoServlet</servlet-class>
AdicionaContatoServlet /adicionaContato [/code]

O jar mysql-connector-java-5.1.15-bin.jar está devidamente na pasta WEB-INF/lib

Exceção disparada

[code]exception

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
br.com.scarela.contato.dao.ConnectionFactory.getConnection(ConnectionFactory.java:17)
br.com.scarela.contato.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.scarela.contato.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
java.sql.DriverManager.getConnection(Unknown Source)
java.sql.DriverManager.getConnection(Unknown Source)
br.com.scarela.contato.dao.ConnectionFactory.getConnection(ConnectionFactory.java:13)
br.com.scarela.contato.dao.ContatoDAO.(ContatoDAO.java:20)
br.com.scarela.contato.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:48)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.
[/code]

Podem me dizer, por favor, o que estou fazendo de errado?

Obrigado,
Renan.

E você abriu o tópico em Java Básico ao invés de desenvolvimento web… por que?

Tópico movido.

você não adicionou o driver do mysql para a conexão.
Baixe este link do mysql.com do conector j e importe para a pasta WEB-INF/lib do teu projeto que deve funcionar

Funciona apenas colocando o driver mysql dentro do diretório WEB-INF/lib? Não teria que adicionar ao classpath?

Pergunto isso, pois o Scarela já fez este procedimento.

se você estiver utilizando o eclipse, em algumas vesrões, sim é necessário adicionar ele ao classpath, em outras não, porque ao rodar o projeto ele enxergará a pasta lib to web-inf, e consequentemente, utilizará o driver. No caso do novo eclipse, o indigo, eu já vi que não funciona desta forma, você tem ele adicionado ao lib e ao path do projeto. Então, como não sei qual versão ela está utilizando, inclua o jar no build-path que deve funcionar também.

Hmmmmmmmmm, aqui está o possível erro:

    package br.com.scarela.contato.dao;  
      
    import java.sql.Connection;  
    import java.sql.DriverManager;  
    import java.sql.SQLException;  
      
      
      
    public class ConnectionFactory {  
        public Connection getConnection()  
        {  
            try  
            {  
                Class.forName(&quot;com.mysql.jdbc.Driver&quot;); // &lt;-- você não informou o teu driver =S
                return DriverManager.getConnection(&quot;jdbc:mysql//localhost/fj21&quot;, &quot;root&quot;, &quot;root&quot;);  
            }  
            catch(SQLException e)  
            {  
                throw new RuntimeException(e);  
            }  
        }  
    }  

Na realidade, já tentei incluir o driver de diversas formas. Já tentei colocá-lo no WEB-INF/lib, já tentei colocá-lo no build-path, diretamente no .classpath, mas nenhum deles deu resultado…é sempre o mesmo erro =S

@andre.froes

Class.forName("com.mysql.jdbc.Driver"); // <-- você não informou o teu driver =S  

Originalmente, no código passado na apostila, não havia esta linha. Eu a acrescentei, pois dei uma pesquisada e disseram que poderia resolver, mas também não obtive resultados =S

Essa daqui é teste de conexão que acabei de criar para fazer o teste, ta funcionando 100%

package br.com.scarela.con;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConDB
{

    private static final String URL = "jdbc:mysql://localhost:3306/scarela";
    private static final String USER = "root";
    private static final String PASSWORD = "sempass";
    Connection conn;
    
    public Connection getConexao()
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return conn;
    }
}

André,

Testei novamente, utilizando o código que você passou. O erro foi o mesmo, acusando que não foi possível encontrar o driver =s

Você está utilizando qual IDE?

Estou utilizando Eclipse Indigo

Clica com o botão direito em cima do teu projeto, vai em Build Path > Configure Build Path…
Confere se na lista que você está vendo agora, consta o mysql-connector-java-x.x.x-bin.jar
caso não exista, vá em Add External JARs… e aponte para o driver

não sei como você está utilizando a classe para chamar a conexão, vou colocar um exemplo.
Julgando que você tenha a conexão que eu te passei, a classe operação e o bean no mesmo pacote (não recomendável, apenas para exemplo);

package br.com.scarela.con;  
  
import java.sql.Connection;  
import java.sql.DriverManager;  
  
public class ConDB  
{  
  
    private static final String URL = &quot;jdbc:mysql://localhost:3306/scarela&quot;;  
    private static final String USER = &quot;root&quot;;  
    private static final String PASSWORD = &quot;sempass&quot;;  
    Connection conn;  
      
    public Connection getConexao()  
    {  
        try  
        {  
            Class.forName(&quot;com.mysql.jdbc.Driver&quot;).newInstance();  
            conn = DriverManager.getConnection(URL, USER, PASSWORD);  
        }  
        catch(Exception e)  
        {  
            e.printStackTrace();  
        }  
        return conn;  
    }  
} 

Conectando no banco e trazendo dados da tabela "tabela" que tem um id inteiro e um nome String

package br.com.scarela.con;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;


public class Operacao
{

    ConDB db;
    Connection con;

    public Operacao()
    {
        db = new ConDB();//ao chamar a classe operação, db receberá uma nova conexão
    }

    public List&lt;UmaClasse&gt; getListaDeUmaTabela()
    {
        List&lt;UmaClasse&gt; lista = new ArrayList&lt;UmaClasse&gt;();//lista que será populada para ser recuperada
        con = db.getConexao();//conectando no banco de dados pela conexão criada e armazena a conexão na variável con
        String sql = "select * from tabela";//essa é a query que será executada
        try
        {
            ResultSet rs = con.createStatement().executeQuery(sql);//executa a query e armazena os resultado no rs
            while(rs.next() ) //enquanto tiver algum registro no ResultSet, execute o que vem a seguir
            {
                UmaClasse uc = new UmaClasse();//instanciei UmaClasse que é um bean da tabela
                uc.setId(rs.getInt("id"));//vinculei o resultado do rs com o nome id no atributo do bean id
                uc.setNome(rs.getString("nome"));//idem anterior
                lista.add(uc);//adicionei à lista que será recuperada
            }

        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        return lista;//retorna a lista para você trabalhar com ela
    }
}

bean UmaClasse

package br.com.scarela.con;

public class UmaClasse {

    private int id;
    private String nome;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
}

no teu mysql crie um banco de dados com o nome scarela e dentro dele uma tabela com o nome “tabela” crie um campo id com preenchimento automático e um campo nome como String, e rode o exemplo
deixei bem comentado, você pode ver o que acontece no decorrer