Por favor estou tentando através de uma servlet java chamar da classe ProdutoDao um método responsável por inserir os dados no banco de dados mySql porém
Quando utilizo uma classe main para instanciar uma
Classe produto inserindo no construtor os dados e chamando a classe ProdutoDao e metodo dao
Funciona muito bem os dados são inseridos com sucesso porem quando tento acessar de uma servlet ao dao apresenta erro que vem da classe responsavel pela conexão driver jdbc não entendo porque não funciona através de uma servelt e funciona sem a servlet
Servlet não chama método dao externo
29 Respostas
Posta o código da servlet pra gente ver como vc está fazendo.
segue a servelt que recebe uma requisição de uma jsp instanciando a classe Produto
que recebe como argumento descrição,quantidade,preço,online,
em seguida chama o método salvar() da classe Produto.
package projetocontroller;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import model.Produto;
/**
-
Servlet implementation class controll */ public class controll extends HttpServlet { private static final long serialVersionUID = 1L;
/**
-
@see HttpServlet#HttpServlet()
*/
public controll() {
super();
// TODO Auto-generated constructor stub
}
/**
-
@see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
-
@see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(“UTF-8”); response.setContentType(“text/html; charset=UTF-8”);
String descricao = request.getParameter(“decricao”); int quantidade = Integer.parseInt(request.getParameter(“quantidade”)); double preco = Double.parseDouble(request.getParameter(“preco”)); boolean online = false;
Produto produto =
new Produto(descricao,quantidade,preco,online);
produto.salvar();
}
-
@see HttpServlet#HttpServlet()
}
Segue a classe Produto
package model;
import projetoDao.ProdutoDao;
public class Produto {
private int idProduto;
private String descricao;
private Integer quantidade;
private Double preco;
private Boolean online;
public Produto() {}
public Produto(int IdProduto, String descricao, Integer quantidade, Double preco, boolean online ) {
this.idProduto = idProduto;
this.descricao = descricao;
this.quantidade = quantidade;
this.preco = preco;
this.online = online;
}
public Produto(String descricao, int quantidade, double preco,boolean online) {
this.descricao = descricao;
this.quantidade = quantidade;
this.preco = preco;
this.online = online;
}
public Integer getIdProduto() {
return idProduto;
}
public void setIdProduto(Integer idProduto) {
this.idProduto = idProduto;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
public int getQuantidade() {
return quantidade;
}
public void setQuantidade(Integer quantidade) {
this.quantidade = quantidade;
}
public double getPreco() {
return preco;
}
public void setPreco(Double preco) {
this.preco = preco;
}
public boolean isOnline() {
return online;
}
public void setOnline(Boolean online) {
this.online = online;
}
public void salvar(){
System.out.println("metodo chamado");
new ProdutoDao().cadastrarProduto(this);;
}
}
classe ProdutoDao
package projetoDao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import model.Produto;
public class ProdutoDao {
public void cadastrarProduto(Produto produto) {
String sql = "INSERT INTO PRODUTO VALUES(null,?,?,?,?)";
PreparedStatement pStatement = null;
Connection conn = null;
try {
conn = new MySqlConnection().getConnection();
pStatement = conn.prepareStatement(sql);
pStatement.setString(1, produto.getDescricao());
pStatement.setInt(2, produto.getQuantidade());
pStatement.setDouble(3, produto.getPreco());
pStatement.setBoolean(4, produto.isOnline());
pStatement.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(pStatement != null)
pStatement.close();
} catch (Exception e2) {
e2.printStackTrace();
}
try {
if(conn != null)
conn.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
Classe para conexão com banco
package projetoDao;
import java.sql.Connection;
import java.sql.DriverManager;
public class MySqlConnection {
public Connection getConnection() {
Connection conn = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
System.out.println("Erro no driver");
e.printStackTrace();
}
try {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/banana","root","2525");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
}
Está capturando Exception ```
catch (Exception e) {
System.out.println(“Erro no driver”);
e.printStackTrace();
metodo chamado
Erro no driver
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1353)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1165)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:375)
at projetoDao.MySqlConnection.getConnection(MySqlConnection.java:13)
at projetoDao.ProdutoDao.cadastrarProduto(ProdutoDao.java:18)
at model.Produto.salvar(Produto.java:70)
at projetocontroller.controll.doPost(controll.java:46)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590)
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:340)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:840)
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/banana
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:706)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:229)
at projetoDao.MySqlConnection.getConnection(MySqlConnection.java:21)
at projetoDao.ProdutoDao.cadastrarProduto(ProdutoDao.java:18)
at model.Produto.salvar(Produto.java:70)
at projetocontroller.controll.doPost(controll.java:46)
Quando cria um objeto Produto na Classe Main Programa principal
e atribuo os dados nos construtor da classe Produto e chamo o método salvar()
funciona muito bem mas quando esse metodo é chamado da servlet apresenta Erro.
O driver do MySQL não está no classpath da sua aplicação WEB.
Adicionei o driver mysql-connector-j-8.1.0.jar no build path tentei mudar o driver por outros anteriores mas não funcionou
Tem certeza de que esse JAR está na pasta WEB-INF/lib da sua aplicação web?
Não esta na pasta WEB-INF lib
Ele esta no projeto uma pasta Referenced Libraries
tenta colocar na pasta WEB-INF/lib e veja se funciona.
Como que Posso colocar o driver na pasta lib?
Copia o arquivo jar para a pasta WEB-INF/lib, vc consegue fazer pela IDE ou pelo navegador de pastas do sistema msm.
Não deu certo, vou criar o mesmo aplicativo mas em uma maquina virtual com outro S.O pra ve se roda
Posta a estrutura de pastas da sua aplicação web.
Se o driver não estiver no classpath da aplicação, vai continuar falhando, não tem nada a ver com o sistema operacional.
Quando testo o Objeto Produto fora da servlet por exemplo em uma classe Main funciona perfeitamente
Produto produto = new Produto(‘String’ ,1,1.0,false);
produto.salvar();
Dados foram inseridos no banco de dados
É porque daí você está executando um simples programa, aí ele vai pegar o classpath do seu eclipse.
Uma aplicação Web é diferente.
Você criou uma estrutura de pastas dentro do seu projeto no eclipse, inclusive a pasta lib tá vazia.
Como está essa estrutura de pastas no seu TomCat quando você sobe a aplicação?
Muito obrigado consegui, tentei adicionar o connector na pasta lib no projeto mas não conseguir copiar o arquivo e colar para o lib no projeto, então copiei o connector-j-8.1.0.jar e colei Direto na pasta lib do tomcat ai sim funcionou
Obrigado pessoal
Tá vendo que no seu “Referenced libraries” o seu JAR está em alguma pasta do seu computador?
Eu recomendo copiar esse JAR para a pasta WEB-INF\lib do seu próprio projeto e daí ajustar o “Referenced libraries” pra apontar pra ela
Entendi, ao adionar o connector ao Classpath do projeto
ele não deveria automaticamente redirecionar para o lib
o arquivo ou não, toda vez que criar um projeto jsp tem que fazer essa configuração?
e se no caso for utilizar um outro connector devo também colar ele na lib do tomcat certo.
Não sei te dizer, faz tempo que não faço projetos JSP
Não sei se o eclipse tem plugins melhorados pra isso
Vc pode começar a criar projetos usando um gerenciador de dependências, como o maven, por exemplo. Assim não terá mais esse tipo de problema, sem falar que eh um padrão de mercado.
Concluí em 2023 curso superior de tecnólogo análise e desenvolvimento de sistemas estou perdido sem saber direito o que implementar e o que praticar então estou pesquisando alguns projeto pela internet e estudando não sei se e o certo ou devo realizar alguns cursos mais específicos em desenvolvimento se alguém tiver por favor alguma opinião no que devo focar primeiro agradeço muito estou estudando modelagens em bancos de dados e aplicação java e frameworks
No meu ponto de vista, acho válido estudar servlets como vc está fazendo, mas recomendo que faça isso apenas para entender seu funcionamento, como por exemplo criar um projeto simples como um todo-list para ter uma ideia geral de como funciona, podendo até utilizar um banco de dados para armazenar os itens.
Tutorial: Building an Effective Todo List with Servlet: A Step-by-Step Guide | by Codes With Pankaj | Medium
Após isso, veja se entendeu a ideia por trás das requisições feitas ao servlet e como funciona a integração com o banco e tente experimentar colocar mais coisas no projeto.
Em seguida vc pode pensar em praticar algo mais comum no mercado como spring, por exemplo.
Entendi, Obrigado
