Tomcat 6 + MySQL Driver - Erro

11 respostas
S

Boa noite galera :)

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
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);
		}
	}
}
AdicionaContatoServlet.java
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>");
	}
}
ContatoDAO.java
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;
		}
	
	}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>Agenda</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
      <servlet>
  	<servlet-name>AdicionaContatoServlet</servlet-name>
  	<servlet-class>br.com.scarela.contato.servlet.AdicionaContatoServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>AdicionaContatoServlet</servlet-name>
  	<url-pattern>/adicionaContato</url-pattern>
  </servlet-mapping>
</web-app>

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

Exceção disparada

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.<init>(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.<init>(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.

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

Obrigado,
Renan.

11 Respostas

ViniGodoy

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

Tópico movido.

A

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

gRoOve

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.

A

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.

A

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("com.mysql.jdbc.Driver"); // &lt;-- você não informou o teu driver =S
                return DriverManager.getConnection("jdbc:mysql//localhost/fj21", "root", "root");  
            }  
            catch(SQLException e)  
            {  
                throw new RuntimeException(e);  
            }  
        }  
    }
S

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

A

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;
    }
}
S

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

A

Você está utilizando qual IDE?

S

Estou utilizando Eclipse Indigo

A

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 = "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;  
    }  
}

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

Criado 10 de maio de 2012
Ultima resposta 14 de mai. de 2012
Respostas 11
Participantes 4