Problema com o driver do SQL quando gravar os dados. [RESOLVIDO]

Boa noite, estou resolvendo os exercicios do Caelum fj21 da página 78.
Estava tudo funcionando certinho, e de uma hora pra outra começou a não encontrar mais o driver do mysql, não sei o porque mesmo.
Estou apenas começando a aprender essas coisas, então ainda ta um pouco complicado encontrar os erros que aparecem.
O programa compila tudo certinho, abro a pagina no navegador com os formularios pra preenher, o erro acontece na hora de dar o submit nos dados preenchidos.
Eu adicionei já no classpath o driver do mysql. Acho que com os print e codigos abaixo alguem talvez vai saber o que está acontecendo.

Agradeço já, Obrigado.

Aqui está o erro que acontece logo após clicar no botão de submit da pagina com os dados nome, email e endereço.

Botei essa figura pra verem onde estão meus drivers do mysql e servlet:

[size=18]Aqui estão as classes que o programa possui:[/size]

Classe ConnectionFactory

package br.com.web.jdbc.dao;

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

public class ConnectionFactory {
	
	//Método que retorna uma nova conexão.
	public Connection getConnection() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
		try {
			return DriverManager.getConnection("jdbc:mysql://localhost:3306/WebExercicio-Pag_78", "root", "root");
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
}

classe ContatoDAO

package br.com.web.jdbc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import br.com.web.modelo.Contato;

public class contatoDAO {

	private Connection connection;
	
	public contatoDAO() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		this.connection = new ConnectionFactory().getConnection();
	}
	
	//Recebe um contato e adiciona no BD
	public void adiciona(Contato contato){
		String sql = "insert into contato" +
					 "(nome, email, endereco)" +
					 "values (?,?,?)";
		
		try{
			// prepared statement para inserção
			PreparedStatement stmt = connection.prepareStatement(sql);
			
			// seta os valores
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			
			stmt.execute();
			stmt.close();
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}

	
public void remove(Contato contato) throws SQLException{
		try{
		PreparedStatement stmt = connection.prepareStatement("delete from contato where nome=?");
		stmt.setString(1, contato.getNome());
		stmt.execute();
		stmt.close();
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}
}

Classe Contato

package br.com.web.modelo;

import java.util.Calendar;

public class Contato {

	private long id;
	private String nome;
	private String email;
	private String endereco;
	private Calendar dataNascimento;
	
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public Calendar getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(Calendar dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

}

Classe(Servlet) AdicionaContatoServlet

package br.com.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

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

import br.com.web.jdbc.dao.contatoDAO;
import br.com.web.modelo.Contato;

public class AdicionaContatoServlet extends HttpServlet{
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
			//busca o Writer
			PrintWriter out = response.getWriter();
			
			//buscando os parâmetros no request
			String nome = request.getParameter("nome");
			String endereco = request.getParameter("endereco");
			String email = request.getParameter("email");			
			
			//monta um objeto
			Contato contato = new Contato();
			contato.setNome(nome);
			contato.setEndereco(endereco);
			contato.setEmail(email);
						
			//Salva o contato
			contatoDAO dao = null;
			try {
				dao = new contatoDAO();
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			dao.adiciona(contato);
			
			out.println("<html>");
			out.println("<body>");
			out.println("Contato "+contato.getNome()+" adicionado com sucesso!");
			out.println("</body>");
			out.println("</html>");
			
			
	}
}

Coloca um Class.forName("com.mysql.jdbc.Driver"); na ConnectionFactory, que deve resolver o problema.

Na apostila ensina que agora não é mais preciso usar o Class.forName();
Usando o DriverManager.getConnection(); ja basta, tanto que realmente antes estava funcionando assim, como está o código… então esse não pode ser o problema.
Mas obrigado pela tentativa.

[quote=deiwys]Na apostila ensina que agora não é mais preciso usar o Class.forName();
Usando o DriverManager.getConnection(); ja basta, tanto que realmente antes estava funcionando assim, como está o código… então esse não pode ser o problema.
Mas obrigado pela tentativa.[/quote]

Quando eu estava estudando jdbc, pela apostila da caelum eu tinha um simples projeto JSE com um DAO funcionava normalmente, mas ai quando passei a utilizar a mesma estrutura para receber os dados de um formulário web com servlets ocorria esse mesmo erro que esta ocorrendo com você. Fiquei um tempão parado nos estudos por isso, até que coloquei o Class.forName("…"); e funcionou, tenta ai.

return DriverManager.getConnection("jdbc:mysql://localhost:3306/WebExercicio-Pag_78", "root", "root");  

mano sua base de dados se chama WebExercicio-Pag_78???

falow

douglas_arantes, eu botei o Class.forName("…"); só pra tirar a duvida mas nao deu tb… como eu falei, estava realmente funcionando antes sem isso, começou dar pau do nada, nao sei onde mexi, se é que mexi ou foi misticismo na programação hahaha :slight_smile:

marcelo.silva.java sim, meu banco se chama WebExercicio-Pag_78.

Voce tem como mostrar a MENSAGEM de erro que aparece pra voce e postar aqui no forum ? (10 linhas da mensagem ja ta otimo).

Uma dica: sempre faça um debug da sua aplicacao para tratar erros como esse, pois voce pode verificar o exato momento, ou linha, em que o sistema gera esse erro, e verificar com try-catch ou a olho nu mesmo.

Abraços.

mano…faz um favor coloca seu web.xml

falow

rof20004 O erro que acontece na hora que da o submit eu botei o print do browser la em cima no primeiro print.

marcelo.silva.java

O 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>WebExercicio-Pag_78</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>
  
  <error-page>
  	<exception-type>404</exception-type>
  	<location>/erro.html</location>
  </error-page>
  
  <servlet>
	<servlet-name>adicionaContato</servlet-name>
	<servlet-class>
		br.com.web.servlet.AdicionaContatoServlet
	</servlet-class>
  </servlet>

  <servlet-mapping>
	<servlet-name>adicionaContato</servlet-name>
	<url-pattern>/adicionaContato</url-pattern>
  </servlet-mapping>
  
</web-app>

Nao sei porque entao, mas nao ta dando pra clicar no print.

não ta conseguindo ver os print?

aqui vai o código do erro que sai no console do eclipse qualquer coisa.

SEVERE: Servlet.service() for servlet adicionaContato threw exception
java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/WebExercicio-Pag_72
	at br.com.web.jdbc.dao.ConnectionFactory.getConnection(ConnectionFactory.java:14)
	at br.com.web.jdbc.dao.contatoDAO.<init>(contatoDAO.java:14)
	at br.com.web.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:36)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:291)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/WebExercicio-Pag_72
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at br.com.web.jdbc.dao.ConnectionFactory.getConnection(ConnectionFactory.java:12)
	... 15 more

Ae, vlw =D

Entao mano, verifica as seguintes questoes:

  1. Voce tem o driver do mysql no seu projeto ? Ele precisa estar na pasta WebContent / WEB-INF / lib
  2. Que servidor voce esta utilizando ? Se for JBoss abaixo do 7, o seu driver precisa estar na pasta Jboss-X.X / server / default / lib
  3. Voce esta usando persistence.xml, hibernate.properties, hibernate.cfg.xml ? Qual deles ? Tem como postar aqui o conteudo ?

olha cara, hibernate e persistence nem sei ainda o que é ;x nao estudei isso ainda, e por enqnto no projeto nao apareceu…
servidor é o Apache, nao da pra ver mesmo o print que eu botei ali emcima? logo abaixo da msg “Botei essa figura pra verem onde estão meus drivers do mysql e servlet:”.

Servidor é Apache Tomcat v6.0 e mysql-connector-java-5.1.12-bin.jar o driver do mysql

Triste, pra mim so aparece um quadrado pequeno recortado.

Entao, mas a mensagem de erro indica que nao foi encontrado o driver do seu banco, esse ai mesmo, mysql-connector. Eu nunca usei o apache pra rodar minhas aplicacoes, no maximo usei o tomcat, e o que conheco bem e o JBoss do 6 pra baixo. Enfim, quando der dou uma verificada melhor pra tentar lhe ajudar, fica triste nao, uma hora alguem vem com uma solucao pra voce =D.

com certeza hehe valeu a todos por enqnto pela ajuda :slight_smile:

Voltei pra falar que encontrei o erro há um tempo atrás, vou falar pra caso alguém tenha algo parecido possa procurar por la também.

No meu caso o problema estava no arquivo XML… porque acabei copiando de uns projetos antigos os arquivos, drivers e tal e acabou que no inicio do projeto funcionou e la pelo meio dele deu problema… tinha linhas de códigos do projeto antigo no XML e por isso não estava encontrando coisas no projeto atual.

Espero ajudar alguém com isso. E agradeço a todos que tentaram me ajudar :smiley:

valeu galera, abraços a todos!

3 meses depois?

edita o tópico e coloca como resolvido

Só agora que tive tempo de ir atrás disso, não era prioridade haha, vou editar.

ainda bem que lembrou de voltar, para manter mais os tópicos organizados.
Tem aqueles que abandona o próprio tópico quando resolve o problema.
Parabens.
Vlw!