Cass.forName: Nâo estou conseguindo conectar no Banco de Dados

public class ConnectionFactory {

public Connection getConnection() throws ClassNotFoundException{
	
	try {
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection("jdbc:mysql://localhost/fj21?useSSL=false","root","LuizPedro1980");
		}catch (SQLException e) {
			
			throw new RuntimeException(e);
		}
	}


}

Oi pessoal, estou fazendo curso de Java Web pela Caelum e quando tento conectar ao BD usando este método acima, de acordo como abordado e testado com êxito em sala e tento inserir dados, não consigo efetividade. Diga de passagem que o driver MySql não apresenta problemas, pois só apresenta problema quando uso o TomCat. O documento HTML não apresenta erro e diz que o dado foi cadastrado, mas na verdade não foi, O console do Server apresenta os seguintes erros abaixo. Se alguém puder me ajudar, ficarei muito agradecido.

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1928)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1771)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at br.com.caelum.servlet.ConnectionFactory.getConnection(ConnectionFactory.java:12)
at br.com.caelum.servlet.ContatoDao.(ContatoDao.java:17)
at br.com.caelum.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:1025)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1139)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

Você colocou o jar do MySQL no classpath do teu projeto?

Sim, coloquei perfeitamente, Não é atoa que que sem o Tom cat e sem a implementação do class.forName , o projeto funciona

Então me explica o erro apresentado, fera.
O erro é extremamente claro ao dizer que não encontrou a classe.
Creio que você precisa rever todos os passos.

Vamos aos passos então, já revi esses códigos várias vezes:

<head>

<meta charset="ISO-8859-1">

	<title>Formulário</title>

</head>

<body>

	<h1>Adiciona Contatos</h1>
	
	<hr />
	
	<form action="adicionaContato">
	
		Nome: <input type=text name="nome" /><br />
		E-mail: <input type=text name="email" /><br />
		Endereço: <input type=text name="endereco" /><br />
		Data Nascimento: <input type=text name="dataNascimento" /><br />
		<input type="submit" value="gravar" />
	
	</form>
	
</body>

package br.com.caelum.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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/adicionaContato")
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.setEndereco(endereco);
	contato.setEmail(email);
	contato.setDataNascimento(dataNascimento);
	
	ContatoDao dao;
	try {
		dao = new ContatoDao();
		dao.adiciona(contato);
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	 
		// TODO Auto-generated catch block
	
	
	
	
	out.println("<html>");
	out.println("<body>");
	out.println("Contato " + contato.getNome()+" adicionado com sucesso");
	out.println("</body>");
	out.println("</html>");
	
}

}

ackage br.com.caelum.servlet;

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

public class ContatoDao {

private Connection connection;

public ContatoDao() throws ClassNotFoundException {
	this.connection = new ConnectionFactory().getConnection();
}

public void adiciona(Contato contato) {
	
	String sql = "insert into contatos" + "(nome,email,endereco,dataNascimento)" + "values (?,?,?,?)";
	
	try {
		
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		
		stmt.setString(1, contato.getNome());
	    stmt.setString(2, contato.getEmail());
	    stmt.setString(3, contato.getEndereco());
	    stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
	    
	    stmt.execute();
	    stmt.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()){
		
		Contato contato = new Contato();
		contato.setId(rs.getLong("id"));
		contato.setNome(rs.getString("nome"));
		contato.setEmail(rs.getString("email"));
		contato.setEndereco(rs.getString("endereco"));
		
		Calendar data = Calendar.getInstance();
		data.setTime(rs.getDate("dataNascimento"));
		contato.setDataNascimento(data);
		
		contatos.add(contato);
	}
	
	rs.close();
	stmt.close();
	return contatos;
	}catch (SQLException e) {
		
		throw new RuntimeException(e);
	}
}

public Contato pesquisar(Long id) {
	
	String sql = "select * from contatos where id = ?";
	try {
	
	PreparedStatement stmt = this.connection.prepareStatement(sql);
	stmt.setLong(1,id);
	ResultSet rs = stmt.executeQuery();
	Contato contato = new Contato();
	
	
	while(rs.next()) {
		
		
		contato.setId(rs.getLong("id"));
		contato.setNome(rs.getString("nome"));
		contato.setEmail(rs.getString("email"));  
        contato.setEndereco(rs.getString("endereco"));  
        Calendar data = Calendar.getInstance();  
        data.setTime(rs.getDate("dataNascimento"));  
        contato.setDataNascimento(data);
        
        
    }
	rs.close();
	stmt.close();
	return contato;
	}catch(SQLException e ) {
		throw new RuntimeException(e);
	}
	
	
	
	
	
	
}

public void altera(Contato contato) {
	
	String sql= "update contatos set nome = ?, email = ?, endereco = ?, dataNascimento = ? where id = ?";
	
	try {
		PreparedStatement stmt = connection.prepareStatement(sql);
		
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setDate  (4, new Date(contato.getDataNascimento().getTimeInMillis()));
		stmt.setLong  (5, contato.getId());
		stmt.execute();
		stmt.close();
	}catch (SQLException e) {
		throw new RuntimeException(e);
	}
	

}

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

}

Não é o código, fera. É a configuração do projeto.
Está usando qual IDE?
Como está fazendo o deploy no tomcat?

Ah sim, desculpe!!!

Eclipse Java EE IDE for Web Developers.
Cara, eu fiz exatamente como o professor disse!!! Passo-a-passo no livro também!!!

Ele também acha que poderia ser a IDE, porque também tentou resolver

Se é um projeto web, você deve ter inserido o mysql-connector-xxxxx.jar dentro de webContent/WEB-INF/lib
Se não fez isso, ao exportar o jar, não vai ter o driver do mysql disponível e terá erro

Peraí meu companheiro, é só dentro do WEB-INF, ou tem que ser dentro da subpasta lib?

Dentro da subpasta lib.

Valeu meu amigo, Consegui resolver. Era isso mesmo. Desde Domingo, eu to tentando resolver isso para estudar, e não conseguia!!! Pior que todo mundo falou que era só a WEB-INF. Nâo tem como decorar todos esses detalhes, ainda mais que no livro, não tem todos esses detalhes!!!

Muito obrigado mesmo

De boas.
Qual livro está usando?
Bons estudos.

É o livro da Caelum mesmo, Caelum - Ensino e Inovação
Conhece algum bom para me indicar?
Obrigado

É o livro da Caelum mesmo, Caelum - Ensino e Inovação
Conhece algum bom para me indicar?
Obrigado!!!