Trabalho desenvolvendo aplicações desktop, mas há muito sinto vontade de estudar desenvolvimento para web, e agora estou começando com isso.
Como porta de entrada, estou usando a apostila FJ21 da caelum (a agenda).
Cheguei na parte em que os dados sao inseridos no BD a partir de uma pagina HTMLe um servlet, mas quando dou submit, me aparece esse erro:
java.lang.RuntimeException: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
br.com.agenda.dao.ConnectionFactory.getConnection(ConnectionFactory.java:12)
br.com.agenda.dao.ContatoDAO.<init>(ContatoDAO.java:18)
br.com.agenda.servlets.AdicionaContatoServlet.service(AdicionaContatoServlet.java:42)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/fj21
java.sql.DriverManager.getConnection(DriverManager.java:640)
java.sql.DriverManager.getConnection(DriverManager.java:200)
br.com.agenda.dao.ConnectionFactory.getConnection(ConnectionFactory.java:10)
br.com.agenda.dao.ContatoDAO.<init>(ContatoDAO.java:18)
br.com.agenda.servlets.AdicionaContatoServlet.service(AdicionaContatoServlet.java:42)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
Ao que parece, driver do mysql nao tá sendo encontrado, mas ele está devidamente adicionado ao buildpath (dentro de WEB-INF/lib), tanto que quando rodo uma classe de teste, o acesso ao banco ocorre sem problemas.
Em outros tópicos vi que esse problema poderia ser resolvido colocando o conector no lib do próprio Tomcat, e foi o que fiz, mas o mesmo problema persiste.
Realmente, a exceção é esclarecedora, mas não vejo motivo de ela estar sendo lançada. Segundo tudo o que li e observei, ao adicionar um jar no WEB-INF/lib, este é automaticamente adicionado ao classpath(comprovado pelo fato de eu conseguir acesso sem o tomcat). Não funcionando, colocei dentro do diretório lib na raiz do tomcat (solução pra muitos), mas mesmo assim continuo com o problema.
Repetindo, quando executo uma classe de teste, a conexao com o banco ocorre sem problemas.
Para web não é necessário vc colocar o driver no class path como vc coloca em aplicações para desktop, coloque diretamente no lib dentro de web content WEB_INF.
Sete o driver em bloco static no início da classe:
[quote=espiaoweb2011]1) Para web não é necessário vc colocar o driver no class path como vc coloca em aplicações para desktop, coloque diretamente no lib dentro de web content WEB_INF.
2) Sete o driver em bloco static no início da classe:
Procure setar a porta do Mysql, pois ele pode estar startado em outra porta…
jdbc:mysql:3306//localhost/fj21
foi exatamente o que eu disse nos meus primeiro e segundo posts;
Segundo a apostila fj21, o .forName não é mais necessário a partir do java 5 ou 6 (não me lembro exatamente qual, e a apostila está em casa).
A configuração do tomcat está padrão (8080). De qualquer forma, vou explicitar a porta pra testar, quando for pra casa.
Só relembrando o que já disse nos posts anteriores, não sou programador experiente, mas tambem nao sou iniciante. Só estou começando com os conceitos de web agora, seguindo exatamente os exercicios da FJ21 (Exceto pelas versões). Tambem por isso nao entendo o motivo de não estar conseguindo acesso ao banco pelo tomcat.
Sei que é a intenção de todos ajudar, mas peço que procurem entender o problema antes de responder.
[quote=JhowTroMundo][quote=espiaoweb2011]1) Para web não é necessário vc colocar o driver no class path como vc coloca em aplicações para desktop, coloque diretamente no lib dentro de web content WEB_INF.
2) Sete o driver em bloco static no início da classe:
Procure setar a porta do Mysql, pois ele pode estar startado em outra porta…
jdbc:mysql:3306//localhost/fj21
foi exatamente o que eu disse nos meus primeiro e segundo posts;
Segundo a apostila fj21, o .forName não é mais necessário a partir do java 5 ou 6 (não me lembro exatamente qual, e a apostila está em casa).
A configuração do tomcat está padrão (8080). De qualquer forma, vou explicitar a porta pra testar, quando for pra casa.
Só relembrando o que já disse nos posts anteriores, não sou programador experiente, mas tambem nao sou iniciante. Só estou começando com os conceitos de web agora, seguindo exatamente os exercicios da FJ21 (Exceto pelas versões). Tambem por isso nao entendo o motivo de não estar conseguindo acesso ao banco pelo tomcat.
Sei que é a intenção de todos ajudar, mas peço que procurem entender o problema antes de responder.
Obrigado, galera.
[/quote]
A versão do java que não necessita do Class.forName é a 6.
Porém, o teu container pode não estar implementando a versão 6 do java de forma completa.
Aí, então, é preciso utilizar esta chamada…
Outro detalhe, acabei de testar, utilizando a versão 1.6 update 29 do java, uma conexão batch com o Oracle XE 10g e, sem o Class.forName, o erro foi o mesmo que está aparecendo para ti.
Colocando o bendito, sem erros.
[quote=drsmachado]Outro detalhe, acabei de testar, utilizando a versão 1.6 update 29 do java, uma conexão batch com o Oracle XE 10g e, sem o Class.forName, o erro foi o mesmo que está aparecendo para ti.
Colocando o bendito, sem erros.[/quote]
Se isso é verdade mesmo, entao a apostila tá furada e não dá pra confiar totalmente no que ela diz.
A versão do tomcat usada nos exemplos é a 5, e eu to usando a 7.
Bom, de qualquer forma, vou testar quando chegar em casa e posto o resultado depois.
Obrigado drsmachado e espiaoweb2011, que também deu a dica.
Reportando, o Class.ForName funcionou perfeitamente (Utilizei o bloco estatigo sugerido pelo espiaoweb2011) , contradizendo a afirmativa da apostila. O interessante é que só não funciona sem registrar o driver quando o Tomcat entra na jogada. Também nunca tive a necessidade de registrar, pois já comecei com java na versão 6. O importante agora é que posso prosseguir com os exercícios.
Agradeço pelas sugestões construtivas e pela paciência!
E pra reforçar: não é só vocês que tem esse problema. Acabei de chegar nessa parte e também tive que registrar o driver quando uso servlet.
Por que no projeto jdbc da fj21 não precisei registrar o driver, mas no servlet sim?