[RESOLVIDO] Problemas com servlet e conexão jdbc

5 respostas
O

Boa noite colegas.
Estou fazendo alguns exercícios de conexão ao banco de dados através de servlets seguindo a orientação da apostila fj21 da caelum. Só que quando clico em gravar dá erro 500.

Fiz o seguinte:
1-Estou usando netbeans e copiei o driver mysql-connector 5.1.25 para uma pasta lib, no projeto adicionei o jar a biblioteca.
2-Na guia de serviços do projeto configurei conforme o tutorial [url]http://www.youtube.com/watch?v=ItklwiIo0GI[/url] só que para mysql.

Quando uso uma classe de teste com método main funciona normalmente só que quando preencho as informações para o formulário e mando para a servlet acontece o erro mencionado.

Minha servlet é uma classe que extende httpservlet:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.caelum.agenda.servlet;

import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author 18122012
 */
public class AdicionaContatoServlet extends HttpServlet {

    /**
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        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 da data");
        }

        Contato contato = new Contato();
        contato.setNome(nome);
        contato.setEndereco(endereco);
        contato.setEmail(email);
        contato.setDataNascimento(dataNascimento);

        ContatoDAO dao = new ContatoDAO();
        dao.adiciona(contato);

        out.println("<html>");
        out.println("<body>");
        out.println("Contato " + contato.getNome() + " adicionado com sucesso");
        out.println("</body>");
        out.println("</html>");
    }
}
Está representa a fábrica de conexões:
package br.com.caelum.jdbc;

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

public class ConnectionFactory {

    public Connection getConnection() {
        System.out.println("Conectando ao banco");
        try {
            System.out.println("Banco conectado");
            // jdbc:mysql://ip/nome_do_banco, nome_do_usu�rio, senha_do_usu�rio
            return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "root");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
Minha página com os formulários
<!--
To change this template, choose Tools | Templates
and open the template in the editor.
-->
<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <form action="adicionaContato">
            Nome: &lt;input type="text" name="nome"/&gt;<br>
            E-mail: &lt;input type="text" name="email"/&gt;<br>
            Endereço: &lt;input type="text" name="endereco"/&gt;<br>
            Data Nascimento: &lt;input type="text" name="dataNascimento"/&gt;<br>
            &lt;input type="submit" value="Gravar"/&gt;
        &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;
E as configurações do web.xml:
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;

&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee"
	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	 version="3.0"&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;AdicionaContato&lt;/servlet-name&gt;
        &lt;servlet-class&gt;br.com.caelum.agenda.servlet.AdicionaContatoServlet&lt;/servlet-class&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;AdicionaContato&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/adicionaContato&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;    
&lt;/web-app&gt;
O web.xml está idêntico ao exercício inclusive todos os diretórios O erro é o seguinte
HTTP Status 500 - java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21

type Exception report

message java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21

description The server encountered an internal error that prevented it from fulfilling this request.

exception

java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
	br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:16)
	br.com.caelum.jdbc.dao.ContatoDAO.&lt;init&gt;(ContatoDAO.java:20)
	br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:57)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

root cause

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
	java.sql.DriverManager.getConnection(DriverManager.java:596)
	java.sql.DriverManager.getConnection(DriverManager.java:215)
	br.com.caelum.jdbc.ConnectionFactory.getConnection(ConnectionFactory.java:14)
	br.com.caelum.jdbc.dao.ContatoDAO.&lt;init&gt;(ContatoDAO.java:20)
	br.com.caelum.agenda.servlet.AdicionaContatoServlet.service(AdicionaContatoServlet.java:57)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)

note The full stack trace of the root cause is available in the Apache Tomcat/7.0.34 logs.
Apache Tomcat/7.0.34

OBS: o banco jf21 está ativo no netbeans.
Não sei o que tentar afinal o erro foi do formulario que não chamou a servlet correta, a configuração do xml, a servlet que não pode ficar dentro de um diretório ou driver não encontrado o que não têm lógica se funciona com testes isolados.
Agradeço quem puder ajudar não sei mais o que fazer.

5 Respostas

N

Tente colocar o driver do MySQL dentro do diretório /WEB-INF/lib

O

O netbeans cria a pasta lib fora da pasta WEB-INF.
obs: Já adicionei na biblioteca estou vendo na guia de projeto o mysql-connector junto do jdk e do apache tomcat.

O
Obrigado norbAns mas acabei por encontrar a resposta nesse link [url]http://www.guj.com.br/java/261075-resolvido---tomcat--mysql---problema-com-integracao-no-suitable-driver-found[/url] Faltava uma linha de código:
package br.com.caelum.jdbc;

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

public class ConnectionFactory {

    public Connection getConnection() {
        System.out.println("Conectando ao banco");
        try {
            System.out.println("Banco conectado");
            DriverManager.registerDriver(new com.mysql.jdbc.Driver());
            return DriverManager.getConnection("jdbc:mysql://localhost/fj21", "root", "root");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
J

adiciona na classe conexão
class.forname( com.mysql.jdbc.driver ) para ele encontrar o driver.

Lembrando que esse comando nao é obrigatório, mas caso nao esteja encontrando o driver que deve está adicionado na class lib dentro do web-inf poderá ajudar encontrar.

O

Obrigado Jardel.ads substituir DriverManager.registerDriver(new com.mysql.jdbc.Driver()); por Class.forName(“com.mysql.jdbc.Driver”); também funciona.

Criado 14 de julho de 2013
Ultima resposta 14 de jul. de 2013
Respostas 5
Participantes 3